安全网络


Red Hat Enterprise Linux 10

配置安全网络和网络通信

Red Hat Customer Content Services

摘要

了解工具和技术以提高网络安全性,并降低数据泄露和入侵的风险。

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 在顶部导航栏中点 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

SSH(Secure Shell)是一种协议,它使用客户端-服务器架构在两个系统之间提供安全通信,并允许用户远程登录到服务器主机系统。与其他远程通信协议(如 FTP 或 Telnet )不同,SSH 会加密登录会话,这可防止入侵者从连接中收集未加密的密码。

1.1. SSH 和 OpenSSH

SSH(安全 Shell)是一个登录远程机器并在该机器上执行命令的程序。SSH 协议通过不安全的网络在两个不可信主机间提供安全加密的通讯。您还可以通过安全频道转发 X11 连接和任意 TCP/IP 端口。

当使用 SSH 协议进行远程 shell 登录或文件复制时,SSH 协议可以缓解威胁,例如,拦截两个系统之间的通信和模拟特定主机。这是因为 SSH 客户端和服务器使用数字签名来验证其身份。另外,所有客户端和服务器系统之间的沟通都是加密的。

主机密钥验证使用 SSH 协议的主机。当 OpenSSH 首次启动或当主机首次引导时,主机密钥是自动生成的加密密钥。

OpenSSH 是 Linux、UNIX 和类似操作系统支持的 SSH 协议的实现。它包括 OpenSSH 客户端和服务器需要的核心文件。OpenSSH 组件由以下用户空间工具组成:

  • ssh 是一个远程登录程序(SSH 客户端).
  • sshd 是一个 OpenSSH SSH 守护进程。
  • scp 是一个安全的远程文件复制程序。
  • sftp 是一个安全的文件传输程序。
  • ssh-agent 是用于缓存私钥的身份验证代理。
  • ssh-addssh-agent添加私钥身份。
  • ssh-keygen 生成、管理并转换 ssh 验证密钥。
  • ssh-copy-id 是一个将本地公钥添加到远程 SSH 服务器上的 authorized_keys 文件中的脚本。
  • ssh-keyscan 可以收集 SSH 公共主机密钥。
注意

在 RHEL 9 及更新版本中,安全复制协议(SCP)默认被替换为 SSH 文件传输协议(SFTP)。这是因为 SCP 已经造成安全问题,如 CVE-2020-15778

如果在您的场景中 SFTP 不可用或不兼容,您可以使用 scp 命令和 -O 选项强制使用原始的 SCP/RCP 协议。

如需更多信息,请参阅 OpenSSH SCP 协议在 Red Hat Enterprise Linux 9 已弃用 文章。

RHEL 中的 OpenSSH 套件仅支持 SSH 版本 2。它有一个增强的密钥交换算法,其不会受到旧版本 1 中已知漏洞的攻击。

Red Hat Enterprise Linux 包括以下 OpenSSH 软件包:常规 openssh 软件包、openssh-server 软件包和 openssh-clients 软件包。OpenSSH 软件包需要 OpenSSL 软件包 openssl-libs,它会安装几个重要的使 OpenSSH 可以提供加密通信的加密库。

OpenSSH 作为 RHEL 的核心加密子系统之一,使用系统范围的加密策略。这样可确保在默认配置中禁用弱密码套件和加密算法。要修改策略,管理员必须使用 update-crypto-policies 命令来调整设置,或者手动选择不使用系统范围的加密策略。如需更多信息,请参阅 从以下系统范围的加密策略中排除一个应用程序 部分。

OpenSSH 套件使用两组配置文件:一个用于客户端程序(即 sshscpsftp),另一个用于服务器( sshd 守护进程)。

系统范围的 SSH 配置信息保存在 /etc/ssh/ 目录中。/etc/ssh/ssh_config 文件包含客户端配置,/etc/ssh/sshd_config 文件是默认的 OpenSSH 服务器配置文件。

用户特定的 SSH 配置信息保存在用户主目录中的 ~/.ssh/ 中。有关 OpenSSH 配置文件的详细的列表,请查看您系统上 sshd (8) 手册页中的 FILES 部分。

1.2. 生成 SSH 密钥对

您可以使用在本地系统上生成的 SSH 密钥对,并将生成的公钥复制到 OpenSSH 服务器来在不输入密码的情况下登录到 OpenSSH 服务器。每个要创建密钥的用户都必须运行此流程。

要在重新安装系统后保留之前生成的密钥对,请在创建新密钥前备份 ~/.ssh/ 目录。重新安装后,将其复制到主目录中。您可以为系统中的所有用户(包括 root 用户)进行此操作。

先决条件

  • 您已经以希望使用密钥连接到 OpenSSH 服务器的用户的身份登录了。
  • OpenSSH 服务器被配置为允许基于密钥的身份验证。

流程

  1. 生成一个 ECDSA 密钥对:

    $ ssh-keygen -t ecdsa
    Generating public/private ecdsa key pair.
    Enter file in which to save the key (/home/<username>/.ssh/id_ecdsa):
    Enter passphrase (empty for no passphrase): <password>
    Enter same passphrase again: <password>
    Your identification has been saved in /home/<username>/.ssh/id_ecdsa.
    Your public key has been saved in /home/<username>/.ssh/id_ecdsa.pub.
    The key fingerprint is:
    SHA256:Q/x+qms4j7PCQ0qFd09iZEFHA+SqwBKRNaU72oZfaCI <username>@<localhost.example.com>
    The key's randomart image is:
    +---[ECDSA 256]---+
    |.oo..o=++        |
    |.. o .oo .       |
    |. .. o. o        |
    |....o.+...       |
    |o.oo.o +S .      |
    |.=.+.   .o       |
    |E.*+.  .  . .    |
    |.=..+ +..  o     |
    |  .  oo*+o.      |
    +----[SHA256]-----+
    Copy to Clipboard Toggle word wrap

    您还可以使用没有任何参数的 ssh-keygen 命令生成一个 RSA 密钥对,或通过输入 ssh-keygen -t ed25519 命令生成一个 Ed25519 密钥对。请注意,Ed25519 算法不符合 FIPS-140,OpenSSH 在 FIPS 模式下无法使用 Ed25519 密钥。

  2. 将公钥复制到远程机器上:

    $ ssh-copy-id <username>@<ssh-server-example.com>
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    <username>@<ssh-server-example.com>'s password:
    …
    Number of key(s) added: 1
    
    Now try logging into the machine, with: "ssh '<username>@<ssh-server-example.com>'" and check to make sure that only the key(s) you wanted were added.
    Copy to Clipboard Toggle word wrap

    <username>@<ssh-server-example.com> 替换为您的凭证。

    如果您没有在会话中使用 ssh-agent 程序,上一个命令会复制最新修改的 ~/.ssh/id*.pub 公钥。要指定另一个公钥文件,或在 ssh-agent 内存中缓存的密钥优先选择文件中的密钥,使用带有 -i 选项的 ssh-copy-id 命令。

验证

  1. 使用密钥文件登录到 OpenSSH 服务器:

    $ ssh -o PreferredAuthentications=publickey <username>@<ssh-server-example.com>
    Copy to Clipboard Toggle word wrap

要提高系统安全性,通过在 OpenSSH 服务器上禁用密码身份验证来强制进行基于密钥的身份验证。

先决条件

  • 已安装 openssh-server 软件包。
  • sshd 守护进程正在服务器中运行。
  • 您已使用密钥连接到 OpenSSH 服务器。

    详情请参阅 生成 SSH 密钥对 部分。

流程

  1. 在文本编辑器中打开 /etc/ssh/sshd_config 配置,例如:

    # vi /etc/ssh/sshd_config
    Copy to Clipboard Toggle word wrap
  2. PasswordAuthentication 选项改为 no:

    PasswordAuthentication no
    Copy to Clipboard Toggle word wrap
  3. 在不是新默认安装的系统上,检查是否设置了 PubkeyAuthentication 参数,或是否设置为 yes
  4. KbdInteractiveAuthentication 指令设置为 no

    请注意,相应的条目在配置文件中已被注释掉,默认值为 yes

  5. 要在 NFS 挂载的主目录中使用基于密钥的验证,启用 use_nfs_home_dirs SELinux 布尔值:

    # setsebool -P use_nfs_home_dirs 1
    Copy to Clipboard Toggle word wrap
  6. 如果您要进行远程连接,而不使用控制台或带外访问,在禁用密码验证前测试基于密钥的登录过程。
  7. 重新载入 sshd 守护进程以应用更改:

    # systemctl reload sshd
    Copy to Clipboard Toggle word wrap

您可以在智能卡上创建并存储 ECDSA 和 RSA 密钥,并通过 OpenSSH 客户端上的智能卡进行身份验证。智能卡验证替换了默认密码验证。

先决条件

  • 在客户端中安装了 opensc 软件包,pcscd 服务正在运行。

流程

  1. 列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到 key.pub 文件:

    $ ssh-keygen -D pkcs11: > keys.pub
    Copy to Clipboard Toggle word wrap
  2. 将公钥传送到远程服务器。使用ssh-copy-id 命令和上一步中创建的 keys.pub 文件:

    $ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
    Copy to Clipboard Toggle word wrap
  3. 使用 ECDSA 密钥连接到 <ssh-server-example.com>。您可以只使用 URI 的子集,它唯一引用您的密钥,例如:

    $ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com>
    Enter PIN for 'SSH key':
    [ssh-server-example.com] $
    Copy to Clipboard Toggle word wrap

    因为 OpenSSH 使用 p11-kit-proxy 包装器,且 OpenSC PKCS #11 模块已注册到 p11-kit 工具,因此您可以简化上一个命令:

    $ ssh -i "pkcs11:id=%01" <ssh-server-example.com>
    Enter PIN for 'SSH key':
    [ssh-server-example.com] $
    Copy to Clipboard Toggle word wrap

    如果您跳过 PKCS #11 URI 的 id= 部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:

    $ ssh -i pkcs11: <ssh-server-example.com>
    Enter PIN for 'SSH key':
    [ssh-server-example.com] $
    Copy to Clipboard Toggle word wrap
  4. 可选:您可以在 ~/.ssh/config 文件中使用同样的 URI 字符串来使配置持久:

    $ cat ~/.ssh/config
    IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so"
    $ ssh <ssh-server-example.com>
    Enter PIN for 'SSH key':
    [ssh-server-example.com] $
    Copy to Clipboard Toggle word wrap

    ssh 客户端工具现在自动使用此 URI 和智能卡中的密钥。

1.5. 使 OpenSSH 更安全

在使用 OpenSSH 时,您可以调整系统以提高安全性。

请注意,/etc/ssh/sshd_config OpenSSH 服务器配置文件中的更改需要重新载入 sshd 守护进程才能生效:

# systemctl reload sshd
Copy to Clipboard Toggle word wrap
警告

大多数安全强化配置更改会降低与不支持最新算法或密码套件的客户端的兼容性。

禁用不安全的连接协议
要使 SSH 生效,防止使用由 OpenSSH 套件替代的不安全连接协议。否则,用户的密码可能只会在一个会话中被 SSH 保护,可能会在以后使用 Telnet 登录时被捕获。
禁用基于密码的身份验证
禁用密码进行身份验证,并只允许密钥,以减少攻击面。如需更多信息,请参阅 将基于密钥的身份验证设置为 OpenSSH 服务器上的唯一方法 部分。
更强大的密钥类型

虽然 ssh-keygen 命令默认生成一对 RSA 密钥,但您可以使用 -t 选项指示它生成 Elliptic Curve Digital Signature Algorithm (ECDSA)或 Edwards-Curve 25519 (Ed25519)密钥。同等对称密钥强度下,ECDSA 提供了比 RSA 更好的性能。它还会生成较短的密钥。Ed25519 公钥算法是 一种变形的 Edwards 曲线的实现,其比 RSA、DSA 和 ECDSA 更安全,也更快。

如果没有这些密钥,OpenSSH 会自动创建 RSA、ECDSA 和 Ed25519 服务器主机密钥。要在 RHEL 中配置主机密钥创建,请使用 sshd-keygen@.service 实例化服务。例如,禁用自动创建 RSA 密钥类型:

# systemctl mask sshd-keygen@rsa.service
# rm -f /etc/ssh/ssh_host_rsa_key*
# systemctl restart sshd
Copy to Clipboard Toggle word wrap
注意

在启用了 cloud-init 方法的镜像中,ssh-keygen 单元被自动禁用。这是因为 ssh-keygen template 服务可能会干扰 cloud-init 工具,导致主机密钥生成出现问题。要防止这些问题,etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf 置入配置文件禁用了 ssh-keygen 单元(如果 cloud-init 正在运行)。

要只允许特定的密钥类型用于 SSH 连接,请删除 /etc/ssh/sshd_config 中相关行开头的注释,并重新加载 sshd 服务。例如,要只允许 Ed25519 主机密钥,则相应的行必须如下所示:

# HostKey /etc/ssh/ssh_host_rsa_key
# HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
Copy to Clipboard Toggle word wrap
重要

Ed25519 算法与 FIPS-140 不兼容,OpenSSH 在 FIPS 模式下无法与 Ed25519 密钥一起工作。

非默认端口

默认情况下,sshd 守护进程侦听 TCP 端口 22。更改端口可降低系统暴露给基于自动网络扫描的攻击,从而通过隐蔽性提高了安全性。您可以使用 /etc/ssh/sshd_config 配置文件中的 Port 指令指定端口。

您还必须更新默认 SELinux 策略以允许使用非默认端口。要做到这一点,使用 policycoreutils-python-utils 软件包中的 semanage 工具:

# semanage port -a -t ssh_port_t -p tcp <port_number>
Copy to Clipboard Toggle word wrap

另外,更新 firewalld 配置:

# firewall-cmd --add-port <port_number>/tcp
# firewall-cmd --remove-port=22/tcp
# firewall-cmd --runtime-to-permanent
Copy to Clipboard Toggle word wrap

在前面的命令中,将 <port_number> 替换为使用 Port 指令指定的新端口号。

root 登录

默认情况下,PermitRootLogin 设置为 prohibit-password。这强制使用基于密钥的身份验证,而不是使用密码以 root 身份登录,并通过防止暴力攻击来降低风险。

警告

以 root 用户身份登录并不是一个安全的做法,因为管理员无法审核运行哪个特权命令。要使用管理命令,请登录并使用 sudo

使用 X 安全性扩展

Red Hat Enterprise Linux 客户端中的 X 服务器不提供 X 安全性扩展。因此,当连接到带有 X11 转发的不可信 SSH 服务器时,客户端无法请求另一个安全层。大多数应用程序都无法在启用此扩展时运行。

默认情况下,/etc/ssh/ssh_config.d/50-redhat.conf 文件中的 ForwardX11Trusted 选项被设置为 yesssh -X remote_machine(不信任的主机)和 ssh -Y remote_machine (信任的主机)命令之间没有区别。

如果您的场景根本不需要 X11 转发功能,请将 /etc/ssh/sshd_config 配置文件中的 X11Forwarding 指令设置为 no

限制 SSH 对特定用户、组或 IP 范围的访问

/etc/ssh/sshd_config 配置文件服务器中的 AllowUsersAllowGroups 指令可让您只允许某些用户、域或组连接到您的 OpenSSH 服务器。您可以组合 AllowUsersAllow Groups 来更准确地限制访问,例如:

AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2
AllowGroups example-group
Copy to Clipboard Toggle word wrap

此配置只在所有以下条件都满足时才允许连接:

  • 连接的源 IP 在 192.168.1.0/24 或 10.0.0.0/24 子网中。
  • 源 IP 不是 192.168.1.2。
  • 用户是 example-group 组的成员。

OpenSSH 服务器仅允许 /etc/ssh/sshd_config 中通过所有 Allow 和 Deny 指令的连接。例如,如果 AllowUsers 指令列出的用户不是 AllowGroups 指令中列出的组的一部分,则用户无法登录。

请注意,使用允许列表(以 Allow 开头的指令)比使用阻止列表(以 Deny 开始的选项)更安全,因为允许列表也会阻止新的未授权的用户或组。

更改系统范围的加密策略

OpenSSH 使用 RHEL 系统范围的加密策略,默认的系统范围的加密策略级别为当前威胁模型提供了安全设置。要使您的加密设置更严格,请更改当前的策略级别:

# update-crypto-policies --set FUTURE
Setting system policy to FUTURE
Copy to Clipboard Toggle word wrap
警告

如果您的系统与旧系统进行通信,您可能会由于严格的 FUTURE 策略的设置而遇到互操作性问题。

您还可以通过系统范围的加密策略只为 SSH 协议禁用特定的密码。如需更多信息,请参阅 安全强化 文档中的 使用子策略自定义系统范围加密策略 部分。

选择不使用系统范围的加密策略

要为您的 OpenSSH 服务器选择不使用系统范围的加密策略,请在位于 /etc/ssh/sshd_config.d/ 目录中的置入配置文件中指定前缀为小于 50 的两位数的加密策略,以便它在字典中位于 50-redhat.conf 文件之前,并具有 .conf 后缀,例如 49-crypto-policy-override.conf

详情请查看 sshd_config(5) 手册页。

要为您的 OpenSSH 客户端选择不使用系统范围的加密策略,请执行以下任务之一:

  • 对于给定的用户,使用 ~/.ssh/config 文件中特定于用户的配置覆盖全局 ssh_config
  • 对于整个系统,在 /etc/ssh/ssh_config.d/ 目录中的置入配置文件中指定前缀为小于 50 的两位数的加密策略,以便它在字典中位于 50-redhat.conf 文件之前,并具有 .conf 后缀,例如 49-crypto-policy-override.conf

1.6. 通过 SSH 跳板机连接到远程服务器

您可以通过中间服务器(也称为跳板机)从本地系统连接到远程服务器。跳板服务器连接来自不同安全区域的主机,并可以管理多个客户端-服务器连接。

先决条件

  • 跳过主机接受来自本地系统的 SSH 连接。
  • 远程服务器接受来自跳板机的 SSH 连接。

流程

  1. 如果您一次通过跳板服务器或多个中间服务器进行连接,请使用 ssh -J 命令,并直接指定跳板服务器,例如:

    $ ssh -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>
    Copy to Clipboard Toggle word wrap

    如果跳板服务器上的用户名或 SSH 端口与远程服务器上的用户名和端口不同,请只修改上一命令中的主机名表示法,例如:

    $ ssh -J <example.user.1>@<jump-1.example.com>:<75>,<example.user.2>@<jump-2.example.com>:<75>,<example.user.3>@<jump-3.example.com>:<75> <example.user.f>@<target-server-1.example.com>:<220>
    Copy to Clipboard Toggle word wrap
  2. 如果您定期通过跳板服务器连接到远程服务器,请在 SSH 配置文件中存储 jump-server 配置:

    1. 通过编辑本地系统中的 ~/.ssh/config 文件来定义跳板主机,例如:

      Host <jump-server-1>
        HostName <jump-1.example.com>
      Copy to Clipboard Toggle word wrap
      • Host 参数定义您可以在 ssh 命令中使用的主机的名称或别名。该值可以匹配真实的主机名,但也可以是任意字符串。
      • HostName 参数设置跳过主机的实际主机名或 IP 地址。
    2. 使用 ProxyJump 指令将远程服务器跳板配置添加到本地系统上的 ~/.ssh/config 文件中,例如:

      Host <remote-server-1>
        HostName <target-server-1.example.com>
        ProxyJump <jump-server-1>
      Copy to Clipboard Toggle word wrap
    3. 使用您的本地系统通过跳过服务器连接到远程服务器:

      $ ssh <remote-server-1>
      Copy to Clipboard Toggle word wrap

      如果省略之前的配置步骤,此命令等同于 ssh -J jump-server1 remote-server 命令。

您可以使用 sshd RHEL 系统角色配置 OpenSSH 服务器,使用 ssh RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。对于需要安全远程交互的任何系统,此类配置是必需的,例如:

  • 远程系统管理:使用 SSH 客户端安全地从另一台计算机连接到您的机器。
  • 安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP)可让您在本地机器和远程系统之间安全地传输文件。
  • 自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
  • 隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
  • 基于密钥的身份验证:对基于密码登录的更加安全的替代。
  • 基于证书的验证:集中信任管理和更好的可扩展性。
  • 增强了安全性:禁用 root 登录、限制用户访问、强制强加密和其他此类强化,确保更强的系统安全性。

sshd RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config 文件。

在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

sshd_ListenAddress:
  - 0.0.0.0
  - '::'
Copy to Clipboard Toggle word wrap

呈现为:

ListenAddress 0.0.0.0
ListenAddress ::
Copy to Clipboard Toggle word wrap

您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:

  • 管理来自远程客户端的传入 SSH 连接
  • 凭证验证
  • 保护数据传输和命令执行
注意

您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9 及更新版本)。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: SSH server configuration
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure sshd to prevent root and password login except from particular subnet
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sshd
          vars:
            sshd_config:
              PermitRootLogin: no
              PasswordAuthentication: no
              Match:
                - Condition: "Address 192.0.2.0/24"
                  PermitRootLogin: yes
                  PasswordAuthentication: yes
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    PasswordAuthentication: yes|no
    控制 OpenSSH 服务器(sshd)是否接受来自使用用户名和密码组合的客户端的身份验证。
    Match:
    match 块只允许来自子网 192.0.2.0/24 使用密码的 root 用户登录。

    有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 登录到 SSH 服务器:

    $ ssh <username>@<ssh_server>
    Copy to Clipboard Toggle word wrap
  2. 验证 SSH 服务器上 sshd_config 文件的内容:

    $ cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf
    #
    # Ansible managed
    #
    PasswordAuthentication no
    PermitRootLogin no
    Match Address 192.0.2.0/24
      PasswordAuthentication yes
      PermitRootLogin yes
    Copy to Clipboard Toggle word wrap
  3. 检查您是否可以以 root 用户身份从 192.0.2.0/24 子网连接到服务器:

    1. 确定您的 IP 地址:

      $ hostname -I
      192.0.2.1
      Copy to Clipboard Toggle word wrap

      如果 IP 地址在 192.0.2.1 - 192.0.2.254 范围内,您可以连接到服务器。

    2. root 用户身份连接到服务器:

      $ ssh root@<ssh_server>
      Copy to Clipboard Toggle word wrap

1.7.3. 对非独占配置使用 sshd RHEL 系统角色

默认情况下,应用 sshd RHEL 系统角色会覆盖整个配置。如果您之前调整了配置,例如使用不同的 RHEL 系统角色或 playbook,则这可能会出现问题。要只对所选配置选项应用 sshd RHEL 系统角色,同时保留其他选项,您可以使用非独占配置。

您可以应用非独占配置:

  • 在 RHEL 8 及更早版本中使用配置片段。
  • 在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为 /etc/ssh/sshd_config.d/00-ansible_system_role.conf

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    • 对于运行 RHEL 8 或更早版本的受管节点:

      ---
      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure SSHD to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_namespace: <my_application>
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
      Copy to Clipboard Toggle word wrap
    • 对于运行 RHEL 9 或更高版本的受管节点:

      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure sshd to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_file: /etc/ssh/sshd_config.d/<42-my_application>.conf
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
      Copy to Clipboard Toggle word wrap

      示例 playbook 中指定的设置包括以下内容:

      sshd_config_namespace: <my_application>
      角色将您在 playbook 中指定的配置放在给定命名空间下的现有配置文件中的配置片段中。当从不同上下文运行角色时,您需要选择一个不同的命名空间。
      sshd_config_file: /etc/ssh/sshd_config.d/<42-my_application>.conf
      sshd_config_file 变量中,定义 sshd 系统角色将配置选项写入其中的 .conf 文件。使用两位前缀,例如 42- 来指定应用配置文件的顺序。
      AcceptEnv:

      控制 OpenSSH 服务器(sshd)将接受来自客户端的哪些环境变量:

      • LANG :定义语言和区域设置。
      • LS_COLORS :定义终端中 ls 命令的显示颜色方案。
      • EDITOR: 指定需要打开编辑器的命令行程序的默认文本编辑器。

      有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 验证 SSH 服务器上的配置:

    • 对于运行 RHEL 8 或更早版本的受管节点:

      # cat /etc/ssh/sshd_config
      ...
      # BEGIN sshd system role managed block: namespace <my_application>
      Match all
        AcceptEnv LANG LS_COLORS EDITOR
      # END sshd system role managed block: namespace <my_application>
      Copy to Clipboard Toggle word wrap
    • 对于运行 RHEL 9 或更高版本的受管节点:

      # cat /etc/ssh/sshd_config.d/42-my_application.conf
      # Ansible managed
      #
      AcceptEnv LANG LS_COLORS EDITOR
      Copy to Clipboard Toggle word wrap

当默认加密设置不符合某些安全或兼容性需求时,您可能需要使用 sshd RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围加密策略。特别是在以下值得注意的情况:

  • 与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
  • 强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
  • 性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
  • 针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
警告

sshd RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA-1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Deploy SSH configuration for OpenSSH server
      hosts: managed-node-01.example.com
      tasks:
        - name: Overriding the system-wide cryptographic policy
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sshd
          vars:
            sshd_sysconfig: true
            sshd_sysconfig_override_crypto_policy: true
            sshd_KexAlgorithms: ecdh-sha2-nistp521
            sshd_Ciphers: aes256-ctr
            sshd_MACs: hmac-sha2-512-etm@openssh.com
            sshd_HostKeyAlgorithms: rsa-sha2-512,rsa-sha2-256
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    sshd_KexAlgorithms
    您可以选择密钥交换算法,例如 ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1diffie-hellman-group-exchange-sha256
    sshd_Ciphers
    您可以选择密码,例如 aes128-ctres192-ctraes256-ctr
    sshd_MACs
    您可以选择 MAC,例如 hmac-sha2-256hmac-sha2-512hmac-sha1
    sshd_HostKeyAlgorithms
    您可以选择一个公钥算法,如 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521ssh-rsa

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件。

    注意

    在 RHEL 9 受管节点上,系统角色会将配置写入到 /etc/ssh/sshd_config.d/00-ansible_system_role.conf 文件中,其中加密选项会被自动应用。您可以使用 sshd_config_file 变量更改文件。但是,为了确保配置有效,请使用一个按字典顺序位于 /etc/ssh/sshd_config.d/50-redhat.conf 文件之前的文件名,其中包括配置的加密策略。

    在 RHEL 8 受管节点上,您必须通过将 sshd_sysconfig_override_crypto_policysshd_sysconfig 变量设置为 true 来启用覆盖。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:

    $ ssh -vvv <ssh_server>
    ...
    debug2: peer server KEXINIT proposal
    debug2: KEX algorithms: ecdh-sha2-nistp521
    debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256
    debug2: ciphers ctos: aes256-ctr
    debug2: ciphers stoc: aes256-ctr
    debug2: MACs ctos: hmac-sha2-512-etm@openssh.com
    debug2: MACs stoc: hmac-sha2-512-etm@openssh.com
    ...
    Copy to Clipboard Toggle word wrap

ssh RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config 文件。

在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

LocalForward:
  - 22 localhost:2222
  - 403 localhost:4003
Copy to Clipboard Toggle word wrap

呈现为:

LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
Copy to Clipboard Toggle word wrap
注意

配置选项区分大小写。

1.7.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端

您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:

  • 安全连接启动
  • 凭证置备
  • 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
  • 能够安全地向和从 OpenSSH 服务器发送文件
注意

您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: SSH client configuration
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure ssh clients
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ssh
          vars:
            ssh_user: root
            ssh:
              Compression: true
              GSSAPIAuthentication: no
              ControlMaster: auto
              ControlPath: ~/.ssh/.cm%C
              Host:
                - Condition: example
                  Hostname: server.example.com
                  User: user1
            ssh_ForwardX11: no
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    ssh_user: root
    使用特定配置在受管节点上配置 root 用户的 SSH 客户端首选项。
    Compression: true
    压缩被启用。
    ControlMaster: auto
    ControlMaster 多路复用设置为 auto
    Host
    创建别名 example,来以名为 user1 的用户身份连接到 server.example.com 主机。
    ssh_ForwardX11: no
    X11 转发被禁用。

    有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ssh/README.md 文件和 ssh_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 通过显示 SSH 配置文件来验证受管节点是否有正确的配置:

    # cat ~/root/.ssh/config
    # Ansible managed
    Compression yes
    ControlMaster auto
    ControlPath ~/.ssh/.cm%C
    ForwardX11 no
    GSSAPIAuthentication no
    Host example
      Hostname example.com
      User user1
    Copy to Clipboard Toggle word wrap

第 2 章 创建并管理 TLS 密钥和证书

您可以使用 TLS (传输层安全)协议加密在两个系统间传输的通信。此标准将非对称加密与私钥和公钥、数字签名和证书一起使用。

2.1. TLS 证书

TLS (传输层安全)是一种协议,它允许客户端-服务器应用程序安全地传递信息。TLS 使用公钥和私钥对系统来加密在客户端和服务器间传输的通信。TLS 是到 SSL (安全套接字层)的后继协议。

TLS 使用 X.509 证书将主机名或机构等身份绑定到使用数字签名的公共密钥。X.509 是一个定义公钥证书格式的标准。

安全应用程序的身份验证取决于应用证书中公钥值的完整性。如果攻击者用自己的公钥替换了公钥,则它可以模拟真正的应用程序,并获得对安全数据的访问权限。为防止此类攻击,所有证书都必须由证书颁发机构(CA)签名。CA 是一个可信节点,用于确认证书中公钥值的完整性。

CA 通过添加公钥签名并发布证书来签署公钥。数字签名是用 CA 的私钥编码的一条消息。通过分发 CA 的证书,CA 的公钥可供应用程序使用。应用程序使用 CA 的公钥解码 CA 的数字签名来验证证书是否为有效签名。

要让证书由 CA 签名,您必须生成一个公钥,并将其发送给 CA 进行签名。这称为证书签名请求(CSR)。CSR 也包含证书的可分辨名称(DN)。您可以为任一证书提供的 DN 信息可以包括您所在国家的两字母国家代码、州或省、城市或乡镇的全名,您机构的名称、电子邮件地址,也可以为空。许多当前商业 CA 首选 Subject Alternative Name 扩展,并在 CSR 中忽略 DN。

RHEL 为使用 TLS 证书提供了两个主要工具包:GnuTLS 和 OpenSSL。您可以使用 openssl 软件包中的 openssl 工具创建、读取、签名和验证证书。gnutls-utils 软件包提供的 certtool 工具可以使用不同的语法以及后端中的所有不同库的集合执行相同的操作。

2.2. 使用 OpenSSL 创建一个私有 CA

当您的情况需要在您的内部网络内验证实体时,私有证书颁发机构(CA)非常有用。例如,当使用基于您控制下的 CA 签名的证书的身份验证创建 VPN 网关时,或者您不想支付商业 CA 时,请使用私有 CA。要在这样的用例中签名证书,私有 CA 使用自签名证书。

前提条件

  • 您有 root 权限或使用 sudo 输入管理命令的权限。需要此类权限的命令标记为 #

流程

  1. 为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 Elliptic Curve Digital Signature Algorithm(ECDSA)密钥:

    $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>
    Copy to Clipboard Toggle word wrap

    密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。

  2. 使用上一个命令生成的私钥创建证书:

    $ openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<example_CA>" -out <ca.crt>
    Copy to Clipboard Toggle word wrap

    生成的 ca.crt 文件是一个自签名 CA 证书,可用来为其他证书签名 10 年。在私有 CA 的情况下,您可以将 <example_CA> 替换为任何通用名称(CN)的字符串 。

  3. 对 CA 的私钥设置安全权限,例如:

    # chown <root>:<root> <ca.key>
    # chmod 600 <ca.key>
    Copy to Clipboard Toggle word wrap

后续步骤

  • 要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以 root 用户身份将其添加到客户端的系统范围信任存储中:

    # trust anchor <ca.crt>
    Copy to Clipboard Toggle word wrap

    如需更多信息,请参阅 使用共享的系统证书 一章。

验证

  1. 创建证书签名请求(CSR),并使用您的 CA 为请求签名。CA 必须成功创建一个基于 CSR 的证书,例如:

    $ openssl x509 -req -in <client-cert.csr> -CA <ca.crt> -CAkey <ca.key> -CAcreateserial -days 365 -extfile <openssl.cnf> -extensions <client-cert> -out <client-cert.crt>
    Signature ok
    subject=C = US, O = Example Organization, CN = server.example.com
    Getting CA Private Key
    Copy to Clipboard Toggle word wrap

    请参阅 第 2.5 节 “使用私有 CA 使用 OpenSSL 为 CSR 发布证书” 了解更多信息。

  2. 显示有关自签名 CA 的基本信息:

    $ openssl x509 -in <ca.crt> -text -noout
    Certificate:
    …
            X509v3 extensions:
                …
                X509v3 Basic Constraints: critical
                    CA:TRUE
                X509v3 Key Usage: critical
                    Certificate Sign, CRL Sign
    …
    Copy to Clipboard Toggle word wrap
  3. 验证私钥的一致性:

    $ openssl pkey -check -in <ca.key>
    Key is valid
    -----BEGIN PRIVATE KEY-----
    MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgcagSaTEBn74xZAwO
    18wRpXoCVC9vcPki7WlT+gnmCI+hRANCAARb9NxIvkaVjFhOoZbGp/HtIQxbM78E
    lwbDP0BI624xBJ8gK68ogSaq2x4SdezFdV1gNeKScDcU+Pj2pELldmdF
    -----END PRIVATE KEY-----
    Copy to Clipboard Toggle word wrap

您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,您必须首先为您的服务器创建私钥和证书签名请求(CSR)。

流程

  1. 在服务器系统上生成私钥,例如:

    $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server_private.key>
    Copy to Clipboard Toggle word wrap
  2. 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:

    $ vim <example_server.cnf>
    [server-cert]
    keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_name
    
    [req]
    distinguished_name = dn
    prompt = no
    
    [dn]
    C = <US>
    O = <Example Organization>
    CN = <server.example.com>
    
    [alt_name]
    DNS.1 = <example.com>
    DNS.2 = <server.example.com>
    IP.1 = <192.168.0.1>
    IP.2 = <::1>
    IP.3 = <127.0.0.1>
    Copy to Clipboard Toggle word wrap

    extendedKeyUsage = serverAuth 选项限制证书的使用。

  3. 使用之前创建的私钥创建 CSR:

    $ openssl req -key <server_private.key> -config <example_server.cnf> -new -out <server_cert.csr>
    Copy to Clipboard Toggle word wrap

    如果省略了 -config 选项,req 工具会提示您额外的信息,例如:

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]: <US>
    State or Province Name (full name) []: <Washington>
    Locality Name (eg, city) [Default City]: <Seattle>
    Organization Name (eg, company) [Default Company Ltd]: <Example Organization>
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server's hostname) []: <server.example.com>
    Email Address []: <server@example.com>
    Copy to Clipboard Toggle word wrap

后续步骤

验证

  1. 从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如:

    $ openssl x509 -text -noout -in <server_cert.crt>
    Certificate:
    …
            Issuer: CN = Example CA
            Validity
                Not Before: Feb  2 20:27:29 2023 GMT
                Not After : Feb  2 20:27:29 2024 GMT
            Subject: C = US, O = Example Organization, CN = server.example.com
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
    …
            X509v3 extensions:
                X509v3 Key Usage: critical
                    Digital Signature, Key Encipherment, Key Agreement
                X509v3 Extended Key Usage:
                    TLS Web Server Authentication
                X509v3 Subject Alternative Name:
                    DNS:example.com, DNS:server.example.com, IP Address:192.168.0.1, IP
    …
    Copy to Clipboard Toggle word wrap

您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,您必须首先为您的客户端创建私钥和证书签名请求(CSR)。

流程

  1. 在客户端系统上生成私钥,例如:

    $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
    Copy to Clipboard Toggle word wrap
  2. 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:

    $ vim <example_client.cnf>
    [client-cert]
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth
    subjectAltName = @alt_name
    
    [req]
    distinguished_name = dn
    prompt = no
    
    [dn]
    CN = <client.example.com>
    
    [clnt_alt_name]
    email= <client@example.com>
    Copy to Clipboard Toggle word wrap

    extendedKeyUsage = clientAuth 选项限制证书的使用。

  3. 使用之前创建的私钥创建 CSR:

    $ openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>
    Copy to Clipboard Toggle word wrap

    如果省略了 -config 选项,req 工具会提示您额外的信息,例如:

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    …
    Common Name (eg, your name or your server's hostname) []: <client.example.com>
    Email Address []: <client@example.com>
    Copy to Clipboard Toggle word wrap

后续步骤

验证

  1. 检查证书的人类可读部分是否与您的要求匹配,例如:

    $ openssl x509 -text -noout -in <client-cert.crt>
    Certificate:
    …
                X509v3 Extended Key Usage:
                    TLS Web Client Authentication
                X509v3 Subject Alternative Name:
                    email:client@example.com
    …
    Copy to Clipboard Toggle word wrap

2.5. 使用私有 CA 使用 OpenSSL 为 CSR 发布证书

要让系统建立一条 TLS 加密的通信频道,证书颁发机构(CA)必须为它们提供有效的证书。如果您有私有 CA,您可以通过从系统签署证书签名请求(CSR)来创建请求的证书。

前提条件

流程

  1. 可选:使用您选择的文本编辑器,来准备一个 OpenSSL 配置文件,以便向证书添加扩展,例如:

    $ vim <openssl.cnf>
    [server-cert]
    extendedKeyUsage = serverAuth
    
    [client-cert]
    extendedKeyUsage = clientAuth
    Copy to Clipboard Toggle word wrap

    请注意,上例仅演示了原则,且 openssl 不会将所有扩展自动添加到证书中。您必须将所需的扩展添加到 CNF 文件中,或者将它们附加到 openssl 命令的参数中。

  2. 使用 x509 工具创建基于 CSR 的证书,例如:

    $ openssl x509 -req -in <server_cert.csr> -CA <ca.crt> -CAkey <ca.key> -days 365 -extfile <openssl.cnf> -extensions <server_cert> -out <server_cert.crt>
    Signature ok
    subject=C = US, O = Example Organization, CN = server.example.com
    Getting CA Private Key
    Copy to Clipboard Toggle word wrap

    要提高安全性,请在从 CSR 创建另一个证书前删除序列号文件。这样,您确保序列号始终是随机的。如果您省略了指定自定义文件名的 CAserial 选项,则序列号文件名与证书的文件名相同,但其扩展名被 .srl 扩展名替换(上例中的server-cert.srl )。

2.6. OpenSSL 中的 post-quantum 加密算法

启用系统范围的 post-quantum 算法 后,您可以使用 OpenSSL TLS 工具包生成密钥、签名消息、验证签名,并使用 ML-DSA post-quantum 算法创建 X.509 证书。

OpenSSL 中 ML-DSA 密钥的用法示例

$ openssl genpkey -algorithm mldsa65 -out <mldsa-privatekey.pem>
使用 ML-DSA-65 算法创建私钥。
$ openssl pkey -in <mldsa-privatekey.pem> -pubout -out <mldsa-publickey.pem>
根据 ML-DSA-65 加密的私钥创建一个公钥。
$ openssl dgst -sign <mldsa-privatekey.pem> -out <signature_message>
使用私钥签署一条消息。
$ openssl dgst -verify <mldsa-publickey.pem> -signature <signature_message>
使用公钥验证 ML-DSA-65 签名。

OpenSSL 中证书的 ML-DSA 用法的示例

由于当前没有公共证书颁发机构(CA)支持 post-quantum 签名,因此只能使用带有 ML-DSA 签名的本地 CA 或自签名证书。例如:

$ openssl req \
    -x509 \
    -newkey mldsa65 \
    -keyout <localhost-mldsa.key> \
    -subj /CN=<localhost> \
    -addext subjectAltName=DNS:<localhost> \
    -days <30> \
    -nodes \
    -out <localhost-mldsa.crt>
Copy to Clipboard Toggle word wrap

当为一组证书和系统配置了 DEFAULT:TEST-PQ 系统范围的加密策略时,OpenSSL 服务器和客户端可以建立一个 post-quantum 连接和一个仅使用传统算法的连接。

使用 PQC 密钥交换和 PQC 证书建立一个连接,例如:

$ openssl s_server \
    -cert <localhost-mldsa.crt> -key <localhost-mldsa.key> \
    -dcert <localhost-rsa.crt> -dkey <localhost-rsa.key> >/dev/null &

$ openssl s_client \
    -connect <localhost:4433> \
    -CAfile <localhost-mldsa.crt> </dev/null \
    |& grep -E '(Peer signature type|Negotiated TLS1.3 group)'
Peer signature type: mldsa65
Negotiated TLS1.3 group: X25519MLKEM768
Copy to Clipboard Toggle word wrap

建立一个只使用非 post-quantum 加密算法的连接,例如:

$ openssl s_client \
    -connect <localhost:4433> \
    -CAfile <localhost-rsa.crt> \
    -sigalgs 'rsa_pss_pss_sha256:rsa_pss_rsae_sha256' \
    -groups 'X25519:secp256r1:X448:secp521r1:secp384r1' </dev/null \
    |& grep -E '(Peer signature type|Server Temp Key)'
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
Copy to Clipboard Toggle word wrap

您可以将服务器配置为同时使用传统证书(RSA、ECDSA 和 EdDSA)和 post-quantum 证书。服务器自动并透明地选择客户端首选和支持的证书:新客户端的 post-quantum 和旧客户端的传统证书。

重要

Red Hat Enterprise Linux 10 中的所有 PQC 算法都作为技术预览提供。当后量子密码学退出技术预览状态时,软件包和系统范围加密策略名称可能会改变。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

2.7. 使用 GnuTLS 创建私有 CA

当您的情况需要在您的内部网络内验证实体时,私有证书颁发机构(CA)非常有用。例如,当使用基于您控制下的 CA 签名的证书的身份验证创建 VPN 网关时,或者您不想支付商业 CA 时,请使用私有 CA。要在这样的用例中签名证书,私有 CA 使用自签名证书。

前提条件

  • 您有 root 权限或使用 sudo 输入管理命令的权限。需要此类权限的命令标记为 #
  • 您已在系统上安装了 GnuTLS。如果没有,您可以使用这个命令:

    $ dnf install gnutls-utils
    Copy to Clipboard Toggle word wrap

流程

  1. 为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 ECDSA (Elliptic Curve Digital Signature Algorithm)密钥:

    $ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>
    Copy to Clipboard Toggle word wrap

    密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。

  2. 为证书创建一个模板文件。

    1. 使用您选择的文本编辑器创建一个文件,例如:

      $ vi <ca.cfg>
      Copy to Clipboard Toggle word wrap
    2. 编辑文件以包含必要的认证详情:

      organization = "Example Inc."
      state = "Example"
      country = EX
      cn = "Example CA"
      serial = 007
      expiration_days = 365
      ca
      cert_signing_key
      crl_signing_key
      Copy to Clipboard Toggle word wrap
  3. 使用在第 1 步中生成的私钥创建一个签名的证书:

    生成的 <ca.crt> 文件是一个自签名 CA 证书,可用于为其他证书签名一年。<ca.crt> 文件是公钥(证书)。加载的文件 <ca.key> 是私钥。您应该将此文件保存在安全的地方。

    $ certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>
    Copy to Clipboard Toggle word wrap
  4. 对 CA 的私钥设置安全权限,例如:

    # chown <root>:<root> <ca.key>
    # chmod 600 <ca.key>
    Copy to Clipboard Toggle word wrap

后续步骤

  • 要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以 root 用户身份将其添加到客户端的系统范围信任存储中:

    # trust anchor <ca.crt>
    Copy to Clipboard Toggle word wrap

    如需更多信息,请参阅 使用共享的系统证书 一章。

验证

  1. 显示有关自签名 CA 的基本信息:

    $ certtool --certificate-info --infile <ca.crt>
    Certificate:
    …
        	X509v3 extensions:
            	…
            	X509v3 Basic Constraints: critical
                	CA:TRUE
            	X509v3 Key Usage: critical
                	Certificate Sign, CRL Sign
    Copy to Clipboard Toggle word wrap
  2. 创建证书签名请求(CSR),并使用您的 CA 为请求签名。CA 必须成功创建一个基于 CSR 的证书,例如:

    1. 为您的 CA 生成一个私钥:

      $ certtool --generate-privkey --outfile <example_server.key>
      Copy to Clipboard Toggle word wrap
    2. 在您选择的文本编辑器中打开一个新配置文件,例如:

      $ vi <example_server.cfg>
      Copy to Clipboard Toggle word wrap
    3. 编辑文件以包含必要的认证详情:

      signing_key
      encryption_key
      key_agreement
      
      tls_www_server
      
      country = "US"
      organization = "Example Organization"
      cn = "server.example.com"
      
      dns_name = "example.com"
      dns_name = "server.example.com"
      ip_address = "192.168.0.1"
      ip_address = "::1"
      ip_address = "127.0.0.1"
      Copy to Clipboard Toggle word wrap
    4. 使用之前创建的私钥生成一个请求:

      $ certtool --generate-request --load-privkey <example_server.key> --template <example_server.cfg> --outfile <example_server.crq>
      Copy to Clipboard Toggle word wrap
    5. 生成证书并使用 CA 的私钥对其签名:

      $ certtool --generate-certificate --load-request <example_server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example_server.crt>
      Copy to Clipboard Toggle word wrap

要获取证书,您必须首先为您的服务器创建私钥和证书签名请求(CSR)。

流程

  1. 在服务器系统上生成私钥,例如:

    $ certtool --generate-privkey --sec-param High --outfile <example_server.key>
    Copy to Clipboard Toggle word wrap
  2. 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:

    $ vim <example_server.cnf>
    signing_key
    encryption_key
    key_agreement
    
    tls_www_server
    
    country = "US"
    organization = "Example Organization"
    cn = "server.example.com"
    
    dns_name = "example.com"
    dns_name = "server.example.com"
    ip_address = "192.168.0.1"
    ip_address = "::1"
    ip_address = "127.0.0.1"
    Copy to Clipboard Toggle word wrap
  3. 使用之前创建的私钥创建 CSR:

    $ certtool --generate-request --template <example_server.cfg> --load-privkey <example_server.key> --outfile <example_server.crq>
    Copy to Clipboard Toggle word wrap

    如果省略 --template 选项,certool 工具会提示您输入额外的信息,例如:

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Generating a PKCS #10 certificate request...
    Country name (2 chars): <US>
    State or province name: <Washington>
    Locality name: <Seattle>
    Organization name: <Example Organization>
    Organizational unit name:
    Common name: <server.example.com>
    Copy to Clipboard Toggle word wrap

后续步骤

验证

  1. 从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如:

    $ certtool --certificate-info --infile <example_server.crt>
    Certificate:
    …
            Issuer: CN = Example CA
            Validity
                Not Before: Feb  2 20:27:29 2023 GMT
                Not After : Feb  2 20:27:29 2024 GMT
            Subject: C = US, O = Example Organization, CN = server.example.com
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
    …
            X509v3 extensions:
                X509v3 Key Usage: critical
                    Digital Signature, Key Encipherment, Key Agreement
                X509v3 Extended Key Usage:
                    TLS Web Server Authentication
                X509v3 Subject Alternative Name:
                    DNS:example.com, DNS:server.example.com, IP Address:192.168.0.1, IP
    …
    Copy to Clipboard Toggle word wrap

要获取证书,您必须首先为您的客户端创建私钥和证书签名请求(CSR)。

流程

  1. 在客户端系统上生成私钥,例如:

    $ certtool --generate-privkey --sec-param High --outfile <example_client.key>
    Copy to Clipboard Toggle word wrap
  2. 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:

    $ vim <example_client.cnf>
    signing_key
    encryption_key
    
    tls_www_client
    
    cn = "client.example.com"
    email = "client@example.com"
    Copy to Clipboard Toggle word wrap
  3. 使用之前创建的私钥创建 CSR:

    $ certtool --generate-request --template <example_client.cfg> --load-privkey <example_client.key> --outfile <example_client.crq>
    Copy to Clipboard Toggle word wrap

    如果省略 --template 选项 certtool 工具会提示您输入额外的信息,例如:

    Generating a PKCS #10 certificate request...
    Country name (2 chars): <US>
    State or province name: <Washington>
    Locality name: <Seattle>
    Organization name: <Example Organization>
    Organizational unit name:
    Common name: <server.example.com>
    Copy to Clipboard Toggle word wrap

后续步骤

验证

  1. 检查证书的人类可读部分是否与您的要求匹配,例如:

    $ certtool --certificate-info --infile <example_client.crt>
    Certificate:
    …
                X509v3 Extended Key Usage:
                    TLS Web Client Authentication
                X509v3 Subject Alternative Name:
                    email:client@example.com
    …
    Copy to Clipboard Toggle word wrap

2.10. 使用私有 CA ,使用 GnuTLS 为 CSR 发布证书

要让系统建立一条 TLS 加密的通信频道,证书颁发机构(CA)必须为它们提供有效的证书。如果您有私有 CA,您可以通过从系统签署证书签名请求(CSR)来创建请求的证书。

前提条件

流程

  1. 可选:使用您选择的文本编辑器准备 GnuTLS 配置文件,来为证书添加扩展,例如:

    $ vi <server_extensions.cfg>
    honor_crq_extensions
    ocsp_uri = "http://ocsp.example.com"
    Copy to Clipboard Toggle word wrap
  2. 使用 certtool 工具创建基于 CSR 的证书,例如:

    $ certtool --generate-certificate --load-request <example_server.crq> --load-ca-privkey <ca.key> --load-ca-certificate <ca.crt> --template <server_extensions.cfg> --outfile <example_server.crt>
    Copy to Clipboard Toggle word wrap

第 3 章 使用共享的系统证书

共享系统证书存储使 NSS、GnuTLS、OpenSSL 和 Java 能够共享一个默认源,以检索系统证书锚点和 blocklist 信息。

3.1. 系统范围的信任存储

Red Hat Enterprise Linux 提供一个集中的系统来管理 TLS 证书。默认情况下,truststore 包含 Mozilla CA 列表,其中包括正和负信任。系统可使您能够更新核心 Mozilla CA 列表。

整合的系统范围的 truststore 位于 /etc/pki/ca-trust//usr/share/pki/ca-trust-source/ 目录中。/usr/share/pki/ca-trust-source/ 中信任设置的优先级低于 /etc/pki/ca-trust/ 中设置的优先级。

系统根据您安装它们的子目录来处理证书文件:

  • 信任锚属于

    • /usr/share/pki/ca-trust-source/anchors/
    • /etc/pki/ca-trust/source/anchors/
  • 不信任的证书存储在

    • /usr/share/pki/ca-trust-source/blocklist/
    • /etc/pki/ca-trust/source/blocklist/
  • 扩展的 BEGIN TRUSTED 文件(OpenSSL 信任证书)格式的证书位于

    • /usr/share/pki/ca-trust-source/
    • /etc/pki/ca-trust/source/

要将新证书添加到 truststore 中,您可以将包含证书的文件复制到相应的目录中,并使用 update-ca-trust 命令应用更改。或者,您可以使用 trust anchor 子命令。

注意

在分层加密系统中,信任锚是其他各方认为值得信任的权威实体。在 X.509 架构中,根证书是从中派生信任链的信任锚。要启用链验证,信任方必须首先能够访问信任锚点。

3.2. 将新证书添加到系统范围的 truststore 中

要在具有新信任源的系统上确认应用程序,请将相应的证书添加到系统范围的存储中,并使用 update-ca-trust 命令。

前提条件

  • ca-certificates 软件包存在于系统中。

流程

  1. 将简单 PEM 或 DER 文件格式的证书添加到系统上信任的 CA 列表中,将证书文件复制到 /usr/share/pki/ca-trust-source/anchors//etc/pki/ca-trust/source/anchors/ 目录中,例如:

    # cp <~/certificate-trust-examples/Cert-trust-test-ca.pem> /usr/share/pki/ca-trust-source/anchors/
    Copy to Clipboard Toggle word wrap
  2. 更新系统范围的 truststore 配置,使用 update-ca-trust 命令:

    # update-ca-trust extract
    Copy to Clipboard Toggle word wrap
注意

虽然 Firefox 浏览器可以在不预先执行 update-ca-trust 的情况下使用一个添加的证书,但在每次 CA 更改后需要输入 update-ca-trust 命令。另请注意,浏览器(如 Firefox 和 Chromium)、缓存文件,您可能需要清除浏览器的缓存或重启浏览器来加载当前系统证书配置。

3.3. 使用 trust 命令信任的系统证书管理

您可以使用对相应文件的基本文件操作,并使用 在系统范围 truststore 中添加新证书 部分中所述的 update-ca-trust 命令或 trust 命令添加或从系统范围的 truststore 中删除证书。

trust 命令提供了一种在共享的系统范围 truststore 中管理证书的方法。您可以使用其子命令来列出、提取、添加、删除或更改信任锚点。

  • 要查看 trust 命令的内置帮助信息,请输入不带任何参数或使用 --help 指令的 trust 命令。另外,trust 命令的所有子命令都提供一个详细的内置帮助,例如:

    $ trust list --help
    usage: trust list --filter=<what>
    …
    Copy to Clipboard Toggle word wrap
  • 要列出所有系统信任锚点和证书,请使用 trust list 命令,例如:

    $ trust list
    …
    pkcs11:id=%DD%04%09%07%A2%F5%7A%7D%52%53%12%92%95%EE%38%80%25%0D%A6%59;type=cert
        type: certificate
        label: SSL.com Root Certification Authority RSA
        trust: anchor
        category: authority
    …
    Copy to Clipboard Toggle word wrap
  • 要将信任锚存储在系统范围的信任存储中,请使用 trust anchor 子命令,并指定证书的路径。将 <path.to/certificate.crt> 替换为证书的路径及其文件名:

    # trust anchor <path.to/certificate.crt>
    Copy to Clipboard Toggle word wrap
  • 要删除证书,请使用证书的路径或证书的 ID:

    # trust anchor --remove <path.to/certificate.crt>
    # trust anchor --remove "pkcs11:id=<%AA%BB%CC%DD%EE>;type=cert"
    Copy to Clipboard Toggle word wrap

第 4 章 计划并使用 TLS

TLS(传输层安全)是用来保护网络通信的加密协议。在通过配置首选密钥交换协议、身份验证方法和加密算法来强化系统安全设置时,需要记住支持的客户端的范围越广,产生的安全性就越低。相反,严格的安全设置会导致与客户端的兼容性受限,这可能导致某些用户被锁定在系统之外。请确保以最严格的可用配置为目标,并且仅在出于兼容性原因需要时才放宽配置。

4.1. SSL 和 TLS 协议

安全套接字层(SSL)协议最初使由 Netscape 公司开发的,以提供一种在互联网上进行安全通信的机制。因此,该协议被互联网工程任务组(IETF)采纳,并重命名为传输层安全(TLS)。

TLS 协议位于应用协议层和可靠的传输层之间,例如 TCP/IP。它独立于应用程序协议,因此可在很多不同的协议下分层,如 HTTP、FTP、SMTP 等等。

Expand
协议版本用法建议

SSL v2

不要使用。具有严重的安全漏洞。从 RHEL 7 开始从核心加密库中删除了。

SSL v3

不要使用。具有严重的安全漏洞。从 RHEL 8 开始从核心加密库中删除了。

TLS 1.0

不建议使用。已知的无法以保证互操作性方式缓解的问题,且不支持现代密码套件。在 RHEL 10 中,在所有加密策略中禁用了。

TLS 1.1

在需要时用于互操作性.不支持现代加密套件。在 RHEL 10 中,在所有加密策略中禁用了。

TLS 1.2

支持现代 AEAD 密码组合。此版本在所有系统范围的加密策略中启用,但此协议的可选部分包含漏洞,TLS 1.2 也允许过时的算法。

TLS 1.3

推荐的版本。TLS 1.3 删除了已知有问题的选项,通过加密更多协商握手来提供额外的隐私,由于使用了更有效的现代加密算法,所以可以更快。TLS 1.3 也在所有系统范围的加密策略中启用了。

4.2. 在 RHEL 10 中对 TLS 的安全注意事项

在 RHEL 10 中,TLS 配置是使用系统范围的加密策略机制执行的。不再支持 1.2 以下的 TLS 版本。DEFAULTFUTURELEGACY 加密策略只允许 TLS 1.2 和 1.3。如需更多信息,请参阅 安全强化 文档中的 使用系统范围的加密策略 一章。

RHEL 10 中包含的库提供的默认设置对于大多数部署来说足够安全。TLS 实现尽可能使用安全算法,而不阻止来自或到旧客户端或服务器的连接。在具有严格安全要求的环境中应用强化设置,在这些环境中,不支持安全算法或协议的旧客户端或服务器不应连接或不允许连接。

强化 TLS 配置的最简单方法是使用 update-crypto-policies --set FUTURE 命令将系统范围的加密策略级别切换到 FUTURE

警告

LEGACY 加密策略禁用的算法不符合红帽的 RHEL 10 安全愿景,其安全属性不可靠。考虑放弃使用这些算法,而不是重新启用它们。如果您确实决定重新启用它们(例如,为了与旧硬件的互操作性),请将它们视为不安全的,并应用额外的保护措施,例如将其网络交互隔离到单独的网络段。不要在公共网络中使用它们。

如果您决定不遵循 RHEL 系统范围的加密策略,或创建自定义的为您的设置定制的加密策略,对自定义配置建议使用首选协议、密码套件和密钥长度:

4.2.1. 协议

TLS 的最新版本提供了最佳安全机制。TLS 1.2 现在是最低版本,即使使用 LEGACY 加密策略也是如此。通过选择不使用加密策略或提供自定义策略,可以重新启用旧协议版本,但不支持生成的配置。

请注意,虽然 RHEL 10 支持 TLS 版本 1.3,但 RHEL 10 组件并不完全支持这个协议的所有功能。例如,Apache Web 服务器尚不完全支持可降低连接延迟的 0-RTT(Zero R Trip Time)功能。

警告

在 FIPS 模式下运行的 RHEL 9.2 及更新的版本强制任何 TLS 1.2 连接都必须使用Extended Master Secret (EMS)扩展(RFC 7627),因为 FIPS 140-3 标准需要。因此,不支持 EMS 或 TLS 1.3 的旧客户端无法连接到在 FIPS 模式下运行的 RHEL 9 和 10 服务器,FIPS 模式下的 RHEL 9 和 10 客户端无法连接到只支持没有 EMS 的 TLS 1.2 的服务器。如需更多信息,请参阅 Red Hat Enterprise Linux 9.2 强制使用 TLS 扩展"Extended Master Secret" 红帽知识库解决方案。

4.2.2. 密码套件

现代、更安全的密码套件应该优先于旧的不安全密码套件。一直禁止 eNULL 和 aNULL 密码套件的使用,它们根本不提供任何加密或身份验证。如果有可能,基于 RC4 或 HMAC-MD5 的密码套件也必须被禁用。这同样适用于所谓的出口密码套件,它们被有意地弱化了,因此很容易被破解。

虽然不会立即变得不安全,但提供安全性少于 128 位的密码套件在它们的短使用期中不应该被考虑。使用 128 位或者更高安全性的算法可以预期在至少数年内不会被破坏,因此我们强烈推荐您使用此算法。请注意,虽然 3DES 密码公告使用 168 位但它们实际只提供了 112 位的安全性。

始终优先使用支持(完美)转发保密(PFS)的密码套件,这样可确保加密数据的机密性,以防服务器密钥被泄露。此规则排除了快速 RSA 密钥交换,但允许使用 ECDHE 和 DHE。在两者中,ECDHE 更快,因此是首选。

您还应该优先选择 AEAD 密码,如 AES-GCM,使用 CBC 模式密码,因为它们不容易受到 padding oracle 攻击的影响。此外,在很多情况下,在 CBC 模式下,AES-GCM 比 AES 快,特别是当硬件具有 AES 加密加速器时。

另请注意,在使用带有 ECDSA 证书的 ECDHE 密钥交换时,事务的速度甚至比纯 RSA 密钥交换要快。为了给旧客户端提供支持,您可以在服务器上安装两对证书和密钥:一对带有 ECDSA 密钥(用于新客户端),另一对带有 RSA 密钥(用于旧密钥)。

4.2.3. 公钥长度

在使用 RSA 密钥时,总是首选使用至少由 SHA-256 签名的 3072 位的密钥长度,对于真实的 128 位安全性来说,这个值已经足够大。

警告

您的系统安全性仅与链中最弱的连接相同。例如,只是一个强大的密码不能保证良好安全性。密钥和证书以及认证机构(CA)用来签署您的密钥的哈希功能和密钥同样重要。

4.3. 在应用程序中强化 TLS 配置

在 RHEL 中,系统范围的加密策略 提供了一种便捷的方法,来确保您的使用加密库的应用程序不允许已知的不安全协议、密码或算法。

如果要使用自定义加密设置来强化与 TLS 相关的配置,您可以使用本节中描述的加密配置选项,并以最少的需求量覆盖系统范围的加密策略。

无论您选择使用什么配置,请始终确保您的服务器应用程序强制实施 服务器端密码顺序,以便使用的密码套件由您配置的顺序来决定。

4.3.1. 将 Apache HTTP 服务器配置为使用 TLS

Apache HTTP 服务器 可以使用 OpenSSLNSS 库来满足其 TLS 的需求。RHEL 10 通过 eponymous 软件包提供 mod_ssl 功能:

# dnf install mod_ssl
Copy to Clipboard Toggle word wrap

mod_ssl 软件包将安装 /etc/httpd/conf.d/ssl.conf 配置文件,该文件可用来修改 Apache HTTP 服务器 与 TLS 相关的设置。

安装 httpd-manual 软件包以获取 Apache HTTP 服务器 的完整文档,包括 TLS 配置。/etc/httpd/conf.d/ssl.conf 配置文件中的指令在 /usr/share/httpd/manual/mod_ssl.html 文件中详细介绍。/usr/share/httpd/manual/ssl/ssl/ssl_howto.html 文件中描述了各种设置的示例。

修改 /etc/httpd/conf.d/ssl.conf 配置文件中的设置时,请确保至少考虑以下三个指令:

SSLProtocol
使用这个指令指定您要允许的 TLS 或者 SSL 版本。
SSLCipherSuite
使用这个指令来指定您首选的密码套件或禁用您要禁止的密码套件。
SSLHonorCipherOrder
取消注释并将此指令设置为 on,以确保连接的客户端遵循您指定的密码顺序。

例如,只使用 TLS 1.2 和 1.3 协议:

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅部署 Web 服务器和反向代理文档中的 对 Apache HTTP 服务器配置 TLS 加密 一章。

4.3.2. 将 Nginx HTTP 和代理服务器配置为使用 TLS

要在 Nginx 中启用 TLS 1.3 支持,请将 TLSv1.3 值添加到 /etc/nginx/nginx.conf 配置文件的 server 部分的 ssl_protocols 选项:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ....
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers
    ....
}
Copy to Clipboard Toggle word wrap

如需更多信息,请参阅部署 web 服务器和反向代理文档中的 向 Nginx web 服务器添加 TLS 加密 一章。

4.3.3. 将 Dovecot 邮件服务器配置为使用 TLS

要将 Dovecot 邮件服务器的安装配置为使用 TLS,请修改 /etc/dovecot/conf.d/10-ssl.conf 配置文件。您可以在 /usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt 文件中找到一些基本配置指令的说明,该文件与 Dovecot 的标准安装一起安装。

修改 /etc/dovecot/conf.d/10-ssl.conf 配置文件中的设置时,请确保至少考虑以下三个指令:

ssl_protocols
使用这个指令指定您要允许或者禁用的 TLS 或者 SSL 版本。
ssl_cipher_list
使用这个指令指定您首选的密码套件或禁用您要禁止的密码套件。
ssl_prefer_server_ciphers
取消注释并将此指令设置为 yes,以确保连接的客户端遵循您指定的密码顺序。

例如,/etc/dovecot/conf.d/10-ssl.conf 中的以下行只允许 TLS 1.1 及之后的版本:

ssl_protocols = !SSLv2 !SSLv3 !TLSv1
Copy to Clipboard Toggle word wrap

第 5 章 使用加密 DNS 保护系统 DNS 流量

您可以启用加密的 DNS 来保护使用 DNS-over-TLS (DoT)协议的 DNS 通信。加密的 DNS (eDNS)加密所有端到端 DNS 流量,且不会回退到不安全的协议,并与零信任架构(ZTA)的原则保持一致。

RHEL 中 eDNS 的当前实现只使用 DoT 协议。有两种主要方法来安装启用了 eDNS 的 RHEL 。您可以从本地介质执行交互式安装,或构建自定义可引导 ISO,以确保 eDNS 在安装过程中和安装后使用 enforce 策略进行了配置。另外,您可以将现有的 RHEL 安装转换为使用 eDNS。

重要

加密的 DNS 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

5.1. RHEL 中 eDNS 的组件概述

以下组件包含 RHEL 中的 eDNS 设置,并以分层方式交互:

NetworkManager
NetworkManager 启用 eDNS,并强制根据配置的策略使用加密 DNS 协议。它被设置为使用 dnsconfd 作为其后端 DNS 解析器。
dnsconfd
dnsconfd 是一个本地 DNS 缓存配置守护进程。它简化了 DNS 缓存、分割 DNS 和 DNS over TLS (DoT)的设置。
unbound
unbound 是一种验证、递归和缓存 DNS 解析器。在 eDNS 设置中,它充当 dnsconfd 的运行时缓存服务。unbound 对上游 DNS 查询使用 TLS ,这对于加密到外部 DoT 服务器的 DNS 流量至关重要。unbound 还管理各种缓存来存储 DNS 响应,这减少了重复外部查询的需要,并提高了性能。

5.1.1. EDNS 解析过程和核心交互

  1. 解析主机名的应用程序请求。
  2. 系统读取 /etc/resolv.conf 文件,并将查询发送给本地 unbound 服务。
  3. unbound 首先检查其内部缓存,来检查有效的,缓存的响应。
  4. 如果没有找到请求记录,unbound 会使用 TLS 加密 DNS 查询,并将其发送到配置好的上游启用了 DoT 的 DNS 服务器。
  5. 上游 DoT 服务器处理查询,并将加密的 DNS 响应发回给 unbound
  6. unbound 解密、验证和缓存响应。
  7. 最后,unbound 将解析的 DNS 响应发回给应用程序。

5.2. 从本地安装介质安装启用了 eDNS 的 RHEL

安装具有 eDNS enforce 策略的 RHEL 系统,确保所有 DNS 查询在安装过程中及之后都是私有的和安全的。如果需要一个自定义 CA 证书捆绑包,则必须使用 Kickstart 文件中的 %certificate 部分安装它。

在安装过程中,您必须从本地介质提供 RHEL 安装内容和 Kickstart 文件。您无法从远程 HTTP 服务器下载 Kickstart 文件,因为安装程序需要使用 DNS 解析服务器的主机名。如果您的环境允许回退到未加密的 DNS,您可以执行标准 RHEL 安装,并在之后配置 eDNS。

先决条件

  • # 命令提示符开头的命令需要 sudo 提供的管理特权或 root 用户访问权限。有关如何配置 sudo 访问权限的详情,请参考 启用非特权用户,以运行某些命令
  • 您在本地有 RHEL 安装介质。
  • 如果您需要自定义 CA 捆绑包,那么在本地有带有 %certificate 部分的 Kickstart 文件。

流程

  1. 可选:创建带有 %certificate 部分的 Kickstart 文件。确保证书保存在名为 tls-ca-bundle.pem 的文件中。

    %certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem
    -----BEGIN CERTIFICATE-----
    <Base64-encoded_certificate_content>
    -----END CERTIFICATE-----
    %end
    Copy to Clipboard Toggle word wrap
  2. 准备可引导安装介质,如果需要自定义 CA 捆绑包,还要包括 Kickstart 文件。
  3. 引导安装介质
  4. 在引导菜单窗口中选择所需选项,然后按 e 键编辑引导参数。
  5. 添加 eDNS 内核参数:

    linux ($root)/vmlinuz-6.12.0-0.el10_0.x86_64 root=/dev/mapper/rhel-root ro crashkernel=2G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet emergency ip=dhcp rd.net.dns=dns+tls://<server_ip>#<dns_server_hostname> rd.net.dns-resolve-mode=exclusive rd.net.dns-backend=dnsconfd inst.ks=hd:/dev/sdb1/mykickstart.ks
    Copy to Clipboard Toggle word wrap
  6. 完成编辑后,按 Ctrl+X 使用指定的选项开始安装。

验证

  • 验证您的 eDNS 配置:

    $ dnsconfd status
    Copy to Clipboard Toggle word wrap

    预期输出:

    Running cache service:
    unbound
    Resolving mode: exclusive
    Config present in service:
    {
        ".": [
            "dns+tls://198.51.100.143#dot.dns.example.com"
        ]
    }
    State of Dnsconfd:
    RUNNING
    Info about servers: [
        {
            "address": "198.51.100.143",
            "port": 853,
            "name": "dot.dns.example.com",
            "routing_domains": [
                "."
            ],
            "search_domains": [],
            "interface": null,
            "protocol": "dns+tls",
            "dnssec": true,
            "networks": [],
            "firewall_zone": null
        }
    ]
    Copy to Clipboard Toggle word wrap
  • 使用 nslookup 验证 DNS 服务器是否有响应:

    $ nslookup <domain_name>
    Copy to Clipboard Toggle word wrap

    <domain_name> 替换为您要查询的域。

故障排除

  • unbound 中启用详细日志记录:

    # unbound-control verbosity 5
    Copy to Clipboard Toggle word wrap
  • 查看相关服务的日志:

    $ journalctl -xe -u <service_name>
    Copy to Clipboard Toggle word wrap

    <service_name> 替换为 NetworkManagerdnsconfdunbound

创建一个自定义可引导 ISO 来安装带有 eDNS enforce 策略的 RHEL,确保所有 DNS 查询在安装过程中及之后都是私有的和安全的。如果需要一个自定义 CA 证书捆绑包,则必须使用 Kickstart 文件中的 %certificate 部分安装它。然后,您在脚本中引用这个 Kickstart 文件,来构建新的 ISO,其中包括用于强制执行严格的 DoT 策略的内核参数。如果您的环境允许回退到未加密的 DNS,您可以执行标准 RHEL 安装,并在之后配置 eDNS。

先决条件

  • # 命令提示符开头的命令需要 sudo 提供的管理特权或 root 用户访问权限。有关如何配置 sudo 访问权限的详情,请参考 启用非特权用户,以运行某些命令
  • 您已从产品下载页面下载了最小安装引导 ISO 镜像。
  • 如果您需要自定义 CA 捆绑包,那么您需要准备好了一个带有 %certificate 部分的 Kickstart 文件。
  • lorax 软件包已安装。

流程

  1. 可选:创建带有 %certificate 部分的 Kickstart 文件。确保证书保存在名为 tls-ca-bundle.pem 的文件中。

    %certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem
    -----BEGIN CERTIFICATE-----
    <Base64-encoded_certificate_content>
    -----END CERTIFICATE-----
    %end
    Copy to Clipboard Toggle word wrap
  2. 将 Kickstart 文件和内核参数添加到 ISO 中:

    下面的脚本示例演示了如何创建一个自定义的启用了 eDNS 的可引导 ISO。您必须创建一个脚本文件来自动化此过程。

    #!/bin/bash
    
    set -ex
    
    KERNELARGS=""
    
    # Enable network
    KERNELARGS+="ip=dhcp "
    
    # Set DoT DNS server
    KERNELARGS+="rd.net.dns=dns+tls://_<server_ip>_#_<dns_server_hostname>_ "
    
    # Set to 'exclusive' to disable fallback to unencrypted DNS. Other values: 'backup', 'prefer'.
    KERNELARGS+="rd.net.dns-resolve-mode=exclusive "
    
    # Set the dnsconfd plugin for NetworkManager
    KERNELARGS+="rd.net.dns-backend=dnsconfd "
    
    # Remove any existing ISO to prevent conflicts with the new build
    rm -f _<output_iso_filename>_
    
    # Create a new bootable ISO with the Kickstart config file and kernel arguments
    mkksiso --ks _<kickstart_file>_ --cmdline "$KERNELARGS" _<input_iso_filename>_ _<output_iso_filename>_
    Copy to Clipboard Toggle word wrap
  3. 运行脚本。

    sh <script_filename>
    Copy to Clipboard Toggle word wrap
  4. 使用自定义 ISO 文件安装 RHEL。

验证

  • 验证您的 eDNS 配置:

    $ dnsconfd status
    Copy to Clipboard Toggle word wrap

    预期输出:

    Running cache service:
    unbound
    Resolving mode: exclusive
    Config present in service:
    {
        ".": [
            "dns+tls://198.51.100.143#dot.dns.example.com"
        ]
    }
    State of Dnsconfd:
    RUNNING
    Info about servers: [
        {
            "address": "198.51.100.143",
            "port": 853,
            "name": "dot.dns.example.com",
            "routing_domains": [
                "."
            ],
            "search_domains": [],
            "interface": null,
            "protocol": "dns+tls",
            "dnssec": true,
            "networks": [],
            "firewall_zone": null
        }
    ]
    Copy to Clipboard Toggle word wrap
  • 使用 nslookup 验证 DNS 服务器是否有响应:

    $ nslookup <domain_name>
    Copy to Clipboard Toggle word wrap

    <domain_name> 替换为您要查询的域。

故障排除

  • unbound 中启用详细日志记录:

    # unbound-control verbosity 5
    Copy to Clipboard Toggle word wrap
  • 查看相关服务的日志:

    $ journalctl -xe -u <service_name>
    Copy to Clipboard Toggle word wrap

    <service_name> 替换为 NetworkManagerdnsconfdunbound

5.4. 在现有 RHEL 安装上启用 eDNS

您可以在现有 RHEL 安装上启用加密的 DNS (eDNS),以使用 DNS-over-TLS 处理所有 DNS 流量。

先决条件

  • # 命令提示符开头的命令需要 sudo 提供的管理特权或 root 用户访问权限。有关如何配置 sudo 访问权限的详情,请参考 启用非特权用户,以运行某些命令
  • 有一个现有的 RHEL 安装。
  • 以下软件包已安装在您的系统上:

    • dnsconfd
    • dnsconfd-dracut
    • grubby
  • 如果在 IBM Z 系统上,则已安装了 zipl 工具。

流程

  1. /etc/NetworkManager/conf.d/global-dot.conf 文件中配置 NetworkManager:

    [main]
    dns=dnsconfd
    
    [global-dns]
    resolve-mode=exclusive
    
    [global-dns-domain-*]
    servers=dns+tls://<server_ip_1><dns_server_hostname_1>,dns+tls://<server_ip_2><dns_server_hostname_2>
    Copy to Clipboard Toggle word wrap

    有关全局 DNS 选项的详情,请查看您系统上 NetworkManager.conf (5) 手册页中的 GLOBAL-DNS SECTION

  2. 可选:要使用自定义 CA 捆绑包验证上游 DoT 服务器,请将 PEM 格式的文件复制到 /etc/pki/dns/extracted/pem/tls-ca-bundle.pem 文件中。

    注意

    /etc/pki/dns/extracted/pem 中添加或删除证书后,重启 dnsconfd 服务以应用更改。

  3. 启用 dnsconfd 服务:

    # systemctl enable --now dnsconfd
    Copy to Clipboard Toggle word wrap
  4. 重新载入 NetworkManager:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap
  5. 为所有安装的内核重新生成 initramfs,以包含 dnsconfd 及其配置:

    # for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do
        dracut -f --kver="$kernel"
    done
    Copy to Clipboard Toggle word wrap
  6. 将内核参数设置为当前和新安装的内核版本:

    # grubby --args="rd.net.dns=dns+tls://<server_ip>#<dns_server_hostname> rd.net.dns-resolve-mode=exclusive rd.net.dns-backend=dnsconfd" --update-kernel=ALL
    Copy to Clipboard Toggle word wrap
    • 如果在 IBM Z 上,更新引导菜单:

      # zipl
      Copy to Clipboard Toggle word wrap

验证

  • 验证您的 eDNS 配置:

    $ dnsconfd status
    Copy to Clipboard Toggle word wrap

    预期输出:

    Running cache service:
    unbound
    Resolving mode: exclusive
    Config present in service:
    {
        ".": [
            "dns+tls://198.51.100.143#dot.dns.example.com"
        ]
    }
    State of Dnsconfd:
    RUNNING
    Info about servers: [
        {
            "address": "198.51.100.143",
            "port": 853,
            "name": "dot.dns.example.com",
            "routing_domains": [
                "."
            ],
            "search_domains": [],
            "interface": null,
            "protocol": "dns+tls",
            "dnssec": true,
            "networks": [],
            "firewall_zone": null
        }
    ]
    Copy to Clipboard Toggle word wrap
  • 使用 nslookup 验证 DNS 服务器是否有响应:

    $ nslookup <domain_name>
    Copy to Clipboard Toggle word wrap

    <domain_name> 替换为您要查询的域。

故障排除

  • unbound 中启用详细日志记录:

    # unbound-control verbosity 5
    Copy to Clipboard Toggle word wrap
  • 查看相关服务的日志:

    $ journalctl -xe -u <service_name>
    Copy to Clipboard Toggle word wrap

    <service_name> 替换为 NetworkManagerdnsconfdunbound

5.5. DNS 配置的内核参数

您可以使用内核参数在引导时启用 DNS over TLS (DoT),并为您的系统设置 DNS 解析行为。

rd.net.dns-resolve-mode

定义在解析过程中如何使用全局配置中的 DNS 服务器。以下模式与内核参数和 NetworkManager.conf 全局配置相关:

exclusive
仅使用由内核参数或 NetworkManager.conf 中指定的 DNS 服务器。禁止回退到从连接检索的 DNS 服务器。这个模式目前只与 dnsconfd 插件相关。
prefer
对于常规查询,禁止使用来自连接的 DNS 服务器,除非查询是连接设置的域的子域。
backup
出于同样的目的,合并并使用来自全局配置和网络连接的 DNS 服务器。

rd.net.dns-servers

配置要使用的 DNS 服务器的列表。要定义多个 DNS 服务器,请多次设置 rd.net.dns

rd.net.dns=dns+tls://<server_ip_1>#<dns_server_hostname_1> rd.net.dns=dns+tls://<server_ip_2>#<dns_server_hostname_2>
Copy to Clipboard Toggle word wrap

例如:

rd.net.dns=dns+tls://198.51.100.143#dot.dns.example.com rd.net.dns=dns+tls://203.0.113.1#dot.dns.example.net
Copy to Clipboard Toggle word wrap

rd.net.dns-backend

指定后端 DNS 解析器。当设置为 dnsconfd 时,系统使用 dnsconfd 作为本地 DNS 缓存配置守护进程。

第 6 章 设置 IPsec VPN

Libreswan 是互联网协议安全(IPsec)协议套件的一种实现。您可以使用 Libreswan 配置虚拟专用网络(VPN),该网络在不受信任的网络(如互联网)之上建立安全加密的隧道。这些隧道确保数据在传输过程的保密性和完整性。常见用例包括将分支机构连接到总部,或为远程用户提供对公司网络的安全访问。

RHEL 提供不同的选项来配置 Libreswan:

  • 手动编辑 Libreswan 配置文件,来精细控制高级选项。
  • 使用 vpn RHEL 系统角色自动化创建 Libreswan VPN 配置的过程。
  • 使用 Nmstate ,通过声明性 API 配置 Libreswan 连接。

Libreswan 不使用 "client" 和 "server" 等术语。相反,IPsec 将端点称为"left"和"right"。此设计通常允许您在两个主机上使用相同的配置,因为 Libreswan 会动态决定要采用哪个角色。按照惯例,管理员通常对本地主机使用"left",对远程主机使用"right"。

注意

Libreswan 是 RHEL 中唯一支持的 VPN 技术。

IPsec 依赖于标准化的协议,如互联网密钥交换(IKE),以确保不同的系统可以有效地通信。然而,在实践中,厂商如何实施这些标准的微小差异可能会导致兼容性问题。如果您在将 Libreswan 连接到第三方 IPsec 对等点时遇到这种互操作性问题,请联系 红帽支持

6.1. IPsec VPN 中的组件

设置 IPsec VPN 涉及以下主要组件:

  • Internet Key Exchange (IKE):两个端点使用这个协议相互验证,并协商连接的规则,包括要使用的加密算法。Libreswan 在名为 pluto 的守护进程中实施 IKE 协议。
  • IPsec :根据 IKE 协商过程中达成的策略,实际加密和传输数据的协议的一部分。Linux 内核实现了 IPsec 协议套件。

6.2. Libreswan 身份验证方法

Libreswan 支持以下验证方法:

预共享密钥
预共享密钥(PSK)方法通过使用同一 secret 相互验证而涉及两个端点。PSK 提供简单和广泛的兼容性,使其适合小规模部署。但是,如果密钥被重复使用或没有频繁轮转,则管理 PSK 会带来风险。对于安全性,PSK 应该包含超过 64 个随机字符,如果主机在 FIPS 模式下运行,则必须满足 FIPS 强度要求。
原始 RSA 密钥
此方法在每个对等点上使用 RSA 公钥和私钥对进行相互识别。原始 RSA 密钥提供比 PSK 更强的安全性,对于不需要完整证书基础架构的环境来说是理想的选择。
X.509 证书
此方法使用由可信证书颁发机构(CA)发布的 X.509 证书。每个对等点使用其证书和私钥来证明其身份,另一个对等点针对受信任的 CA 进行验证。在为大型企业提供最高级别的安全性和可扩展性时,这种方法更为复杂,因为它需要部署和维护一个公钥基础设施(PKI)。
NULL 身份验证
这个方法只提供对等点之间没有身份验证的加密。由于它不验证远程端点的身份,因此 NULL 身份验证是不安全的,不提供针对中间人攻击的保护。
保护量子计算机
虽然不是独立的身份验证方法,但 Libreswan 提供 Post-quantum Pre-shared Keys (PPK),来保护现代 IKEv2 连接免受量子计算机的未来攻击。这个功能是必要的,因为旧的 IKEv1 协议或标准 IKEv2 本身都不具备固有的抗量子性。PPK 在主身份验证方法之上增加了另一个安全层,其安全依赖于使用通过外部通信渠道安全分发的加密强密钥。

主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。

对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。

在两个主机上执行步骤。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建一个 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 工具将密钥对存储在 NSS 数据库中。

  3. 指定您的对等服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,将另一个主机指定为 right。这是一个武断的选择。常见的做法是调用您的本地主机 left 和远程主机right
  4. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    后面步骤中需要两个对等点的 CKAID。

  5. 显示公钥:

    1. 在左侧对等点中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右侧对等点中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令显示公钥,以及必须在配置文件中使用的相应参数。

  6. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/host-to-host.conf 文件:

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Peer A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@peer_a
        leftrsasigkey=<public_key_of_left_peer>
    
        # Peer B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@peer_b
        rightrsasigkey=<public_key_of_right_peer>
    Copy to Clipboard Toggle word wrap
    注意

    您可以在两个主机上使用相同的配置文件,Libreswan 使用内部信息识别其在左还是右主机上运行。但是,重要的是 left* 参数中的所有值都属于一个对等点,right* 参数中的值属于另一个对等点。

    示例中指定的设置包括:

    conn <connection_name>
    定义连接名称。名称是任意的,Libreswan 使用它来识别连接。您必须至少使用一个空格或标签页缩进这个连接中的参数。
    auto=<type>
    控制如何发起连接。如果将值设为 start,Libreswan 会在服务启动时自动激活连接。
    authby=rsasig
    为此连接启用 RSA 签名身份验证。
    left=<ip_address_or_fqdn_of_left_peer> and right=<ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=<id> and rightid=<id>
    定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个完全限定域名(FQDN)、IP 地址或字面字符串。在后一种情况,在字符串前面加上 @ 符号。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
  7. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的 ipsec.conf (5) 手册页。

验证

  • 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出会包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全联盟(SA)现在已准备好协商实际的数据加密隧道,称为子 SA 或阶段 2 SA。

    • 一个子 SA 已建立:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

后续步骤

站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这使分支机构中的设备能够访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。

对于验证网关设备,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。

对两个网关设备执行这些步骤。

先决条件

  • 两个网络中的路由确保发送到远程网络的流量通过本地 VPN 网关设备进行发送。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建一个 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 工具将密钥对存储在 NSS 数据库中。

  3. 指定您的对等服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,将另一个主机指定为 right。这是一个武断的选择。常见的做法是调用您的本地主机 left 和远程主机right
  4. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    后面步骤中需要两个对等点的 CKAID。

  5. 显示公钥:

    1. 在左侧对等点中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右侧对等点中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令显示公钥,以及必须在配置文件中使用的相应参数。

  6. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,创建带有以下设置的 /etc/ipsec.d/site-to-site.conf 文件:

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Site A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@site_a
        leftrsasigkey=<public_key_of_left_peer>
        leftsubnet=192.0.2.0/24
    
        # Site B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@site_b
        rightrsasigkey=<public_key_of_right_peer>
        rightsubnet={198.51.100.0/24, 203.0.113.0/24}
    Copy to Clipboard Toggle word wrap
    注意

    您可以对两个网关设备使用相同的配置文件,Libreswan 使用内部信息识别其在左还是右主机上操作。但是,重要的是 left* 参数中的所有值都属于一个对等点,right* 参数中的值属于另一个对等点。

    示例中指定的设置包括:

    conn <connection_name>
    定义连接名称。名称是任意的,Libreswan 使用它来识别连接。您必须至少使用一个空格或标签页缩进这个连接中的参数。
    auto=<type>
    控制如何发起连接。如果将值设为 start,Libreswan 会在服务启动时自动激活连接。
    authby=rsasig
    为此连接启用 RSA 签名身份验证。
    left=<ip_address_or_fqdn_of_left_peer> and right=<ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=<id> and rightid=<id>
    定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个完全限定域名(FQDN)、IP 地址或字面字符串。在后一种情况,在字符串前面加上 @ 符号。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftsubnet=<subnet> and rightsubnet=<subnet>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。如果要在一端隧道连接多个子网,请在大括号中指定它们,并使用逗号分隔它们。
  7. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  8. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的 ipsec.conf (5) 手册页。

验证

  1. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出会包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:

      #2: "<connection_name>":500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 28523s; REPLACE in 28793s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全联盟(SA)现在已准备好协商实际的数据加密隧道,称为子 SA 或阶段 2 SA。

    • 一个子 SA 已建立:

      #3: "<connection_name>":500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 28523s; REPLACE in 28793s; newest; eroute owner; IKE SA #2; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  2. 从本地子网中的客户端 ping 远程子网中的客户端。

后续步骤

主机到站点的 VPN 在单独的远程计算机和私有网络之间建立一个安全的、加密的连接,允许它们在不安全的公共网络(如互联网)间无缝链接。这对于需要从他们的计算机访问公司内部网络上的资源的远程员工很理想,就好像他们在办公室中一样。

对于身份验证,使用证书颁发机构(CA)管理的数字证书提供了一个高度安全且可扩展的解决方案。每个连接主机和网关都提供一个由可信 CA 签名的证书。这个方法提供强大的、可验证的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

6.5.1. 手动设置 IPsec 网关

您必须正确配置 Libreswan IPsec 网关,以启用安全远程访问。Libreswan 从网络安全服务(NSS)数据库读取服务器证书、私钥和 CA 证书。

以下示例允许经过身份验证的用户访问内部 192.0.2.0/24 子网,并将虚拟 IP 池中的 IP 地址动态分配给每个客户端。为保持安全性,网关会验证客户端证书是否由同一可信 CA 发布,并自动使用证书撤销列表(CRL)来确保对于任何撤销的证书,访问被拒绝。

先决条件

  • 公共密钥加密标准 #12 (PKCS #12)文件 ~/file.p12 在带有以下内容的网关上存在:

    • 服务器的私钥
    • 服务器证书
    • CA 证书
    • 中间证书(如果需要的话)

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 服务器证书包含以下字段:

    • 扩展的密钥用法(EKU)被设置为 TLS Web Server Authentication
    • 通用名称(CN)或主题备用名称(SAN)被设置为网关的完全限定域名(FQDN)。
    • X509v3 CRL 分发点包含证书撤销列表(CRL)的 URL。
  • VPN 客户端流量的返回路由在内部网络上配置,指向 VPN 网关。

流程

  1. 如果 Libreswan 尚未安装:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCS #12 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示服务器和 CA 证书的昵称:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    vpn-gateway              u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    您需要将此信息用于配置文件。

  4. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,创建带有以下设置的 /etc/ipsec.d/host-to-site.conf 文件:

    1. 添加 config setup 部分,以启用 CRL 检查:

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      crl-strict=yes
      启用 CRL 检查。如果 NSS 数据库中没有 CRL,则身份验证客户端将被拒绝。
      crlcheckinterval=1h
      在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
    2. 为网关添加一部分:

      conn <connection_name>
          # General setup and authentication type
          auto=start
          ikev2=insist
          authby=rsasig
      
          # VPN gateway settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          leftsubnet=192.0.2.0/24
          rekey=no
          mobike=yes
          narrowing=yes
      
          # Client-related settings
          right=%any
          rightid=%fromcert
          rightrsasigkey=%cert
          rightaddresspool=198.51.100.129-198.51.100.254
          rightmodecfgclient=yes
          modecfgclient=yes
          modecfgdns=192.0.2.5
          modecfgdomains="example.com"
      
          # Dead Peer Detection
          dpddelay=30
          dpdtimeout=120
          dpdaction=clear
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      ikev2=insist
      将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。
      left=%defaultroute
      ipsec 服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将 left 参数设置为 IP 地址或主机的 FQDN。
      leftid=%fromcertrightid=%fromcert
      将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
      leftcert="<server_certificate_nickname>"
      设置 NSS 数据库中使用的服务器证书的昵称。
      leftrsasigkey=%certrightrsasigkey=%cert
      将 Libreswan 配置为使用嵌入在证书中的 RSA 公钥。
      leftsendcert=always
      指示网关始终发送证书,以便客户端可以针对 CA 证书验证它。
      leftsubnet=<subnets>
      指定连接到客户端可以通过隧道访问的网关的子网。
      mobike=yes
      使客户端能够在网络之间无缝漫游。
      rightaddresspool=<ip_range>
      指定网关可以为客户端分配 IP 地址的范围。
      modecfgclient=yes
      使客户端能够接收 modecfgdns 参数中设置的 DNS 服务器 IP,以及 modecfgdomains 中设置的 DNS 搜索域。

    有关示例中使用的所有参数的详情,请查看您系统上的 ipsec.conf (5) 手册页。

  5. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的 ipsec.conf (5) 手册页。

验证

  1. 配置一个客户端并连接到 VPN 网关
  2. 检查服务是否已载入 CRL ,并将条目添加到 NSS 数据库中:

    # ipsec listcrls
    
    List of CRLs:
    
    issuer: CN=Example-CA
    revoked certs: 1
    updates: this Tue Jul 15 10:22:36 2025
             next Sun Jan 11 10:22:36 2026
    
    List of CRL fetch requests:
    
    Jul 15 15:13:56 2025, trials: 1
           issuer:  'CN=Example-CA'
           distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

后续步骤:

要访问远程私有网络上的资源,用户必须首先配置一个 IPsec VPN 连接。GNOME Settings 应用程序提供一个在 NetworkManager 中创建 IPsec VPN 连接配置文件并建立隧道的图形化解决方案。

先决条件

  • 您已配置了 IPsec VPN 网关
  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • PKCS #12 文件 ~/file.p12 在客户端上存在,并包含以下内容:

    • 用户的私钥
    • 用户证书
    • CA 证书
    • 中间证书(如果需要的话)

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 证书中的扩展密钥用法(EKU)被设置为 TLS Web Client Authentication

流程

  1. 初始化网络安全服务(NSS)数据库:

    # ipsec initnss
    Copy to Clipboard Toggle word wrap

    命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

  2. 将 PKCS #12 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示用户和 CA 证书的昵称:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    在配置文件中,您需要此信息。

  4. Super 键,输入 Settings,然后按 Enter 键打开 GNOME Settings 应用程序。
  5. VPN 条目旁边的 + 按钮。
  6. 从列表中选择 IPsec based VPN
  7. Identity 选项卡上,按如下所示填写字段:

    Expand
    表 6.1. Identity 选项卡设置
    字段名称相应的 ipsec.conf 参数

    Name

    <networkmanager_profile_name>

    N/A

    Gateway

    <ip_address_or_fqdn_of_the_gateway>

    right

    Type

    IKEv2 (certificate)

    authby

    Group name

    %fromcert

    leftid

    Certificate name

    <user_certificate_nickname>

    leftcert

    Remote ID

    %fromcert

    rightid

  8. 单击 Advanced
  9. Advanced properties 窗口中,填写 Connectivity 选项卡的字段,如下所示:

    Expand
    表 6.2. Connectivity 选项卡设置
    字段名称相应的 ipsec.conf 参数

    Remote Network

    192.0.2.0/24

    rightsubnet

    Narrowing

    Selected

    narrowing

    Enable MOBIKE

    yes

    mobike

    Delay

    30

    dpddelay

    Timeout(超时)

    120

    dpdtimeout

    操作

    清除

    dpdaction

  10. Apply 返回到连接设置。
  11. Apply 保存连接。
  12. Settings 应用程序的 Network 选项卡中,切换 VPN 配置文件旁边的开关来激活连接。

验证

  • 建立到远程网络中主机的连接或 ping 它。

后续步骤

IPsec 网格创建一个完全互连的网络,其中每个服务器都可以与所有其他服务器安全并直接通信。这对于跨多个数据中心或云提供商的分布式数据库集群或高可用性环境很理想。在每对服务器之间建立一个直接和加密的隧道可确保安全通信,而没有中央瓶颈。

对于身份验证,使用证书颁发机构(CA)管理的数字证书提供了一个高度安全且可扩展的解决方案。网格中的每个主机都提供一个由可信 CA 签名的证书。这个方法提供强大的、可验证的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

先决条件

  • 网格中每个对等点上都存在一个公共密钥加密标准 #12 (PKCS #12)文件,其包含以下内容:

    • 服务器的私钥
    • 服务器证书
    • CA 证书
    • 中间证书(如果需要的话)

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 服务器证书包含以下字段:

    • 扩展的密钥用法(EKU)被设置为 TLS Web Server Authentication
    • 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
    • X509v3 CRL 分发点包含证书撤销列表(CRL)的 URL。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCS #12 文件导入到 NSS 数据库中:

    # ipsec import <file>.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示服务器和 CA 证书的昵称:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    server1                  u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    您需要将此信息用于配置文件。

  4. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,创建带有以下设置的 /etc/ipsec.d/mesh.conf 文件:

    1. 添加 config setup 部分,以启用 CRL 检查:

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      crl-strict=yes
      启用 CRL 检查。如果 NSS 数据库中没有 CRL,则验证对等点将被拒绝。
      crlcheckinterval=1h
      在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
    2. 添加一个在网格中的成员之间强制流量的部分:

      conn <connection_name>
          # General setup and authentication type
          auto=ondemand
          authby=rsasig
      
          # Local settings settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          failureshunt=drop
          type=transport
      
          # Settings related to other peers in the mesh
          right=%opportunisticgroup
          rightid=%fromcert
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      left=%defaultroute
      ipsec 服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将 left 参数设置为 IP 地址或主机的 FQDN。
      leftid=%fromcertrightid=%fromcert
      将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
      leftcert="<server_certificate_nickname>"
      设置 NSS 数据库中使用的服务器证书的昵称。
      leftrsasigkey=%cert
      将 Libreswan 配置为使用嵌入在证书中的 RSA 公钥。
      leftsendcert=always
      指示对等点始终发送证书,以便对等点可以针对 CA 证书验证它。
      failureshunt=drop
      如果 IPsec 协商失败,强制实施加密并丢弃流量。这对于安全网格至关重要。
      right=%opportunisticgroup
      指定连接应应用到策略文件中定义的动态远程对等点组。这使 Libreswan 能够对该组中每个列出的 IP 或子网实例化 IPsec 隧道。

    有关示例中使用的所有参数的详情,请查看您系统上的 ipsec.conf (5) 手册页。

  5. 创建 /etc/ipsec.d/policies/server-mesh 策略文件,该文件以无类别域间路由(CIDR)格式指定对等点或子网:

    192.0.2.0/24
    198.51.100.0/24
    Copy to Clipboard Toggle word wrap

    使用这些设置,ipsec 服务会加密这些子网中主机之间的流量。如果主机没有配置为 IPsec 网格的成员,则此主机和网格成员之间的通信会失败。

  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  7. 对您在策略文件中指定的子网中的每个主机重复这个过程。

验证

  1. 将流量发送到网格中的主机来建立隧道。例如,ping 主机:

    # ping -c3 <peer_in_mesh>
    Copy to Clipboard Toggle word wrap
  2. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果连接成功建立了,输出会包含对等点的以下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:

      #1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全联盟(SA)现在已准备好协商实际的数据加密隧道,称为子 SA 或阶段 2 SA。

    • 一个子 SA 已建立:

      #2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  3. 检查服务是否已载入 CRL ,并将条目添加到 NSS 数据库中:

    # ipsec listcrls
    
    List of CRLs:
    
    issuer: CN=Example-CA
    revoked certs: 1
    updates: this Tue Jul 15 10:22:36 2025
             next Sun Jan 11 10:22:36 2026
    
    List of CRL fetch requests:
    
    Jul 15 15:13:56 2025, trials: 1
           issuer:  'CN=Example-CA'
           distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

后续步骤

6.7. 使用密码保护 IPsec NSS 数据库

默认情况下,只有 root 用户可以访问 /var/lib/ipsec/nss/ 目录中的 IPsec 网络安全服务(NSS)数据库。如果需要,您还可以使用密码保护数据库。例如,如果您在联邦信息处理标准(FIPS)模式下运行 RHEL,则需要这个。

先决条件

  • /var/lib/ipsec/nss/ 目录包含 NSS 数据库。

流程

  1. 为 Libreswan NSS 数据库启用密码保护:

    # certutil -W -d /var/lib/ipsec/nss/
    Copy to Clipboard Toggle word wrap
  2. 输入当前密码:

    Enter Password or Pin for "NSS Certificate DB": <password>
    Copy to Clipboard Toggle word wrap

    如果数据库目前不受密码保护,请按 Enter 键。

  3. 输入新密码:

    Enter new password: <new_password>
    Re-enter password: <new_password>
    Copy to Clipboard Toggle word wrap
  4. 要解锁数据库,ipsec 服务需要 /etc/ipsec.d/nsspassword 文件。使用以下内容创建文件:

    • 如果主机没有在 FIPS 模式下运行:

      NSS Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
    • 如果主机在 FIPS 模式下运行:

      NSS FIPS 140-2 Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
  5. /etc/ipsec.d/nsspassword 文件设置安全权限:

    # chmod 600 /etc/ipsec.d/nsspassword
    # chown root:root /etc/ipsec.d/nsspassword
    Copy to Clipboard Toggle word wrap
  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

验证

  1. 验证 ipsec 服务是否正在运行:

    # systemctl is-active ipsec
    Copy to Clipboard Toggle word wrap

    如果命令返回 active,则服务成功使用密码文件解锁 NSS 数据库。

  2. 对需要密码的 NSS 数据库执行一个操作。例如,显示私钥:

    # certutil -K -d /var/lib/ipsec/nss/
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    Copy to Clipboard Toggle word wrap

    验证命令是否提示输入密码。

6.8. 在启用了 FIPS 模式的系统上使用 IPsec

在联邦信息处理标准(FIPS)模式下的 RHEL 专门使用 FIPS 140-2 或 FIPS 140-3 验证的加密模块,自动禁用旧的协议和密码。启用 FIPS 模式通常是联邦合规性的要求,并增强了系统安全性。

RHEL 提供的 Libreswan IPsec 实现完全符合 FIPS。当系统在 FIPS 模式下时,Libreswan 自动使用经过认证的加密模块,而不需要任何额外的配置,无论 Libreswan 是否安装在新的启用了 FIPS 的系统上,或者 FIPS 模式是否已在带有现有 Libreswan VPN 的系统上激活。

如果启用了 FIPS 模式,您可以确认 Libreswan 是否在 FIPS 模式下运行:

# ipsec whack --fipsstatus
FIPS mode enabled
Copy to Clipboard Toggle word wrap

要在 FIPS 模式下列出 Libreswan 中允许的算法和密码,请输入:

# ipsec pluto --selftest 2>&1
...
FIPS Encryption algorithms:
  AES_CCM_16  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm, aes_ccm_c
  AES_CCM_12  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_b
  AES_CCM_8   {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_a
...
Copy to Clipboard Toggle word wrap

6.9. 为 IPsec VPN 连接配置 TCP 回退

在阻止 UDP 和封装安全 Payload (ESP)协议的限制网络上,标准 IPsec VPN 可能会失败。为确保此类环境中的连接性,Libreswan 可以在 TCP 连接中封装所有 VPN 流量,这是 RFC 8229 中所述的一种方法。

重要

在 TCP 中封装 VPN 数据包可减少吞吐量,并增加延迟。因此,只使用 TCP 封装作为一个回退选项,或者基于 UDP 的连接是否在您的环境中始终被阻止。

先决条件

  • IPsec 连接已配置。

流程

  1. 编辑 /etc/ipsec.conf 文件,并在 config setup 部分中进行以下更改:

    1. 将 Libreswan 配置为侦听一个 TCP 端口:

      listen-tcp=yes
      Copy to Clipboard Toggle word wrap
    2. 默认情况下,Libreswan 侦听端口 4500。如果要使用不同的端口,请输入:

      tcp-remoteport=<port_number>
      Copy to Clipboard Toggle word wrap
    3. 如果 UDP 不可用或永久不可用,决定是否将 TCP 用作一个回退选项:

      • 作为一个回退选项,请输入:

        enable-tcp=fallback
        retransmit-timeout=5s
        Copy to Clipboard Toggle word wrap

        默认情况下,在通过 TCP 重试连接前,Libreswan 会在尝试连接失败后等待 60 秒。降低 retransmit-timeout 值会缩短延迟,使回退协议可以更快地启动。

      • 作为 UDP 的永久替换,请输入:

        enable-tcp=yes
        Copy to Clipboard Toggle word wrap
  2. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  3. 如果您配置了一个与默认 4500 不同的 TCP 端口,请在防火墙中打开该端口:

    # firewall-cmd --permanent --add-port=<tcp_port>/tcp
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  4. 在使用此网关的对等点上重复这个过程。

6.10. 在 Libreswan 中启用旧的密码和算法

RHEL 使用系统范围的加密策略为所有应用程序(包括 Libreswan )实施一致且安全的基准。这些策略确保 IPsec 和互联网密钥交换(IKE)默认只使用强大的现代的加密密码和算法。但是,您可能需要有意降低安全性,以便与其他 IPsec 对等点向后兼容。

RHEL 系统范围的加密策略会创建一个名为 %default 的特殊连接。此连接为 keyexchangeespike 参数设置默认值。

先决条件

  • Libreswan 已安装。

流程

  1. 要覆盖 RHEL 系统范围的加密策略设置的默认值,请在连接配置中添加 keyexchangeespike 参数,并将它们设置为您需要的值。例如:

    conn <connection_name>
        keyexchange=ikev1
        ike=aes-sha2,aes-sha1;modp2048
        esp=aes-sha2,aes-sha1
        ...
    Copy to Clipboard Toggle word wrap
  2. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口,而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并在 CVE-2024-3661 漏洞文章中进行了所述。

要缓解此漏洞,您可以将 VPN 连接分配给一个专用的路由表。这可防止 DHCP 配置或 SLAAC 操纵用于 VPN 隧道的网络数据包的路由决策。

如果至少有一个条件适用于到您的环境,请按照以下步骤操作:

  • 至少有一个网络接口使用 DHCP 或 SLAAC。
  • 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
重要

通过 VPN 路由整个流量可防止主机访问本地网络资源。

流程

  1. 决定您要使用哪个路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
  2. 配置 VPN 连接配置文件,来将 VPN 路由放在专用的路由表中:

    # nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
    Copy to Clipboard Toggle word wrap
  3. 为您在之前的命令中使用的表设置一个低优先级值:

    # nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
    Copy to Clipboard Toggle word wrap

    优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。

  4. 重新连接 VPN 连接:

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard Toggle word wrap

验证

  1. 显示表 75 中的 IPv4 路由:

    # ip route show table 75
    ...
    192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50
    default dev vpn_device proto static scope link metric 50
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了 ipv4.never-default true,则不会创建默认路由,因此在此输出中不可见。

  2. 显示表 75 中的 IPv6 路由:

    # ip -6 route show table 75
    ...
    2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium
    default dev vpn_device proto static metric 50 pref medium
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了 ipv6.never-default true,则不会创建默认路由,因此在此输出中不可见。

6.12. 使用 RHEL 系统角色配置 IPsec VPN 连接

您可以使用虚拟专用网络(VPN)建立一个在不可信网络(如互联网)上的安全的、加密的隧道。此类隧道确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部。

通过使用 vpn RHEL 系统角色,您可以自动化创建 Libreswan IPsec VPN 配置的过程。

注意

vpn RHEL 系统角色只能创建 VPN 配置,该配置使用预共享密钥(PSK)或证书来相互验证对等点。

主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。

对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。

通过使用 vpn RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 主机到主机连接的过程。默认情况下,角色创建一个基于隧道的 VPN。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                  managed-node-02.example.com:
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: <list>

    定义一个带有您要在它们之间配置 VPN 的对等点的 YAML 字典。如果条目不是一个 Ansible 管理的节点,则您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    角色在每个受管节点上配置 VPN 连接。连接名为 <peer_A>-to-<peer_B>,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    auth_method: psk
    在对等点之间启用 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。

对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。

例如,要通过最大程度减少被截获或中断的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 PSK 身份验证的 IPsec 主机到主机连接的过程。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - name: control_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 203.0.113.1  # IP address for the control plane
                  managed-node-02.example.com:
                    hostname: 198.51.100.2 # IP address for the control plane
                auth_method: psk
                auto: start
              - name: data_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 10.0.0.1   # IP address for the data plane
                  managed-node-02.example.com:
                    hostname: 172.16.0.2 # IP address for the data plane
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: <list>

    定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为 <name>-<IP_address_A>-to-<IP_address_B>,例如 control_plane_vpn-203.0.113.1-to-198.51.100.2

    角色在每个受管节点上配置 VPN 连接。请注意,角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。

    auth_method: psk
    在主机之间启用 PSK 身份验证。角色在控制节点上使用 openssl 来创建预共享密钥。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这使分支机构中的设备能够访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。

对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。

通过使用 vpn RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 站点到站点连接的过程。默认情况下,角色创建一个基于隧道的 VPN。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                    subnets:
                      - 192.0.2.0/24
                  managed-node-02.example.com:
                    subnets:
                      - 198.51.100.0/24
                      - 203.0.113.0/24
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: <list>

    定义一个带有您要在它们之间配置 VPN 的网关的 YAML 字典。如果条目不是 Ansible 管理的节点,您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    角色在每个受管节点上配置 VPN 连接。连接名为 <gateway_A>-to-<gateway_B>,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    subnets: <yaml_list_of_subnets>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
    auth_method: psk
    在对等点之间启用 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

IPsec 网格创建一个完全互连的网络,其中每个服务器都可以与所有其他服务器安全并直接通信。这对于跨多个数据中心或云提供商的分布式数据库集群或高可用性环境很理想。在每对服务器之间建立一个直接和加密的隧道可确保安全通信,而没有中央瓶颈。

对于身份验证,使用证书颁发机构(CA)管理的数字证书提供了一个高度安全且可扩展的解决方案。网格中的每个主机都提供一个由可信 CA 签名的证书。这个方法提供强大的、可验证的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您可以为每个受管节点准备一个 PKCS #12 文件:

    • 每个文件包含:

      • 服务器的私钥
      • 服务器证书
      • CA 证书
      • 中间证书(如果需要的话)
    • 文件被命名为 <managed_node_name_as_in_the_inventory>.p12
    • 文件存储在与 playbook 相同的目录中。
    • 服务器证书包含以下字段:

      • 扩展的密钥用法(EKU)被设置为 TLS Web Server Authentication
      • 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
      • X509v3 CRL 分发点包含证书撤销列表(CRL)的 URL。

流程

  1. 编辑 ~/inventory 文件,并附加 cert_name 变量:

    managed-node-01.example.com cert_name=managed-node-01.example.com
    managed-node-02.example.com cert_name=managed-node-02.example.com
    managed-node-03.example.com cert_name=managed-node-03.example.com
    Copy to Clipboard Toggle word wrap

    cert_name 变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。

  2. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pkcs12_pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Initialize IPsec NSS database if not initialized
          ansible.builtin.command:
            cmd: ipsec initnss
          when: db_files.matched == 0
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    opportunistic: true
    在多个主机之间启用机会网格。policies 变量定义哪些子网和主机流量必须或可以加密,并且其中哪些应该继续使用纯文本连接。
    auth_method: cert
    启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的昵称。
    policies: <list_of_policies>

    以 YAML 列表格式定义 Libreswan 策略。

    默认策略是 private-or-clear。要将它改为 private,上面的 playbook 包含默认 cidr 条目的一个相应策略。

    如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个 clear 策略。例如,如果应该为 192.0.2.0/24 子网配置网格,并且控制节点使用 IP 地址 192.0.2.1,则您需要一个用于192.0.2.1/32clear 策略,如 playbook 中所示。

    有关策略的详情,请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。

    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  4. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 在网格的一个节点上,ping 另一个节点来激活连接:

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard Toggle word wrap
  2. 确认连接处于活跃状态:

    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

6.13. 使用 nmstatectl 配置 IPsec VPN 连接

您可以使用虚拟专用网络(VPN)建立一个在不可信网络(如互联网)上的安全的、加密的隧道。此类隧道确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部。

您可以使用 nmstatectl 工具通过 Nmstate API 配置 Libreswan IPsec VPN 连接。nmstatectl 工具是一个命令行工具,来通过声明性 Nmstate API 管理主机网络。不必运行多个必需命令式命令来配置接口,您可以在 YAML 文件中定义预期的状态。然后,nmstate 采用此定义并将其应用到系统。这种方法的关键优点是原子结果。nmstate 确保生成的配置与您的 YAML 定义准确匹配。如果配置的任何一部分无法应用,它会自动回滚所有更改,并防止系统进入到一个不正确或损坏的网络状态。

注意

由于 NetworkManager-libreswan 插件的设计,您只能在一个对等点上使用 nmstatectl,必须在另一个对等点上手动配置 Libreswan。

主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。

对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。

您可以使用 Nmstate API 配置与现有 Libreswan IPsec 主机的连接。在这种情况下,Nmstate 可确保生成的配置与 YAML 文件中的定义匹配,或者它自动回滚更改,以避免不正确的系统状态。请注意,Nmstate 只验证状态,且不会防止错误但有效的配置。

注意

通常,选择哪个主机是 leftright 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right

先决条件

  • 远程对等点运行 Libreswan IPsec,并为 主机到主机 连接做好了准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建一个 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 工具将密钥对存储在 NSS 数据库中。

  3. 显示左和右对等点上的证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    后面步骤中需要两个对等点的 CKAID。

  4. 显示公钥:

    1. 在左侧对等点中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右侧对等点中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令显示公钥,以及必须在配置文件中使用的相应参数。

  5. 创建一个包含以下内容的 YAML 文件,如 ~/ipsec-host-to-host-rsa-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: <ip_address_of_right_peer>/32
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在使用 Nmstate 的主机配置中,此设置是必须的。
    left=<ip_address_or_fqdn_of_left_peer> and right=<ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=<id> and rightid=<id>
    定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个 IP 地址或一个字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加一个前导 @ 符号。这要求 Libreswan peer 也使用字面字符串作为 ID 或身份验证失败。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftmodecfgclient: false
    在此主机上禁用动态配置。在使用 Nmstate 的主机配置中,此设置是必须的。
    rightsubnet: <ip_address_of_right_peer>/32
    定义主机只能访问这个对等点。在使用 Nmstate 的主机配置中,此设置是必须的。
  6. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出会包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全联盟(SA)现在已准备好协商实际的数据加密隧道,称为子 SA 或阶段 2 SA。

    • 一个子 SA 已建立:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。

后续步骤

站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这可让分支机构中的设备访问公司总部的资源,就如同它们是同一本地网络的一部分一样。

对于验证网关设备,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。

您可以使用 Nmstate API 配置与现有 Libreswan IPsec 网关的连接。在这种情况下,Nmstate 可确保生成的配置与 YAML 文件中的定义匹配,或者它自动回滚更改,以避免不正确的系统状态。请注意,Nmstate 只验证状态,且不会防止错误但有效的配置。

注意

通常,选择哪个主机命是 leftright 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right

先决条件

  • 远程网关运行 Libreswan IPsec,并为 站点到站点 连接做好了准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建一个 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 工具将密钥对存储在 NSS 数据库中。

  3. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    在以下步骤中,您需要两个对等点的 CKAID。

  4. 显示公钥:

    1. 在左侧对等点中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右侧对等点中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令显示公钥,以及必须在配置文件中使用的相应参数。

  5. 创建一个包含以下内容的 YAML 文件,如 ~/ipsec-site-to-site-rsa-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
        leftsubnet: 198.51.100.0/24
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。此设置在使用 Nmstate 的站点到站点配置中是必须的。
    left=<ip_address_or_fqdn_of_left_peer> and right=<ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=<id> and rightid=<id>
    定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个 IP 地址或一个字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加一个前导 @ 符号。这要求 Libreswan peer 也使用字面字符串作为 ID 或身份验证失败。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftmodecfgclient: false
    在此主机上禁用动态配置。此设置在使用 Nmstate 的站点到站点配置中是必须的。
    leftsubnet=<subnet> and rightsubnet=<subnet>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
  6. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  7. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出会包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全联盟(SA)现在已准备好协商实际的数据加密隧道,称为子 SA 或阶段 2 SA。

    • 一个子 SA 已建立:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  2. 从本地子网中的客户端 ping 远程子网中的客户端。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。

后续步骤

要访问远程私有网络上的资源,用户必须首先配置一个 IPsec VPN 连接。您可以使用 Nmstate API 配置与现有 Libreswan IPsec 网关的连接。在这种情况下,Nmstate 可确保生成的配置与 YAML 文件中的定义匹配,或者它自动回滚更改,以避免不正确的系统状态。请注意,Nmstate 只验证状态,且不会防止错误但有效的配置。

注意

通常,选择哪个主机是 leftright 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right

先决条件

  • 远程网关运行 Libreswan IPsec,并为带有 基于证书的身份验证的主机到站点 连接做好了准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。

  • PKCS#12 文件 ~/file.p12 在客户端上存在,并包含以下内容:

    • 用户的私钥
    • 用户证书
    • CA 证书
    • 中间证书(如果需要的话)

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 证书中的扩展密钥用法(EKU)被设置为 TLS Web Client Authentication

流程

  1. 如果 Libreswan 尚未安装:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      命令在 /var/lib/ipsec/nss/ 目录下创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCS #12 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示用户和 CA 证书的昵称:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    您在 Nmstate YAML 文件中需要此信息。

  4. 创建一个包含以下内容的 YAML 文件,如 ~/ipsec-host-to-site-cert-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: '%fromcert'
        leftcert: <user_certificate_nickname>
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: '%fromcert'
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。此设置在使用 Nmstate 的主机到站点配置中是必须的。
    left=<ip_address_or_fqdn_of_left_peer> and right=<ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=%fromcertrightid=%fromcert
    将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
    leftcert="<server_certificate_nickname>"
    设置 NSS 数据库中使用的服务器证书的昵称。
    rightsubnet: <subnet>
    定义无类别域间路由(CIDR)格式的连接到网关的子网。
  5. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  • 建立到远程网络中主机的连接或 ping 它。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。

后续步骤

6.14. IPsec 配置故障排除

诊断 IPsec 配置失败可能具有挑战性,因为问题可能是由不匹配的设置、防火墙规则和内核级错误造成的。以下信息提供了一种解决 IPsec VPN 连接常见问题的系统方法。

6.14.1. 基本连接问题

VPN 连接的问题通常是因为端点之间不匹配的配置而发生的。

要确认 IPsec 连接是否已建立,请输入:

# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=198.51.100.1/32
Copy to Clipboard Toggle word wrap

对于成功的连接,命令会显示一个带有连接名称和详情的条目。如果输出为空,则隧道没有建立。

6.14.3. 不匹配的配置

如果端点不是使用匹配的互联网密钥交换(IKE)版本、算法、IP 地址范围或预共享密钥(PSK)配置的,则 VPN 连接会失败。如果发现不匹配,您必须使两个端点上的设置保持一致,以便解决这个问题。

远程对等点没有运行 IKE/IPsec

如果连接被拒绝,会显示一个 ICMP 错误:

# ipsec up vpn.example.com
...
000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]
Copy to Clipboard Toggle word wrap
不匹配的 IKE 算法

在初始设置过程中,连接会失败并显示 NO_PROPOSAL_CHOSEN 通知:

# ipsec up vpn.example.com
...
003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Toggle word wrap
不匹配的 IPsec 算法

在初始交换后,连接会失败并显示 NO_PROPOSAL_CHOSEN 错误:

# ipsec up vpn.example.com
...
182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048}
002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Toggle word wrap
不匹配的 IP 地址范围(IKEv2)

远程对等点响应一个 TS_UNACCEPTABLE 错误:

# ipsec up vpn.example.com
...
1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048}
002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Toggle word wrap
不匹配的 IP 地址范围(IKEv1)

在快速模式下连接超时,并显示一条表示对等点不接受提议的消息:

# ipsec up vpn.example.com
...
031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits.  No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Toggle word wrap
不匹配的 PSK (IKEv2)

对等点拒绝连接,并显示一个 AUTHENTICATION_FAILED 错误:

# ipsec up vpn.example.com
...
003 "vpn.example.com" #1: received Hash Payload does not match computed value
223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Toggle word wrap
不匹配的 PSK (IKEv1)

哈希有效负载不匹配,使 IKE 消息不可读,并导致一个 INVALID_HASH_INFORMATION 错误:

# ipsec up vpn.example.com
...
002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Toggle word wrap

6.14.4. MTU 问题

加密和封装过程增加了数据包的大小。如果数据包超过网络的最大传输单元(MTU)(通常为 1500 字节),则数据包会被碎片化。这可能导致间歇性连接失败,其中分片会丢失,且原始数据包无法被重新组装。一个常见的症状是,小数据包(例如 ping)可以正常工作,但大型数据包(如 SSH 会话)在登录后冻结。

要解决这个问题,通过在配置文件中添加 mtu=1400 选项来降低隧道的 MTU。

6.14.5. NAT 冲突

如果 IPsec 主机也充当 NAT 路由,则可能会错误地将 NAT 应用到用于 IPsec 隧道的数据包。例如,如果在应用 IPsec 加密前,数据包的源 IP 地址被伪装规则转换,则数据包的源不再与 IPsec 策略匹配,并且 Libreswan 在网络上以不加密的方式发送它。

要解决这个问题,请添加一条防火墙规则,该规则将 IPsec 子网间的流量从 NAT 中排除。应在 POSTROUTING 链的开头插入此规则,以确保它在常规 NAT 规则之前被处理。

例 6.1. 使用 nftables 框架的解决方案

以下示例使用 nftables 设置一个基本的 NAT 环境,该环境将 192.0.2.0/24 和 198.51.100.0/24 子网之间的流量从地址转换中排除:

# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
Copy to Clipboard Toggle word wrap

6.14.6. 内核级 IPsec 问题

一个常见问题是 VPN 隧道似乎成功建立,但没有流量通过它。在这种情况下,您可以检查内核的 IPsec 状态,以检查隧道策略和加密密钥是否被正确安装。

这个过程涉及检查两个组件:

  • 安全策略数据库(SPD):指示内核要加密哪些流量的规则。
  • 安全关联数据库(SAD):指示内核如何加密该流量的密钥。

首先,检查 SPD 中是否存在正确的策略:

# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
	dir out priority 666 ptype main
	tmpl src 198.51.100.13 dst 203.0.113.22
		proto esp reqid 16417 mode tunnel
Copy to Clipboard Toggle word wrap

输出应包含与 in 和 out 方向匹配的 leftsubnetrightsubnet 参数的策略。如果没有看到流量的策略,Libreswan 无法创建内核规则,并且流量未加密。

如果策略存在,检查它是否在 SAD 中有相应的密钥集合:

# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
	proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
	auth-trunc hmac(sha1) 0x3763cd3b... 96
	enc cbc(aes) 0xd9dba399...
Copy to Clipboard Toggle word wrap
警告

这个命令显示私有加密密钥。不要共享此输出,因为攻击者可以使用它来解密您的 VPN 流量。

如果策略存在,但没有看到具有相同 reqid 的对应状态,这通常意味着互联网密钥交换(IKE)协商失败。两个 VPN 端点无法就一组密钥达成一致。

如需更详细的诊断,请将 -s 选项与其中一个命令一起使用。这个选项添加流量计数器,这帮助识别内核是否通过特定规则处理数据包。

6.14.7. 内核 IPsec 子系统错误

在个别情况下,内核的 IPsec 子系统中的漏洞可能导致它丢失与互联网密钥交换(IKE)用户空间守护进程的同步。这种不同步可能会导致在协商的安全关联与内核中 IPsec 策略的实际强制间出现差异,从而可能会中断安全网络通信。要检查内核级别的错误,请显示转换(XFRM)统计信息:

# cat /proc/net/xfrm_stat
Copy to Clipboard Toggle word wrap

如果输出中的任何计数器(如 XfrmInError )显示一个非零值,则这表示内核子系统存在问题。在这种情况下,开一个 支持问题单,并附加上命令的输出以及相应的 IKE 日志。

6.14.8. 显示 Libreswan 日志

Libreswan 将事件记录到日志中。要显示 ipsec 服务的日志,请输入:

# journalctl -xeu ipsec
Copy to Clipboard Toggle word wrap

如果默认日志记录级别没有提供足够的详情,请通过在 /etc/ipsec.conf 文件中的 config setup 部分中添加以下设置来启用全面的调试日志记录:

plutodebug=all
logfile=/var/log/pluto.log
Copy to Clipboard Toggle word wrap

由于调试日志记录可以产生许多条目,因此将消息重定向到专用的日志文件可防止 journaldsystemd 服务对消息进行速率限制。

您可以使用 MACsec 来保护两个设备(点到点)之间的通信。例如,您的分支办公室通过城际以太网与中心办公室连接,您可以在连接办公室的两个主机上配置 MACsec,以提高安全性。

7.1. MACsec 如何提高安全性

介质访问控制安全(MACsec)是一种 2 层协议,它保护以太网链路上的不同流量类型,包括:

  • 动态主机配置协议(DHCP)
  • 地址解析协议(ARP)
  • IPv4 和 IPv6 流量
  • 任何通过 IP 的流量,如 TCP 或 UDP

MACsec 默认使用 GCM-AES-128 算法加密并验证 LAN 中的所有流量,并使用预共享密钥在参与的主机之间建立连接。要更改预共享密钥,您必须更新所有使用 MACsec 的网络主机上的 NM 配置。

MACsec 连接使用yige 以太网设备,如以太网网卡、VLAN 或隧道设备作为父设备。您只能在 MACsec 设备上设置 IP 配置,以便只使用加密连接与其他主机进行通信,或者在父设备上设置 IP 配置。在后者的情况下,您可以使用父设备使用未加密连接和 MACsec 设备加密连接与其他主机通信。

macsec 不需要任何特殊硬件。例如,您可以使用任何交换机,除非您只想在主机和交换机之间加密流量。在这种情况下,交换机还必须支持 MACsec。

换句话说,您可以为两种常见场景配置 MACsec:

  • host-to-host
  • host-to-switch 和 switch-to-other-hosts
重要

您只能在位于同一物理或虚拟 LAN 的主机之间使用 MACsec。

使用 MACsec 安全标准保护链路层的通信,也称为 Open Systems Interconnection (OSI)模型的第 2 层,提供以下显著优点:

  • 第 2 层的加密消除了在第 7 层加密单个服务的需要。这减少了管理与每个主机上每个端点的大量证书关联的开销。
  • 直接连接的网络设备(如路由器和交换机)之间的点对点安全性。
  • 不需要对应用程序和高层协议进行更改。

7.2. 使用 nmcli 配置 MACsec 连接

您可以使用 nmcli 工具将以太网接口配置为使用 MACsec。例如,您可以在通过以太网连接的两个主机之间创建一个 MACsec 连接。

流程

  1. 在配置 MACsec 的第一个主机上:

    • 为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):

      1. 创建一个 16 字节的十六进制 CAK:

        # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        50b71a8ef0bd5751ea76de6d6c98c03a
        Copy to Clipboard Toggle word wrap
      2. 创建一个 32 字节的十六进制 CKN:

        # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
        Copy to Clipboard Toggle word wrap
  2. 在您要通过 MACsec 连接连接的两个主机上:
  3. 创建 MACsec 连接:

    # nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
    Copy to Clipboard Toggle word wrap

    macsec.mka-cakmacsec.mka-ckn 参数中使用上一步生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。

  4. 配置 MACsec 连接中的 IP 设置。

    1. 配置 IPv4 设置。例如,要为 macsec0 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器,请输入:

      # nmcli connection modify macsec0 ipv4.method manual ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253'
      Copy to Clipboard Toggle word wrap
    2. 配置 IPv6 设置。例如,要为 macsec0 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器,请输入:

      # nmcli connection modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
      Copy to Clipboard Toggle word wrap
  5. 激活连接:

    # nmcli connection up macsec0
    Copy to Clipboard Toggle word wrap

验证

  1. 验证流量是否加密:

    # tcpdump -nn -i enp1s0
    Copy to Clipboard Toggle word wrap
  2. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  3. 显示 MACsec 统计信息:

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  4. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

7.3. 使用 nmstatectl 配置 MACsec 连接

您可以通过 nmstatectl 工具,以声明的方式将以太网接口配置为使用 MACsec。例如,在 YAML 文件中,您可以描述网络所需的状态,假设其在通过以太网连接的两个主机之间有一个 MACsec 连接。nmstatectl 工具解释 YAML 文件,并在主机之间部署持久和一致的网络配置。

先决条件

  • 服务器配置中存在一个物理或虚拟以太网网络接口控制器(NIC)。
  • nmstate 软件包已安装。

流程

  1. 在您配置 MACsec 的第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):

    1. 创建一个 16 字节的十六进制 CAK:

      # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      50b71a8ef0bd5751ea76de6d6c98c03a
      Copy to Clipboard Toggle word wrap
    2. 创建一个 32 字节的十六进制 CKN:

      # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
      Copy to Clipboard Toggle word wrap
  2. 在您要通过 MACsec 连接连接的两个主机上,完成以下步骤:

    1. 使用以下设置创建一个 YAML 文件,如 create-macsec-connection.yml

      ---
      routes:
        config:
        - destination: 0.0.0.0/0
          next-hop-interface: macsec0
          next-hop-address: 192.0.2.2
          table-id: 254
        - destination: 192.0.2.2/32
          next-hop-interface: macsec0
          next-hop-address: 0.0.0.0
          table-id: 254
      dns-resolver:
        config:
          search:
          - example.com
          server:
          - 192.0.2.200
          - 2001:db8:1::ffbb
      interfaces:
      - name: macsec0
        type: macsec
        state: up
        ipv4:
          enabled: true
          address:
          - ip: 192.0.2.1
            prefix-length: 32
        ipv6:
          enabled: true
          address:
          - ip: 2001:db8:1::1
            prefix-length: 64
        macsec:
          encrypt: true
          base-iface: enp0s1
          mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a
          mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
          port: 0
          validation: strict
          send-sci: true
      Copy to Clipboard Toggle word wrap
    2. mka-cakmka-ckn 参数中使用上一步中生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。
    3. 可选:在同一 YAML 配置文件中,您还可以配置以下设置:

      • 静态 IPv4 地址 - 192.0.2.1,子网掩码为 /32
      • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
      • IPv4 默认网关 - 192.0.2.2
      • IPv4 DNS 服务器 - 192.0.2.200
      • IPv6 DNS 服务器 - 2001:db8:1::ffbb
      • DNS 搜索域 - example.com
  3. 将设置应用到系统:

    # nmstatectl apply create-macsec-connection.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show macsec0
    Copy to Clipboard Toggle word wrap
  2. 验证流量是否加密:

    # tcpdump -nn -i enp0s1
    Copy to Clipboard Toggle word wrap
  3. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  4. 显示 MACsec 统计信息:

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  5. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

第 8 章 保护网络服务

Red Hat Enterprise Linux 支持许多不同类型的网络服务器。这些服务器提供的网络服务可能会暴露系统的安全性,从而可能会面临各种类型的攻击,如拒绝服务攻击(DoS)、分布式拒绝服务攻击(DDoS)、脚本漏洞攻击和缓冲区溢出攻击。

为增加系统的安全性,务必要监控您使用的活跃网络服务。例如,当网络服务在计算机上运行时,其守护进程会侦听网络端口的连接,这可能会降低系统的安全性。要限制暴露会受到攻击的网络,应关闭所有未使用的服务。

8.1. 保护 rpcbind 服务

rpcbind 服务是用于远程过程调用(RPC)服务的动态端口分配守护进程,如网络信息服务(NIS)和网络文件共享(NFS)。由于其身份验证机制较弱,并可为其控制的服务分配大量端口,因此保护 rpcbind 服务非常重要。

您可以通过限制访问所有网络并使用服务器上的防火墙规则来定义特定例外来保护 rpcbind

注意
  • NFSv3 服务器需要 rpcbind 服务。
  • NFSv4 上不需要 rpcbind 服务。

先决条件

  • 已安装 rpcbind 软件包。
  • firewalld 软件包已安装,且服务正在运行。

流程

  1. 添加防火墙规则,例如:

    • 限制 TCP 连接,并只接受来自 192.168.0.0/24 主机 111 端口的包:

      # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'
      Copy to Clipboard Toggle word wrap
    • 限制 TCP 连接,并只接受来自本地主机 111 端口的包:

      # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
      Copy to Clipboard Toggle word wrap
    • 限制 UDP 连接,并只接受来自 192.168.0.0/24 主机 111 端口的包:

      # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'
      Copy to Clipboard Toggle word wrap

      要使防火墙设置永久化,请在添加防火墙规则时使用 --permanent 选项。

  2. 重新载入防火墙以应用新规则:

    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  • 列出防火墙规则:

    # firewall-cmd --list-rich-rule
    rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop
    rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept
    rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop
    Copy to Clipboard Toggle word wrap

8.2. 保护 rpc.mountd 服务

rpc.mountd 守护进程实现 NFS 挂载协议的服务器端。NFS 版本 3(RFC 1813)使用 NFS 挂载协议。

您可以通过对服务器添加防火墙规则来保护 rpc.mountd 服务。您可以限制对所有网络的访问,并使用防火墙规则定义特定的异常。

前提条件

  • 已安装 rpc.mountd 软件包。
  • firewalld 软件包已安装,且服务正在运行。

流程

  1. 在服务器中添加防火墙规则,例如:

    • 接受来自 192.168.0.0/24 主机的mountd 连接:

      # firewall-cmd --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'
      Copy to Clipboard Toggle word wrap
    • 接受来自本地主机的 mountd 连接:

      # firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
      Copy to Clipboard Toggle word wrap

      要使防火墙设置永久化,请在添加防火墙规则时使用 --permanent 选项。

  2. 重新载入防火墙以应用新规则:

    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  • 列出防火墙规则:

    # firewall-cmd --list-rich-rule
    rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop
    rule family="ipv4" source address="127.0.0.1" service name="mountd" accept
    Copy to Clipboard Toggle word wrap

8.3. 保护 NFS 服务

您可以使用 Kerberos 验证并加密所有文件系统操作来保护网络文件系统 4(NFSv4)。在将 NFSv4 与网络地址转换(NAT)或防火墙搭配使用时,您可以通过修改 /etc/default/nfs 文件来关闭委托。委托(Delegation)是服务器将文件管理委派给客户端的一种技术。与其相反,NFSv3 不使用 Kerberos 锁定和挂载文件。

NFS 服务在所有 NFS 版本中使用 TCP 发送流量。该服务支持 Kerberos 用户和组身份验证,作为 RPCSEC_GSS 内核模块的一部分。

NFS 允许远程主机通过网络挂载文件系统,并与这些文件系统进行交互,就像它们被挂载到本地一样。您可以在集中服务器中合并资源,并在共享文件系统时额外自定义 /etc/nfsmount.conf 文件中的 NFS 挂载选项。

8.3.1. 保护 NFS 服务器的导出选项

NFS 服务器决定有关将哪些文件系统导出到 /etc/exports 文件中的目录和主机的列表结构。

您可以对 /etc/exports 文件使用以下导出选项:

ro
将 NFS 卷导出为只读。
rw
允许对 NFS 卷的读和写请求。请小心使用这个选项,因为允许写入访问会增加攻击的风险。如果您的场景需要使用 rw 选项挂载目录,请确保它们对所有用户都不可写,以减少可能的风险。
root_squash
将来自 uid/gid 0 的请求映射到匿名 uid/gid。这不适用于其它可能比较敏感的 uidgid,如 bin 用户或 staff 组。
no_root_squash
关闭 root 挤压。默认情况下,NFS 共享将 root 用户改为 nobody 用户,这是一个非特权用户帐户。这会将所有 root 创建的文件的所有者改为 nobody,这样可以防止上传设置了 setuid 位的程序。如果使用 no_root_squash 选项,则远程 root 用户可以更改共享文件系统上的任何文件,并将感染特洛伊木马的应用程序留给其他用户。
secure
将导出限制到保留的端口。默认情况下,服务器只允许客户端通信通过保留的端口。但是在网络上,任何人都可以容易地成为客户端上的 root 用户,因此,对于服务器来说,假设通过保留端口的通信都具有特权是不安全的。因此,对保留端口的限制具有有限的值;最好根据 Kerberos、防火墙和对特定客户端的导出限制来决定。
警告

/etc/exports 文件语法中额外的空格可能会导致配置中的重大变化。

在以下示例中,/tmp/nfs/ 目录与 bob.example.com 主机共享,并且具有读取和写入权限。

/tmp/nfs/     bob.example.com(rw)
Copy to Clipboard Toggle word wrap

以下示例与前一个相同,但对 bob.example.com 主机共享具有只读权限的相同的目录,由于主机名后面有一个空格字符,因此可以对 world 共享具有读写权限的目录。

/tmp/nfs/     bob.example.com (rw)
Copy to Clipboard Toggle word wrap

您可以通过输入 showmount -e <hostname> 命令检查您系统上的共享目录。

另外,在导出 NFS 服务器时请考虑以下最佳实践:

  • 导出主目录存在风险,因为某些应用以纯文本或弱加密格式存储密码。您可以通过检查并改进应用程序代码来降低风险。
  • 有些用户未对 SSH 密钥设置密码,这再次给主目录带来风险。您可以通过强制使用密码或使用 Kerberos 来降低这些风险。
  • 将 NFS 导出仅限制为所需的客户端。在 NFS 服务器上使用 showmount -e 命令来检查服务器正在导出什么。不要导出不需要的任何内容。
  • 不要允许不必要的用户登录到服务器,以减少攻击风险。您可以定期检查谁可以访问服务器,以及可以访问服务器的什么数据。
警告

要导出整个文件系统,因为导出文件系统的子目录不安全。攻击者可能会访问部分导出的文件系统的未导出部分。

8.3.2. 保护 NFS 客户端的挂载选项

您可以将以下选项传递给 mount 命令,以增加基于 NFS 的客户端的安全性:

nosuid
使用 nosuid 选项禁用 set-user-identifierset-group-identifier 位。这样可防止远程用户通过运行 setuid 程序获得更高的特权,并可使用此选项与 setuid 选项相反。
noexec
使用 noexec 选项禁用客户端上的所有可执行文件。使用此选项可防止用户意外执行位于共享文件系统中的文件。
nodev
使用 nodev 选项防止客户端将设备文件作为硬件设备处理。
resvport
使用 resvport 选项将通信限制到保留端口,您可以使用特权源端口与服务器通信。保留的端口是为特权用户和进程保留的,如 root 用户。
使用 NFS 服务器上的 sec 选项,选择 RPCGSS security 类别来访问挂载点上的文件。有效的安全类别包括 none, sys, krb5, krb5i, 和 krb5p
重要

krb5-libs 软件包提供的 MIT Kerberos 库不支持新部署中的数据加密标准(DES)算法。因为安全和兼容性的原因,在 Kerberos 库中默认禁用 DES。出于兼容性的原因,请使用更新、更安全的算法而不是 DES。

8.3.3. 使用防火墙保护 NFS

要保护 NFS 服务器上的防火墙,请仅开放所需的端口。不要将 NFS 连接端口号用于任何其他服务。

前提条件

  • 已安装 nfs-utils 软件包。
  • firewalld 软件包已安装并运行。

流程

  • 在 NFSv4 上,防火墙必须打开 TCP 端口 2049
  • 在 NFSv3 上,使用 2049 打开四个额外端口:

    1. rpcbind 服务动态分配 NFS 端口,这可能会在创建防火墙规则时导致问题。要简化这个过程,使用 /etc/nfs.conf 文件指定要使用哪些端口:

      1. [mountd] 部分为 mountd (rpc.mountd) 设置 TCP 和 UDP 端口,格式为 port=<value>
      2. [statd] 部分为 statd (rpc.statd) 设置 TCP 和 UDP 端口,格式为 port=<value>
    2. /etc/nfs.conf 文件中为 NFS 锁定管理器(nlockmgr)设置 TCP 和 UDP 端口:

      1. [lockd] 部分为 nlockmgr (rpc.statd) 设置 TCP 端口,格式为 port=value。或者,也可以使用 /etc/modprobe.d/lockd.conf 文件中的 nlm_tcpport 选项。
      2. [lockd] 部分为 nlockmgr (rpc.statd) 设置 UDP 端口,格式为 udp-port=value。或者,您可以使用 /etc/modprobe.d/lockd.conf 文件中的 nlm_udpport 选项。

验证

  • 列出 NFS 服务器中的活跃端口和 RPC 程序:

    $ rpcinfo -p
    Copy to Clipboard Toggle word wrap

8.4. 保护 FTP 服务

您可以使用文件传输协议(FTP)来通过网络传输文件。因为服务器的所有 FTP 事务(包括用户身份验证)都未加密,因此确保其被安全配置。

Red Hat Enterprise Linux 提供两种 FTP 服务器:

红帽内容加速器(tux)
具有 FTP 功能的内核空间 Web 服务器。
非常安全的 FTP 守护进程(vsftpd)
FTP 服务的一种独立、面向安全的实现。

以下安全指南是用于设置 vsftpd FTP 服务:

8.4.1. 保护 FTP 的问候横幅

当用户连接到 FTP 服务时,FTP 会显示一条问候横幅,其默认包含版本信息。攻击者可以利用此信息识别系统中的弱点。您可以通过更改默认的横幅来隐藏此信息。

您可以通过编辑 /etc/banners/ftp.msg 文件来定义自定义横幅。它可以直接包含一个单行消息,或引用一个单独的文件,其中包含多行消息。

流程

  • 要定义单行消息,请在 /etc/vsftpd/vsftpd.conf 文件中添加以下选项:

    ftpd_banner=Hello, all activity on ftp.example.com is logged.
    Copy to Clipboard Toggle word wrap
  • 在单独的文件中定义信息:

    • 创建一个 .msg 文件,其中包含横幅消息,如 /etc/banners/ftp.msg

      ######### Hello, all activity on ftp.example.com is logged. #########
      Copy to Clipboard Toggle word wrap

      为了简化多个横幅的管理,请将所有横幅放在 /etc/banners/ 目录中。

    • 将横幅文件的路径添加到 /etc/vsftpd/vsftpd.conf 文件中的 banner_file 选项中:

      banner_file=/etc/banners/ftp.msg
      Copy to Clipboard Toggle word wrap

验证

  • 显示修改后的横幅:

    $ ftp localhost
    Trying ::1…
    Connected to localhost (::1).
    Hello, all activity on ftp.example.com is logged.
    Copy to Clipboard Toggle word wrap

8.4.2. 防止匿名访问并在 FTP 中上传

默认情况下,安装 vsftpd 软件包会为匿名用户创建 /var/ftp/ 目录和一个目录树,用户对这些目录有只读权限。由于匿名用户可以访问数据,因此请勿将敏感数据存储在这些目录中。

要增加系统的安全性,您可以将 FTP 服务器配置为允许匿名用户将文件上传到特定目录并阻止匿名用户读取数据。在以下流程中,匿名用户可以将文件上传到 root 用户拥有的目录中,但不能更改该它。

流程

  • /var/ftp/pub/ 目录中创建只写的目录:

    # mkdir /var/ftp/pub/upload
    # chmod 730 /var/ftp/pub/upload
    # ls -ld /var/ftp/pub/upload
    drwx-wx---. 2 root ftp 4096 Nov 14 22:57 /var/ftp/pub/upload
    Copy to Clipboard Toggle word wrap
  • /etc/vsftpd/vsftpd.conf 文件中添加以下行:

    anon_upload_enable=YES
    anonymous_enable=YES
    Copy to Clipboard Toggle word wrap
  • 可选:如果您的系统启用了 SELinux 并使用强制(enforcing)模式,请启用 SELinux 布尔值属性 allow_ftpd_anon_writeallow_ftpd_full_access
警告

允许匿名用户在目录中读取和写入,可能会导致服务器成为盗取软件的存储库。

8.4.3. 为 FTP 保护用户帐户

FTP 通过不安全的网络以未加密的方式传输用户名和密码以进行身份验证。您可以通过拒绝系统用户从其用户帐户访问服务器来提高 FTP 安全性。

请根据您的配置执行以下几个步骤。

流程

  • 通过在 /etc/vsftpd/vsftpd.conf 文件中添加以下行来禁用 vsftpd 服务器中的所有用户帐户:

    local_enable=NO
    Copy to Clipboard Toggle word wrap
  • 要禁用特定帐户或特定帐户组(如 root 用户和带有 sudo 权限的组)对 FTP 的访问,您可以将用户名添加到 /etc/pam.d/vsftpd PAM 配置文件。
  • 通过在 /etc/vsftpd/ftpusers 文件中添加用户名来禁用用户帐户。

8.5. 保护 HTTP 服务器

8.5.1. httpd.conf 中的安全增强

您可以通过在 /etc/httpd/conf/httpd.conf 文件中配置安全选项来提高 Apache HTTP 服务器的安全性。

在将脚本加入到生产环境前,需要验证它们是否可以正常工作。

确保只有 root 用户对包含脚本或通用网关接口(CGI)的任何目录具有写入权限。要将目录所有权改为具有写权限的 root,请输入以下命令:

# chown root <directory_name>
# chmod 755 <directory_name>
Copy to Clipboard Toggle word wrap

/etc/httpd/conf/httpd.conf 文件中,您可以配置以下选项:

FollowSymLinks
这个指令默认为启用,并遵循目录中的符号链接。
索引
这个指令被默认启用。禁用这个指令,以防止访问者浏览服务器上的文件。
UserDir
这个指令默认为禁用,因为它可以确认系统中存在用户帐户。要激活用户目录浏览 /root/ 以外的所有用户目录,使用 UserDir enabledUserDir disabled root 指令。要将用户添加到禁用帐户列表中,请在 UserDir disabled 行中添加以空格分隔的用户列表。
ServerTokens

这个指令控制向客户端发送的服务器响应标头字段。您可以使用以下参数来自定义信息:

ServerTokens Full

提供所有可用信息,如 Web 服务器版本号、服务器操作系统详情、已安装的 Apache 模块,例如:

Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2
Copy to Clipboard Toggle word wrap
ServerTokens Full-Release

提供与发行版本相关的所有可用信息,例如:

Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)
Copy to Clipboard Toggle word wrap
ServerTokens Prod / ServerTokens ProductOnly

提供 Web 服务器名称,例如:

Apache
Copy to Clipboard Toggle word wrap
ServerTokens Major

提供 Web 服务器主发行版本,例如:

Apache/2
Copy to Clipboard Toggle word wrap
ServerTokens Minor

提供 Web 服务器次发行版本,例如:

Apache/2.4
Copy to Clipboard Toggle word wrap
ServerTokens Min / ServerTokens Minimal

提供 Web 服务器最小发行版本,例如:

Apache/2.4.37
Copy to Clipboard Toggle word wrap
ServerTokens OS

提供 Web 服务器发行版本和操作系统,例如:

Apache/2.4.37 (Red Hat Enterprise Linux)
Copy to Clipboard Toggle word wrap

使用 ServerTokens Prod 选项降低攻击者获取任何有关您系统的有价值信息的风险。

重要

不要删除 IncludesNoExec 指令。默认情况下,Server Side Includes (SSI) 模块无法执行命令。更改这个设置可让攻击者在系统中输入命令。

删除 httpd 模块

您可以删除 httpd 模块来限制 HTTP 服务器的功能。编辑 /etc/httpd/conf.modules.d//etc/httpd/conf.d/ 目录中的配置文件。例如,要删除代理模块:

echo '# All proxy modules disabled' > /etc/httpd/conf.modules.d/00-proxy.conf
Copy to Clipboard Toggle word wrap

8.5.2. 保护 Nginx 服务器配置

Nginx 是一个高性能 HTTP 和代理服务器。您可以使用以下配置选项强化 Nginx 配置。

流程

  • 要禁用版本字符串,修改 server_tokens 配置选项:

    server_tokens off;
    Copy to Clipboard Toggle word wrap

    这个选项将停止显示其他详细信息,如服务器版本号。此配置仅显示 Nginx 提供的所有请求中的服务器名称,例如:

    $ curl -sI http://localhost | grep Server
    Server: nginx
    Copy to Clipboard Toggle word wrap
  • 添加额外的安全标头,以缓解特定 /etc/nginx/ conf 文件中的某些已知 Web 应用程序漏洞:

    • 例如,X-Frame-Options 标头选项拒绝您的域之外的任何页面来帧由 Nginx 提供的任何内容,缓解了攻击:

      add_header X-Frame-Options "SAMEORIGIN";
      Copy to Clipboard Toggle word wrap
    • 例如,x-content-type 标头在某些较旧的浏览器中可以防止 MIME-type sniffing:

      add_header X-Content-Type-Options nosniff;
      Copy to Clipboard Toggle word wrap
    • 例如,X-XSS-Protection 标头启用跨站点脚本过滤(XSS)过滤,这可防止浏览器渲染由 Nginx 中包含的潜在的恶意内容:

      add_header X-XSS-Protection "1; mode=block";
      Copy to Clipboard Toggle word wrap
  • 您可以限制公开的服务,并限制它们对访问者执行的操作,例如:

    limit_except GET {
        allow 192.168.1.0/32;
        deny  all;
    }
    Copy to Clipboard Toggle word wrap

    该片段将限制对除 GETHEAD 外的所有方法的访问。

  • 您可以禁用 HTTP 方法,例如:

    # Allow GET, PUT, POST; return "405 Method Not Allowed" for all others.
    if ( $request_method !~ ^(GET|PUT|POST)$ ) {
        return 405;
    }
    Copy to Clipboard Toggle word wrap
  • 您可以配置 SSL 来保护 Nginx web 服务器提供的数据,请考虑仅通过 HTTPS 提供它。另外,您可以使用 Mozilla SSL 配置生成器生成在 Nginx 服务器中启用 SSL 的安全配置配置文件。生成的配置确保了,所有已知存在安全漏洞的协议(例如, SSLv2 和 SSLv3),加密程序和哈希算法(例如 3DES 和 MD5) 都已禁用。您还可以使用 SSL 服务器测试来验证您的配置是否满足现代安全要求。

PostgreSQL 是一个对象相关数据库管理系统(DBMS)。在 Red Hat Enterprise Linux 中,PostgreSQL 由 postgresql-server 软件包提供。

您可以通过配置客户端身份验证来降低攻击的风险。pg_hba.conf 配置文件存储在数据库集群的数据目录中,控制客户端身份验证。按照以下步骤为基于主机的验证配置 PostgreSQL。

流程

  1. 安装 PostgreSQL:

    # dnf install postgresql-server
    Copy to Clipboard Toggle word wrap
  2. 使用以下选项之一初始化数据库存储区域:

    1. 使用 initdb 工具:

      $ initdb -D /home/postgresql/db1/
      Copy to Clipboard Toggle word wrap

      带有 -D 选项的 initdb 命令会创建您指定的目录(如果尚未存在),例如 /home/postgresql/db1/。然后,此目录包含数据库中存储的所有数据以及客户端身份验证配置文件。

    2. 使用 postgresql-setup 脚本:

      $ postgresql-setup --initdb
      Copy to Clipboard Toggle word wrap

      默认情况下,该脚本使用 /var/lib/pgsql/data/ 目录。此脚本可以帮助具有基本数据库集群管理的系统管理员。

  3. 要允许任何经过身份验证的用户使用其用户名访问任何数据库,请在 pg_hba.conf 文件中修改以下行:

    local   all             all                                     trust
    Copy to Clipboard Toggle word wrap

    当使用创建数据库用户和没有本地用户的层次应用程序时,这可能会造成问题。如果您不想显式控制系统中所有用户名,请从 pg_hba.conf 文件中删除 local 行条目。

  4. 重启数据库以应用更改:

    # systemctl restart postgresql
    Copy to Clipboard Toggle word wrap

    上一命令更新数据库,同时还验证配置文件的语法。

8.7. 保护 Memcached 服务

Memcached 是一个开源、高性能分布式内存对象缓存系统。它可以通过降低数据库负载来提高动态 Web 应用程序的性能。

Memcached 是一个内存键值存储,用于任意数据(如字符串和对象)的小块,来自于数据库调用、API 调用或页面渲染的结果。Memcached 允许将内存从未充分利用的区域分配给需要更多内存的应用程序。

2018 年,发现了向公共互联网公开的 Memcached 服务器漏洞 DDoS 扩展攻击。这些攻击利用了使用 UDP 协议进行传输的 Memcached 通信。这个攻击非常有效,因为其具有非常高的放大比率,具有几百字节大小的请求会产生带有几兆字节甚至几百兆字节的响应。

在大多数情况下,memcached 服务不需要向公共互联网公开。如果公开,其本身可能会带有安全问题。远程攻击者可能会泄漏或修改存储在 Memcached 中的信息。

8.7.1. 针对 DDoS 强化 Memcached

要降低安全风险,请根据您的配置执行以下步骤。

流程

  • 在 LAN 中配置防火墙。如果您的 Memcached 服务器应只在本地网络访问,请不要将外部流量路由到 memcached 服务使用的端口。例如,从允许的端口列表中删除默认端口 11211

    # firewall-cmd --remove-port=11211/udp
    # firewall-cmd --runtime-to-permanent
    Copy to Clipboard Toggle word wrap
  • 如果您在与应用程序相同的机器上使用单一 Memcached 服务器,请设置 memcached 来仅侦听 localhost 流量。修改 /etc/sysconfig/memcached 文件中的 OPTIONS 值:

    OPTIONS="-l 127.0.0.1,::1"
    Copy to Clipboard Toggle word wrap
  • 启用简单验证和安全层(SASL)身份验证:

    1. 修改或添加 /etc/sasl2/memcached.conf 文件:

      sasldb_path: /path.to/memcached.sasldb
      Copy to Clipboard Toggle word wrap
    2. 在 SASL 数据库中添加帐户:

      # saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
      Copy to Clipboard Toggle word wrap
    3. 确保 memcached 用户和组可以访问数据库:

      # chown memcached:memcached /path.to/memcached.sasldb
      Copy to Clipboard Toggle word wrap
    4. 通过在 /etc/sysconfig/memcached 文件中的 OPTIONS 参数中添加 -S 值在 Memcached 中启用 SASL 支持:

      OPTIONS="-S"
      Copy to Clipboard Toggle word wrap
    5. 重启 Memcached 服务器以应用更改:

      # systemctl restart memcached
      Copy to Clipboard Toggle word wrap
    6. 将 SASL 数据库中创建的用户名和密码添加到应用程序的 Memcached 客户端配置中。
  • 使用 TLS 加密 Memcached 客户端和服务器间的通信:

    1. 通过在 /etc/sysconfig/memcached 文件中的 OPTIONS 参数中添加 -Z 值来启用 Memcached 客户端和服务器间的加密通信:

      OPTIONS="-Z"
      Copy to Clipboard Toggle word wrap
    2. 使用 -o ssl_chain_cert 选项,以 PEM 格式添加证书链文件路径。
    3. 使用 -o ssl_key 选项添加私钥文件路径。

8.8. 保护 Postfix 服务

Postfix 是邮件传输代理(MTA),其使用简单邮件传输协议(SMTP)在其他 MTA 之间发送电子邮件,并将电子邮件发送给客户端或传输代理。虽然 MTA 可以加密彼此之间的流量,但默认情况下可能不会这样做。您还可以通过将设置改为更安全的值来降低各种攻击的风险。

8.8.2. 用于限制 DoS 攻击的 Postfix 配置选项

攻击者可以用流量淹没服务器,或发送触发崩溃的信息,从而导致拒绝服务(DoS)攻击。您可以通过在 /etc/postfix/main.cf 文件中设置限制来配置系统,以降低此类攻击的风险。您可以更改现有指令的值,或者您可以使用 <directive> = <value> 格式的自定义值添加新指令。

使用以下指令列表来限制 DoS 攻击:

smtpd_client_connection_rate_limit
限制任何客户端每个时间单元可以尝试的最大连接数。默认值为 0 ,这意味着客户端每个时间单位内可以尝试的 Postfix 所能接受的连接数。默认情况下,指令排除可信网络中的客户端。
anvil_rate_time_unit
定义计算速率限制的时间单位。默认值为 60 秒。
smtpd_client_event_limit_exceptions
将客户端从连接和速率限制命令中排除。默认情况下,指令排除可信网络中的客户端。
smtpd_client_message_rate_limit
定义每个时间单位从客户端发送到请求的最大消息数(无论 Postfix 是否实际接收了这些消息)。
default_process_limit
定义提供给定服务的默认的 Postfix 子进程的最大数。对于 master.cf 文件中的特定服务,您可以忽略此规则。默认情况下,该值为 100
queue_minfree
定义在队列文件系统中接收邮件所需的最小可用空间量。该指令目前由 Postfix SMTP 服务器使用,以决定是否接受任何邮件。默认情况下,空闲空间量小于 message_size_limit 的 1.5 倍时,Postfix SMTP 服务器会拒绝 MAIL FROM 命令。要指定较高的最小空闲空间限制,请将 queue_minfree 值指定为至少 message_size_limit 的 1.5 倍。默认情况下,queue_minfree 值为 0
header_size_limit
定义用于存储消息标头的最大内存量(以字节为单位)。如果消息头较大,它会丢弃超出的消息头。默认情况下,值为 102400 字节。
message_size_limit
定义消息的最大大小(以字节为单位),包括信封信息。默认情况下,值为 10240000 字节。

8.8.3. 将 Postfix 配置为使用 SASL

Postfix 支持基于简单身份验证和安全层(SASL)的 SMTP 身份验证(AUTH)。SMTP AUTH 是简单邮件传输协议的扩展。目前,Postfix SMTP 服务器通过以下方式支持 SASL 实现:

Dovecot SASL
Postfix SMTP 服务器可以使用 UNIX-域套接字或 TCP 套接字与 Dovecot SASL 进行通信。如果 Postfix 和 Dovecot 应用程序运行在单独的计算机上,则使用此方法。
Cyrus SASL
启用后,SMTP 客户端必须使用服务器和客户端都支持和接受的身份验证方法与 SMTP 服务器进行身份验证。

先决条件

  • dovecot 软件包已安装在系统上

流程

  1. 设置 Dovecot:

    1. /etc/dovecot/conf.d/10-master.conf 文件中包括以下行:

      service auth {
        unix_listener /var/spool/postfix/private/auth {
          mode = 0660
          user = postfix
          group = postfix
        }
      }
      Copy to Clipboard Toggle word wrap

      前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于 /var/spool/postfix/ 目录中的邮件队列,以及在 postfix 用户和组下运行的应用程序。

    2. 可选:建立 Dovecot 以通过 TCP 侦听 Postfix 验证请求:

      service auth {
        inet_listener {
            port = <port_number>
        }
      }
      Copy to Clipboard Toggle word wrap
    3. 通过编辑 /etc/dovecot/conf.d/10-auth.conf 文件中的 auth_mechanisms 参数来指定电子邮件客户端用来使用 Dovecot 进行身份验证的方法:

      auth_mechanisms = plain login
      Copy to Clipboard Toggle word wrap

      auth_mechanisms 参数支持不同的纯文本和非纯文本身份验证方法。

  2. 通过修改 /etc/postfix/main.cf 文件来建立 Postfix:

    1. 在 Postfix SMTP 服务器上启用 SMTP 身份验证:

      smtpd_sasl_auth_enable = yes
      Copy to Clipboard Toggle word wrap
    2. 为 SMTP 身份验证启用 Dovecot SASL 实现:

      smtpd_sasl_type = dovecot
      Copy to Clipboard Toggle word wrap
    3. 提供相对于 Postfix 队列目录的身份验证路径。请注意,使用相对路径可确保无论 Postfix 服务器是否以 chroot 运行,配置都可以正常工作:

      smtpd_sasl_path = private/auth
      Copy to Clipboard Toggle word wrap

      此步骤使用 UNIX-域套接字在 Postfix 和 Dovecot 之间进行通信。

      如果您使用 TCP 套接字进行通信,要将 Postfix 配置为在不同机器上查找 Dovecot,请使用类似如下的配置值:

      smtpd_sasl_path = inet: <IP_address> : <port_number>
      Copy to Clipboard Toggle word wrap

      在上例中,将 <IP_address> 替换为 Dovecot 机器的 IP 地址,将 <port_number> 替换为在 Dovecot 的 /etc/dovecot/conf.d/10-master.conf 文件中指定的端口号。

    4. 指定 Postfix SMTP 服务器为客户端提供的 SASL 机制。请注意,您可以为加密和未加密的会话指定不同的机制。

      smtpd_sasl_security_options = noanonymous, noplaintext
      smtpd_sasl_tls_security_options = noanonymous
      Copy to Clipboard Toggle word wrap

      以上指令指定在未加密的会话期间,不允许匿名身份验证,且不会允许传输未加密的用户名或密码的机制。对于使用 TLS 的加密会话,只允许非匿名身份验证机制。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部