安全网络
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 使用 OpenSSH 的两个系统间使用安全通讯 复制链接链接已复制到粘贴板!
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-add为ssh-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 套件使用两组配置文件:一个用于客户端程序(即 ssh、scp 和 sftp),另一个用于服务器( 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 服务器被配置为允许基于密钥的身份验证。
流程
生成一个 ECDSA 密钥对:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用没有任何参数的
ssh-keygen命令生成一个 RSA 密钥对,或通过输入ssh-keygen -t ed25519命令生成一个 Ed25519 密钥对。请注意,Ed25519 算法不符合 FIPS-140,OpenSSH 在 FIPS 模式下无法使用 Ed25519 密钥。将公钥复制到远程机器上:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<username>@<ssh-server-example.com>替换为您的凭证。如果您没有在会话中使用
ssh-agent程序,上一个命令会复制最新修改的~/.ssh/id*.pub公钥。要指定另一个公钥文件,或在ssh-agent内存中缓存的密钥优先选择文件中的密钥,使用带有-i选项的ssh-copy-id命令。
验证
使用密钥文件登录到 OpenSSH 服务器:
ssh -o PreferredAuthentications=publickey <username>@<ssh-server-example.com>
$ ssh -o PreferredAuthentications=publickey <username>@<ssh-server-example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. 将基于密钥的身份验证设置为 OpenSSH 服务器的唯一方法 复制链接链接已复制到粘贴板!
要提高系统安全性,通过在 OpenSSH 服务器上禁用密码身份验证来强制进行基于密钥的身份验证。
先决条件
-
已安装
openssh-server软件包。 -
sshd守护进程正在服务器中运行。 您已使用密钥连接到 OpenSSH 服务器。
详情请参阅 生成 SSH 密钥对 部分。
流程
在文本编辑器中打开
/etc/ssh/sshd_config配置,例如:vi /etc/ssh/sshd_config
# vi /etc/ssh/sshd_configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
PasswordAuthentication选项改为no:PasswordAuthentication no
PasswordAuthentication noCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
在不是新默认安装的系统上,检查是否设置了
PubkeyAuthentication参数,或是否设置为yes。 将
KbdInteractiveAuthentication指令设置为no。请注意,相应的条目在配置文件中已被注释掉,默认值为
yes。要在 NFS 挂载的主目录中使用基于密钥的验证,启用
use_nfs_home_dirsSELinux 布尔值:setsebool -P use_nfs_home_dirs 1
# setsebool -P use_nfs_home_dirs 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您要进行远程连接,而不使用控制台或带外访问,在禁用密码验证前测试基于密钥的登录过程。
重新载入
sshd守护进程以应用更改:systemctl reload sshd
# systemctl reload sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. 通过保存在智能卡上的 SSH 密钥进行身份验证 复制链接链接已复制到粘贴板!
您可以在智能卡上创建并存储 ECDSA 和 RSA 密钥,并通过 OpenSSH 客户端上的智能卡进行身份验证。智能卡验证替换了默认密码验证。
先决条件
-
在客户端中安装了
opensc软件包,pcscd服务正在运行。
流程
列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到
key.pub文件:ssh-keygen -D pkcs11: > keys.pub
$ ssh-keygen -D pkcs11: > keys.pubCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将公钥传送到远程服务器。使用
ssh-copy-id命令和上一步中创建的keys.pub文件:ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 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] $
$ 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 Copied! Toggle word wrap Toggle overflow 因为 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] $
$ ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您跳过 PKCS #11 URI 的
id=部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:您可以在
~/.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] $
$ 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 Copied! Toggle word wrap Toggle overflow ssh客户端工具现在自动使用此 URI 和智能卡中的密钥。
1.5. 使 OpenSSH 更安全 复制链接链接已复制到粘贴板!
在使用 OpenSSH 时,您可以调整系统以提高安全性。
请注意,/etc/ssh/sshd_config OpenSSH 服务器配置文件中的更改需要重新载入 sshd 守护进程才能生效:
systemctl reload sshd
# systemctl reload sshd
大多数安全强化配置更改会降低与不支持最新算法或密码套件的客户端的兼容性。
- 禁用不安全的连接协议
- 要使 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
# systemctl mask sshd-keygen@rsa.service # rm -f /etc/ssh/ssh_host_rsa_key* # systemctl restart sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在启用了
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
# HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要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>
# semanage port -a -t ssh_port_t -p tcp <port_number>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,更新
firewalld配置:firewall-cmd --add-port <port_number>/tcp firewall-cmd --remove-port=22/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port <port_number>/tcp # firewall-cmd --remove-port=22/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在前面的命令中,将
<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选项被设置为yes,ssh -X remote_machine(不信任的主机)和ssh -Y remote_machine(信任的主机)命令之间没有区别。如果您的场景根本不需要 X11 转发功能,请将
/etc/ssh/sshd_config配置文件中的X11Forwarding指令设置为no。- 限制 SSH 对特定用户、组或 IP 范围的访问
/etc/ssh/sshd_config配置文件服务器中的AllowUsers和AllowGroups指令可让您只允许某些用户、域或组连接到您的 OpenSSH 服务器。您可以组合AllowUsers和Allow Groups来更准确地限制访问,例如:AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2 AllowGroups example-group
AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2 AllowGroups example-groupCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此配置只在所有以下条件都满足时才允许连接:
- 连接的源 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
# update-crypto-policies --set FUTURE Setting system policy to FUTURECopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果您的系统与旧系统进行通信,您可能会由于严格的
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 连接。
流程
如果您一次通过跳板服务器或多个中间服务器进行连接,请使用
ssh -J命令,并直接指定跳板服务器,例如:ssh -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>
$ ssh -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果跳板服务器上的用户名或 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>
$ 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 Copied! Toggle word wrap Toggle overflow 如果您定期通过跳板服务器连接到远程服务器,请在 SSH 配置文件中存储 jump-server 配置:
通过编辑本地系统中的
~/.ssh/config文件来定义跳板主机,例如:Host <jump-server-1> HostName <jump-1.example.com>
Host <jump-server-1> HostName <jump-1.example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Host参数定义您可以在ssh命令中使用的主机的名称或别名。该值可以匹配真实的主机名,但也可以是任意字符串。 -
HostName参数设置跳过主机的实际主机名或 IP 地址。
-
使用
ProxyJump指令将远程服务器跳板配置添加到本地系统上的~/.ssh/config文件中,例如:Host <remote-server-1> HostName <target-server-1.example.com> ProxyJump <jump-server-1>
Host <remote-server-1> HostName <target-server-1.example.com> ProxyJump <jump-server-1>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用您的本地系统通过跳过服务器连接到远程服务器:
ssh <remote-server-1>
$ ssh <remote-server-1>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略之前的配置步骤,此命令等同于
ssh -J jump-server1 remote-server命令。
1.7. 使用 RHEL 系统角色配置 OpenSSH 服务器和客户端 复制链接链接已复制到粘贴板!
您可以使用 sshd RHEL 系统角色配置 OpenSSH 服务器,使用 ssh RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。对于需要安全远程交互的任何系统,此类配置是必需的,例如:
- 远程系统管理:使用 SSH 客户端安全地从另一台计算机连接到您的机器。
- 安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP)可让您在本地机器和远程系统之间安全地传输文件。
- 自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
- 隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
- 基于密钥的身份验证:对基于密码登录的更加安全的替代。
- 基于证书的验证:集中信任管理和更好的可扩展性。
- 增强了安全性:禁用 root 登录、限制用户访问、强制强加密和其他此类强化,确保更强的系统安全性。
1.7.1. sshd RHEL 系统角色如何将 playbook 中的设置映射到配置文件 复制链接链接已复制到粘贴板!
在 sshd RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。
如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config 文件。
在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yes 和 no。您可以使用列表来定义多行配置项。例如:
sshd_ListenAddress: - 0.0.0.0 - '::'
sshd_ListenAddress:
- 0.0.0.0
- '::'
呈现为:
ListenAddress 0.0.0.0 ListenAddress ::
ListenAddress 0.0.0.0
ListenAddress ::
1.7.2. 使用 sshd RHEL 系统角色配置 OpenSSH 服务器 复制链接链接已复制到粘贴板!
您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:
- 管理来自远程客户端的传入 SSH 连接
- 凭证验证
- 保护数据传输和命令执行
您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9 及更新版本)。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 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)手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
登录到 SSH 服务器:
ssh <username>@<ssh_server>
$ ssh <username>@<ssh_server>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 SSH 服务器上
sshd_config文件的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查您是否可以以 root 用户身份从
192.0.2.0/24子网连接到服务器:确定您的 IP 地址:
hostname -I 192.0.2.1
$ hostname -I 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 IP 地址在
192.0.2.1-192.0.2.254范围内,您可以连接到服务器。以
root用户身份连接到服务器:ssh root@<ssh_server>
$ ssh root@<ssh_server>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:对于运行 RHEL 8 或更早版本的受管节点:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于运行 RHEL 9 或更高版本的受管节点:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 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)手册页。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证 SSH 服务器上的配置:
对于运行 RHEL 8 或更早版本的受管节点:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于运行 RHEL 9 或更高版本的受管节点:
cat /etc/ssh/sshd_config.d/42-my_application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITOR
# cat /etc/ssh/sshd_config.d/42-my_application.conf # Ansible managed # AcceptEnv LANG LS_COLORS EDITORCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7.4. 使用 sshd RHEL 系统角色覆盖 SSH 服务器上的系统范围的加密策略 复制链接链接已复制到粘贴板!
当默认加密设置不符合某些安全或兼容性需求时,您可能需要使用 sshd RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围加密策略。特别是在以下值得注意的情况:
- 与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
- 强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
- 性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
- 针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
从 sshd RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA-1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
sshd_KexAlgorithms-
您可以选择密钥交换算法,例如
ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1或diffie-hellman-group-exchange-sha256。 sshd_Ciphers-
您可以选择密码,例如
aes128-ctr、es192-ctr或aes256-ctr。 sshd_MACs-
您可以选择 MAC,例如
hmac-sha2-256、hmac-sha2-512或hmac-sha1。 sshd_HostKeyAlgorithms-
您可以选择一个公钥算法,如
ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521或ssh-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_policy和sshd_sysconfig变量设置为true来启用覆盖。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7.5. ssh RHEL 系统角色如何将 playbook 中的设置映射到配置文件 复制链接链接已复制到粘贴板!
在 ssh RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。
如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config 文件。
在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yes 或 no。您可以使用列表来定义多行配置项。例如:
LocalForward: - 22 localhost:2222 - 403 localhost:4003
LocalForward:
- 22 localhost:2222
- 403 localhost:4003
呈现为:
LocalForward 22 localhost:2222 LocalForward 403 localhost:4003
LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
配置选项区分大小写。
1.7.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端 复制链接链接已复制到粘贴板!
您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:
- 安全连接启动
- 凭证置备
- 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
- 能够安全地向和从 OpenSSH 服务器发送文件
您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 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)手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
通过显示 SSH 配置文件来验证受管节点是否有正确的配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 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输入管理命令的权限。需要此类权限的命令标记为#。
流程
为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 Elliptic Curve Digital Signature Algorithm(ECDSA)密钥:
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。
使用上一个命令生成的私钥创建证书:
openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<example_CA>" -out <ca.crt>
$ openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<example_CA>" -out <ca.crt>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成的
ca.crt文件是一个自签名 CA 证书,可用来为其他证书签名 10 年。在私有 CA 的情况下,您可以将<example_CA>替换为任何通用名称(CN)的字符串 。对 CA 的私钥设置安全权限,例如:
chown <root>:<root> <ca.key> chmod 600 <ca.key>
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以
root用户身份将其添加到客户端的系统范围信任存储中:trust anchor <ca.crt>
# trust anchor <ca.crt>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅 使用共享的系统证书 一章。
验证
创建证书签名请求(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
$ 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 KeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请参阅 第 2.5 节 “使用私有 CA 使用 OpenSSL 为 CSR 发布证书” 了解更多信息。
显示有关自签名 CA 的基本信息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证私钥的一致性:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. 使用 OpenSSL 为 TLS 服务器证书创建私钥和 CSR 复制链接链接已复制到粘贴板!
您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,您必须首先为您的服务器创建私钥和证书签名请求(CSR)。
流程
在服务器系统上生成私钥,例如:
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server_private.key>
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server_private.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow extendedKeyUsage = serverAuth选项限制证书的使用。使用之前创建的私钥创建 CSR:
openssl req -key <server_private.key> -config <example_server.cnf> -new -out <server_cert.csr>
$ openssl req -key <server_private.key> -config <example_server.cnf> -new -out <server_cert.csr>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略了
-config选项,req工具会提示您额外的信息,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
- 将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 OpenSSL 为 CSR 发布证书。
验证
从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. 使用 OpenSSL 为 TLS 客户端证书创建私钥和 CSR 复制链接链接已复制到粘贴板!
您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,您必须首先为您的客户端创建私钥和证书签名请求(CSR)。
流程
在客户端系统上生成私钥,例如:
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow extendedKeyUsage = clientAuth选项限制证书的使用。使用之前创建的私钥创建 CSR:
openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>
$ openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略了
-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>
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 Copied! Toggle word wrap Toggle overflow
后续步骤
- 将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 OpenSSL 为 CSR 发布证书 部分。
验证
检查证书的人类可读部分是否与您的要求匹配,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5. 使用私有 CA 使用 OpenSSL 为 CSR 发布证书 复制链接链接已复制到粘贴板!
要让系统建立一条 TLS 加密的通信频道,证书颁发机构(CA)必须为它们提供有效的证书。如果您有私有 CA,您可以通过从系统签署证书签名请求(CSR)来创建请求的证书。
前提条件
- 您已配置了私有 CA。如需更多信息,请参阅 使用 OpenSSL 创建私有 CA 部分。
- 您有一个包含 CSR 的文件。您可以在 第 2.3 节 “使用 OpenSSL 为 TLS 服务器证书创建私钥和 CSR” 部分中找到创建 CSR 的示例。
流程
可选:使用您选择的文本编辑器,来准备一个 OpenSSL 配置文件,以便向证书添加扩展,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,上例仅演示了原则,且
openssl不会将所有扩展自动添加到证书中。您必须将所需的扩展添加到 CNF 文件中,或者将它们附加到openssl命令的参数中。使用
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
$ 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 KeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要提高安全性,请在从 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 或自签名证书。例如:
当为一组证书和系统配置了 DEFAULT:TEST-PQ 系统范围的加密策略时,OpenSSL 服务器和客户端可以建立一个 post-quantum 连接和一个仅使用传统算法的连接。
使用 PQC 密钥交换和 PQC 证书建立一个连接,例如:
建立一个只使用非 post-quantum 加密算法的连接,例如:
您可以将服务器配置为同时使用传统证书(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
$ dnf install gnutls-utilsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 ECDSA (Elliptic Curve Digital Signature Algorithm)密钥:
certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>
$ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。
为证书创建一个模板文件。
使用您选择的文本编辑器创建一个文件,例如:
vi <ca.cfg>
$ vi <ca.cfg>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑文件以包含必要的认证详情:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用在第 1 步中生成的私钥创建一个签名的证书:
生成的 <ca.crt> 文件是一个自签名 CA 证书,可用于为其他证书签名一年。<ca.crt> 文件是公钥(证书)。加载的文件 <ca.key> 是私钥。您应该将此文件保存在安全的地方。
certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>
$ certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对 CA 的私钥设置安全权限,例如:
chown <root>:<root> <ca.key> chmod 600 <ca.key>
# chown <root>:<root> <ca.key> # chmod 600 <ca.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以
root用户身份将其添加到客户端的系统范围信任存储中:trust anchor <ca.crt>
# trust anchor <ca.crt>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅 使用共享的系统证书 一章。
验证
显示有关自签名 CA 的基本信息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建证书签名请求(CSR),并使用您的 CA 为请求签名。CA 必须成功创建一个基于 CSR 的证书,例如:
为您的 CA 生成一个私钥:
certtool --generate-privkey --outfile <example_server.key>
$ certtool --generate-privkey --outfile <example_server.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在您选择的文本编辑器中打开一个新配置文件,例如:
vi <example_server.cfg>
$ vi <example_server.cfg>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑文件以包含必要的认证详情:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用之前创建的私钥生成一个请求:
certtool --generate-request --load-privkey <example_server.key> --template <example_server.cfg> --outfile <example_server.crq>
$ certtool --generate-request --load-privkey <example_server.key> --template <example_server.cfg> --outfile <example_server.crq>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成证书并使用 CA 的私钥对其签名:
certtool --generate-certificate --load-request <example_server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example_server.crt>
$ 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 Copied! Toggle word wrap Toggle overflow
2.8. 使用 GnuTLS 为 TLS 服务器证书创建私钥和 CSR 复制链接链接已复制到粘贴板!
要获取证书,您必须首先为您的服务器创建私钥和证书签名请求(CSR)。
流程
在服务器系统上生成私钥,例如:
certtool --generate-privkey --sec-param High --outfile <example_server.key>
$ certtool --generate-privkey --sec-param High --outfile <example_server.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用之前创建的私钥创建 CSR:
certtool --generate-request --template <example_server.cfg> --load-privkey <example_server.key> --outfile <example_server.crq>
$ certtool --generate-request --template <example_server.cfg> --load-privkey <example_server.key> --outfile <example_server.crq>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略
--template选项,certool工具会提示您输入额外的信息,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
- 将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 GnuTLS 为 CSR 发布证书。
验证
从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.9. 使用 GnuTLS 为 TLS 客户端证书创建私钥和 CSR 复制链接链接已复制到粘贴板!
要获取证书,您必须首先为您的客户端创建私钥和证书签名请求(CSR)。
流程
在客户端系统上生成私钥,例如:
certtool --generate-privkey --sec-param High --outfile <example_client.key>
$ certtool --generate-privkey --sec-param High --outfile <example_client.key>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:使用您选择的文本编辑器,来准备一个简化创建 CSR 的配置文件,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用之前创建的私钥创建 CSR:
certtool --generate-request --template <example_client.cfg> --load-privkey <example_client.key> --outfile <example_client.crq>
$ certtool --generate-request --template <example_client.cfg> --load-privkey <example_client.key> --outfile <example_client.crq>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略
--template选项certtool工具会提示您输入额外的信息,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
- 将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。请参阅 第 2.10 节 “使用私有 CA ,使用 GnuTLS 为 CSR 发布证书” 了解更多信息。
验证
检查证书的人类可读部分是否与您的要求匹配,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.10. 使用私有 CA ,使用 GnuTLS 为 CSR 发布证书 复制链接链接已复制到粘贴板!
要让系统建立一条 TLS 加密的通信频道,证书颁发机构(CA)必须为它们提供有效的证书。如果您有私有 CA,您可以通过从系统签署证书签名请求(CSR)来创建请求的证书。
前提条件
- 您已配置了私有 CA。请参阅 第 2.7 节 “使用 GnuTLS 创建私有 CA” 了解更多信息。
- 您有一个包含 CSR 的文件。您可以在 第 2.8 节 “使用 GnuTLS 为 TLS 服务器证书创建私钥和 CSR” 中找到创建 CSR 的示例。
流程
可选:使用您选择的文本编辑器准备 GnuTLS 配置文件,来为证书添加扩展,例如:
vi <server_extensions.cfg> honor_crq_extensions ocsp_uri = "http://ocsp.example.com"
$ vi <server_extensions.cfg> honor_crq_extensions ocsp_uri = "http://ocsp.example.com"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
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>
$ 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 Copied! Toggle word wrap Toggle overflow
第 4 章 计划并使用 TLS 复制链接链接已复制到粘贴板!
TLS(传输层安全)是用来保护网络通信的加密协议。在通过配置首选密钥交换协议、身份验证方法和加密算法来强化系统安全设置时,需要记住支持的客户端的范围越广,产生的安全性就越低。相反,严格的安全设置会导致与客户端的兼容性受限,这可能导致某些用户被锁定在系统之外。请确保以最严格的可用配置为目标,并且仅在出于兼容性原因需要时才放宽配置。
4.1. SSL 和 TLS 协议 复制链接链接已复制到粘贴板!
安全套接字层(SSL)协议最初使由 Netscape 公司开发的,以提供一种在互联网上进行安全通信的机制。因此,该协议被互联网工程任务组(IETF)采纳,并重命名为传输层安全(TLS)。
TLS 协议位于应用协议层和可靠的传输层之间,例如 TCP/IP。它独立于应用程序协议,因此可在很多不同的协议下分层,如 HTTP、FTP、SMTP 等等。
| 协议版本 | 用法建议 |
|---|---|
| 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 版本。DEFAULT、FUTURE 和 LEGACY 加密策略只允许 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 服务器 可以使用 OpenSSL 和 NSS 库来满足其 TLS 的需求。RHEL 10 通过 eponymous 软件包提供 mod_ssl 功能:
dnf install mod_ssl
# dnf install mod_ssl
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
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
如需更多信息,请参阅部署 Web 服务器和反向代理文档中的 对 Apache HTTP 服务器配置 TLS 加密 一章。
4.3.2. 将 Nginx HTTP 和代理服务器配置为使用 TLS 复制链接链接已复制到粘贴板!
要在 Nginx 中启用 TLS 1.3 支持,请将 TLSv1.3 值添加到 /etc/nginx/nginx.conf 配置文件的 server 部分的 ssl_protocols 选项:
如需更多信息,请参阅部署 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
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
第 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 解析过程和核心交互 复制链接链接已复制到粘贴板!
- 解析主机名的应用程序请求。
-
系统读取
/etc/resolv.conf文件,并将查询发送给本地unbound服务。 -
unbound首先检查其内部缓存,来检查有效的,缓存的响应。 -
如果没有找到请求记录,
unbound会使用 TLS 加密 DNS 查询,并将其发送到配置好的上游启用了 DoT 的 DNS 服务器。 -
上游 DoT 服务器处理查询,并将加密的 DNS 响应发回给
unbound。 -
unbound解密、验证和缓存响应。 -
最后,
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 文件。
流程
可选:创建带有
%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
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %endCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 准备可引导安装介质,如果需要自定义 CA 捆绑包,还要包括 Kickstart 文件。
- 引导安装介质。
-
在引导菜单窗口中选择所需选项,然后按
e键编辑引导参数。 添加 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
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.ksCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
完成编辑后,按
Ctrl+X使用指定的选项开始安装。
验证
验证您的 eDNS 配置:
dnsconfd status
$ dnsconfd statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
nslookup验证 DNS 服务器是否有响应:nslookup <domain_name>
$ nslookup <domain_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<domain_name>替换为您要查询的域。
故障排除
在
unbound中启用详细日志记录:unbound-control verbosity 5
# unbound-control verbosity 5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看相关服务的日志:
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<service_name>替换为NetworkManager、dnsconfd或unbound。
5.3. 使用自定义的可引导 ISO 安装启用了 eDNS 的 RHEL 复制链接链接已复制到粘贴板!
创建一个自定义可引导 ISO 来安装带有 eDNS enforce 策略的 RHEL,确保所有 DNS 查询在安装过程中及之后都是私有的和安全的。如果需要一个自定义 CA 证书捆绑包,则必须使用 Kickstart 文件中的 %certificate 部分安装它。然后,您在脚本中引用这个 Kickstart 文件,来构建新的 ISO,其中包括用于强制执行严格的 DoT 策略的内核参数。如果您的环境允许回退到未加密的 DNS,您可以执行标准 RHEL 安装,并在之后配置 eDNS。
先决条件
-
以
#命令提示符开头的命令需要sudo提供的管理特权或 root 用户访问权限。有关如何配置sudo访问权限的详情,请参考 启用非特权用户,以运行某些命令。 - 您已从产品下载页面下载了最小安装引导 ISO 镜像。
-
如果您需要自定义 CA 捆绑包,那么您需要准备好了一个带有
%certificate部分的 Kickstart 文件。 -
lorax软件包已安装。
流程
可选:创建带有
%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
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %endCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将 Kickstart 文件和内核参数添加到 ISO 中:
下面的脚本示例演示了如何创建一个自定义的启用了 eDNS 的可引导 ISO。您必须创建一个脚本文件来自动化此过程。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行脚本。
sh <script_filename>
sh <script_filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用自定义 ISO 文件安装 RHEL。
验证
验证您的 eDNS 配置:
dnsconfd status
$ dnsconfd statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
nslookup验证 DNS 服务器是否有响应:nslookup <domain_name>
$ nslookup <domain_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<domain_name>替换为您要查询的域。
故障排除
在
unbound中启用详细日志记录:unbound-control verbosity 5
# unbound-control verbosity 5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看相关服务的日志:
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<service_name>替换为NetworkManager、dnsconfd或unbound。
5.4. 在现有 RHEL 安装上启用 eDNS 复制链接链接已复制到粘贴板!
您可以在现有 RHEL 安装上启用加密的 DNS (eDNS),以使用 DNS-over-TLS 处理所有 DNS 流量。
先决条件
-
以
#命令提示符开头的命令需要sudo提供的管理特权或 root 用户访问权限。有关如何配置sudo访问权限的详情,请参考 启用非特权用户,以运行某些命令。 - 有一个现有的 RHEL 安装。
以下软件包已安装在您的系统上:
-
dnsconfd -
dnsconfd-dracut -
grubby
-
-
如果在 IBM Z 系统上,则已安装了
zipl工具。
流程
在
/etc/NetworkManager/conf.d/global-dot.conf文件中配置 NetworkManager:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关全局 DNS 选项的详情,请查看您系统上
NetworkManager.conf (5)手册页中的GLOBAL-DNS SECTION。可选:要使用自定义 CA 捆绑包验证上游 DoT 服务器,请将 PEM 格式的文件复制到
/etc/pki/dns/extracted/pem/tls-ca-bundle.pem文件中。注意在
/etc/pki/dns/extracted/pem中添加或删除证书后,重启dnsconfd服务以应用更改。启用
dnsconfd服务:systemctl enable --now dnsconfd
# systemctl enable --now dnsconfdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入 NetworkManager:
systemctl reload NetworkManager
# systemctl reload NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为所有安装的内核重新生成
initramfs,以包含dnsconfd及其配置:for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do dracut -f --kver="$kernel" done# for kernel in `rpm -q kernel --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n'`; do dracut -f --kver="$kernel" doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将内核参数设置为当前和新安装的内核版本:
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
# 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=ALLCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果在 IBM Z 上,更新引导菜单:
zipl
# ziplCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您的 eDNS 配置:
dnsconfd status
$ dnsconfd statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 预期输出:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
nslookup验证 DNS 服务器是否有响应:nslookup <domain_name>
$ nslookup <domain_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<domain_name>替换为您要查询的域。
故障排除
在
unbound中启用详细日志记录:unbound-control verbosity 5
# unbound-control verbosity 5Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看相关服务的日志:
journalctl -xe -u <service_name>
$ journalctl -xe -u <service_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<service_name>替换为NetworkManager、dnsconfd或unbound。
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>
rd.net.dns=dns+tls://<server_ip_1>#<dns_server_hostname_1> rd.net.dns=dns+tls://<server_ip_2>#<dns_server_hostname_2>
例如:
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
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
rd.net.dns-backend
指定后端 DNS 解析器。当设置为 dnsconfd 时,系统使用 dnsconfd 作为本地 DNS 缓存配置守护进程。
第 6 章 设置 IPsec VPN 复制链接链接已复制到粘贴板!
Libreswan 是互联网协议安全(IPsec)协议套件的一种实现。您可以使用 Libreswan 配置虚拟专用网络(VPN),该网络在不受信任的网络(如互联网)之上建立安全加密的隧道。这些隧道确保数据在传输过程的保密性和完整性。常见用例包括将分支机构连接到总部,或为远程用户提供对公司网络的安全访问。
RHEL 提供不同的选项来配置 Libreswan:
- 手动编辑 Libreswan 配置文件,来精细控制高级选项。
-
使用
vpnRHEL 系统角色自动化创建 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 在主身份验证方法之上增加了另一个安全层,其安全依赖于使用通过外部通信渠道安全分发的加密强密钥。
6.3. 手动配置具有原始 RSA 密钥身份验证的 IPsec 主机到主机 VPN 复制链接链接已复制到粘贴板!
主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。
对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。
在两个主机上执行步骤。
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装
libreswan软件包:dnf install libreswan
# dnf install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。启用并启动
ipsec服务:systemctl enable --now ipsec
# systemctl enable --now ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec工具将密钥对存储在 NSS 数据库中。- 指定您的对等服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,将另一个主机指定为 right。这是一个武断的选择。常见的做法是调用您的本地主机 left 和远程主机right。
在左侧和右侧显示证书密钥属性 ID (CKAID):
ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 后面步骤中需要两个对等点的 CKAID。
显示公钥:
在左侧对等点中,输入:
ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在右侧对等点中,输入:
ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
命令显示公钥,以及必须在配置文件中使用的相应参数。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,使用以下设置创建/etc/ipsec.d/host-to-host.conf文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以在两个主机上使用相同的配置文件,Libreswan 使用内部信息识别其在左还是右主机上运行。但是,重要的是
left*参数中的所有值都属于一个对等点,right*参数中的值属于另一个对等点。示例中指定的设置包括:
conn <connection_name>- 定义连接名称。名称是任意的,Libreswan 使用它来识别连接。您必须至少使用一个空格或标签页缩进这个连接中的参数。
auto=<type>-
控制如何发起连接。如果将值设为
start,Libreswan 会在服务启动时自动激活连接。 authby=rsasig- 为此连接启用 RSA 签名身份验证。
left=<ip_address_or_fqdn_of_left_peer>andright=<ip_address_or_fqdn_of_right_peer>- 定义对等点的 IP 地址或 DNS 名称。
leftid=<id>andrightid=<id>-
定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个完全限定域名(FQDN)、IP 地址或字面字符串。在后一种情况,在字符串前面加上
@符号。 leftrsasigkey=<public_key>andrightrsasigkey=<public_key>-
指定对等点的公钥。使用上一步中
ipsec showhostkey命令显示的值。
重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在配置文件中使用
auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的ipsec.conf (5)手册页。
验证
显示 IPsec 状态:
ipsec status
# ipsec statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果成功建立连接,输出会包含如下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安全联盟(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;
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 Copied! Toggle word wrap Toggle overflow 这是您的数据流量通过的实际隧道。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.4. 手动配置带有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN 复制链接链接已复制到粘贴板!
站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这使分支机构中的设备能够访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。
对于验证网关设备,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。
对两个网关设备执行这些步骤。
先决条件
- 两个网络中的路由确保发送到远程网络的流量通过本地 VPN 网关设备进行发送。
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装
libreswan软件包:dnf install libreswan
# dnf install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。启用并启动
ipsec服务:systemctl enable --now ipsec
# systemctl enable --now ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec工具将密钥对存储在 NSS 数据库中。- 指定您的对等服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,将另一个主机指定为 right。这是一个武断的选择。常见的做法是调用您的本地主机 left 和远程主机right。
在左侧和右侧显示证书密钥属性 ID (CKAID):
ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 后面步骤中需要两个对等点的 CKAID。
显示公钥:
在左侧对等点中,输入:
ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在右侧对等点中,输入:
ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
命令显示公钥,以及必须在配置文件中使用的相应参数。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,创建带有以下设置的/etc/ipsec.d/site-to-site.conf文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以对两个网关设备使用相同的配置文件,Libreswan 使用内部信息识别其在左还是右主机上操作。但是,重要的是
left*参数中的所有值都属于一个对等点,right*参数中的值属于另一个对等点。示例中指定的设置包括:
conn <connection_name>- 定义连接名称。名称是任意的,Libreswan 使用它来识别连接。您必须至少使用一个空格或标签页缩进这个连接中的参数。
auto=<type>-
控制如何发起连接。如果将值设为
start,Libreswan 会在服务启动时自动激活连接。 authby=rsasig- 为此连接启用 RSA 签名身份验证。
left=<ip_address_or_fqdn_of_left_peer>andright=<ip_address_or_fqdn_of_right_peer>- 定义对等点的 IP 地址或 DNS 名称。
leftid=<id>andrightid=<id>-
定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个完全限定域名(FQDN)、IP 地址或字面字符串。在后一种情况,在字符串前面加上
@符号。 leftrsasigkey=<public_key>andrightrsasigkey=<public_key>-
指定对等点的公钥。使用上一步中
ipsec showhostkey命令显示的值。 leftsubnet=<subnet>andrightsubnet=<subnet>- 定义通过隧道连接的无类别域间路由(CIDR)格式的子网。如果要在一端隧道连接多个子网,请在大括号中指定它们,并使用逗号分隔它们。
启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在配置文件中使用
auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的ipsec.conf (5)手册页。
验证
显示 IPsec 状态:
ipsec status
# ipsec statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果成功建立连接,输出会包含如下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
#2: "<connection_name>":500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 28523s; REPLACE in 28793s; newest; idle;
#2: "<connection_name>":500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 28523s; REPLACE in 28793s; newest; idle;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安全联盟(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;
#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 Copied! Toggle word wrap Toggle overflow 这是您的数据流量通过的实际隧道。
- 从本地子网中的客户端 ping 远程子网中的客户端。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.5. 手动配置带有基于证书身份验证的 IPsec 主机到站点 VPN 复制链接链接已复制到粘贴板!
主机到站点的 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。
-
扩展的密钥用法(EKU)被设置为
- VPN 客户端流量的返回路由在内部网络上配置,指向 VPN 网关。
流程
如果 Libreswan 尚未安装:
安装
libreswan软件包:dnf install libreswan
# dnf install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。启用并启动
ipsec服务:systemctl enable --now ipsec
# systemctl enable --now ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
将 PKCS #12 文件导入到 NSS 数据库中:
ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CACopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示服务器和 CA 证书的昵称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您需要将此信息用于配置文件。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,创建带有以下设置的/etc/ipsec.d/host-to-site.conf文件:添加
config setup部分,以启用 CRL 检查:config setup crl-strict=yes crlcheckinterval=1hconfig setup crl-strict=yes crlcheckinterval=1hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
crl-strict=yes- 启用 CRL 检查。如果 NSS 数据库中没有 CRL,则身份验证客户端将被拒绝。
crlcheckinterval=1h- 在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
为网关添加一部分:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
ikev2=insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。
left=%defaultroute-
当
ipsec服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将left参数设置为 IP 地址或主机的 FQDN。 leftid=%fromcert和rightid=%fromcert- 将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
leftcert="<server_certificate_nickname>"- 设置 NSS 数据库中使用的服务器证书的昵称。
leftrsasigkey=%cert和rightrsasigkey=%cert- 将 Libreswan 配置为使用嵌入在证书中的 RSA 公钥。
leftsendcert=always- 指示网关始终发送证书,以便客户端可以针对 CA 证书验证它。
leftsubnet=<subnets>- 指定连接到客户端可以通过隧道访问的网关的子网。
mobike=yes- 使客户端能够在网络之间无缝漫游。
rightaddresspool=<ip_range>- 指定网关可以为客户端分配 IP 地址的范围。
modecfgclient=yes-
使客户端能够接收
modecfgdns参数中设置的 DNS 服务器 IP,以及modecfgdomains中设置的 DNS 搜索域。
有关示例中使用的所有参数的详情,请查看您系统上的
ipsec.conf (5)手册页。启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在配置文件中使用
auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看您系统上的ipsec.conf (5)手册页。
验证
- 配置一个客户端并连接到 VPN 网关。
检查服务是否已载入 CRL ,并将条目添加到 NSS 数据库中:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤:
- 配置防火墙规则,以确保客户端只能与所需的资源进行通信。有关防火墙的详情,请参阅 配置防火墙和数据包过滤器。
6.5.2. 使用 GNOME Settings 将客户端配置为连接到 IPsec VPN 网关 复制链接链接已复制到粘贴板!
要访问远程私有网络上的资源,用户必须首先配置一个 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。
流程
初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。将 PKCS #12 文件导入到 NSS 数据库中:
ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CACopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示用户和 CA 证书的昵称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在配置文件中,您需要此信息。
- 按 Super 键,输入 Settings,然后按 Enter 键打开 GNOME Settings 应用程序。
- 点 VPN 条目旁边的 按钮。
- 从列表中选择 IPsec based VPN。
在 Identity 选项卡上,按如下所示填写字段:
Expand 表 6.1. Identity 选项卡设置 字段名称 值 相应的 ipsec.conf参数Name
<networkmanager_profile_name>N/A
Gateway
<ip_address_or_fqdn_of_the_gateway>rightType
IKEv2 (certificate)authbyGroup name
%fromcertleftidCertificate name
<user_certificate_nickname>leftcertRemote ID
%fromcertrightid- 单击 Advanced。
在 Advanced properties 窗口中,填写 Connectivity 选项卡的字段,如下所示:
Expand 表 6.2. Connectivity 选项卡设置 字段名称 值 相应的 ipsec.conf参数Remote Network
192.0.2.0/24rightsubnetNarrowing
Selected
narrowingEnable MOBIKE
yesmobikeDelay
30dpddelayTimeout(超时)
120dpdtimeout操作
清除dpdaction- 点 返回到连接设置。
- 点 保存连接。
- 在 Settings 应用程序的 Network 选项卡中,切换 VPN 配置文件旁边的开关来激活连接。
验证
- 建立到远程网络中主机的连接或 ping 它。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.6. 手动配置带有基于证书身份验证的 IPsec 网状 VPN 复制链接链接已复制到粘贴板!
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。
-
扩展的密钥用法(EKU)被设置为
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装
libreswan软件包:dnf install libreswan
# dnf install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。启用并启动
ipsec服务:systemctl enable --now ipsec
# systemctl enable --now ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
将 PKCS #12 文件导入到 NSS 数据库中:
ipsec import <file>.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA
# ipsec import <file>.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CACopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示服务器和 CA 证书的昵称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您需要将此信息用于配置文件。
在
/etc/ipsec.d/目录中为连接创建一个.conf文件。例如,创建带有以下设置的/etc/ipsec.d/mesh.conf文件:添加
config setup部分,以启用 CRL 检查:config setup crl-strict=yes crlcheckinterval=1hconfig setup crl-strict=yes crlcheckinterval=1hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
crl-strict=yes- 启用 CRL 检查。如果 NSS 数据库中没有 CRL,则验证对等点将被拒绝。
crlcheckinterval=1h- 在指定的时间段后,从服务器证书中指定的 URL 重新获取 CRL。
添加一个在网格中的成员之间强制流量的部分:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
left=%defaultroute-
当
ipsec服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将left参数设置为 IP 地址或主机的 FQDN。 leftid=%fromcert和rightid=%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)手册页。创建
/etc/ipsec.d/policies/server-mesh策略文件,该文件以无类别域间路由(CIDR)格式指定对等点或子网:192.0.2.0/24 198.51.100.0/24
192.0.2.0/24 198.51.100.0/24Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些设置,
ipsec服务会加密这些子网中主机之间的流量。如果主机没有配置为 IPsec 网格的成员,则此主机和网格成员之间的通信会失败。重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 对您在策略文件中指定的子网中的每个主机重复这个过程。
验证
将流量发送到网格中的主机来建立隧道。例如,ping 主机:
ping -c3 <peer_in_mesh>
# ping -c3 <peer_in_mesh>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 IPsec 状态:
ipsec status
# ipsec statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果连接成功建立了,输出会包含对等点的以下行:
互联网密钥交换版本 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;
#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 Copied! Toggle word wrap Toggle overflow 安全联盟(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;
#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 Copied! Toggle word wrap Toggle overflow 这是您的数据流量通过的实际隧道。
检查服务是否已载入 CRL ,并将条目添加到 NSS 数据库中:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.7. 使用密码保护 IPsec NSS 数据库 复制链接链接已复制到粘贴板!
默认情况下,只有 root 用户可以访问 /var/lib/ipsec/nss/ 目录中的 IPsec 网络安全服务(NSS)数据库。如果需要,您还可以使用密码保护数据库。例如,如果您在联邦信息处理标准(FIPS)模式下运行 RHEL,则需要这个。
先决条件
-
/var/lib/ipsec/nss/目录包含 NSS 数据库。
流程
为 Libreswan NSS 数据库启用密码保护:
certutil -W -d /var/lib/ipsec/nss/
# certutil -W -d /var/lib/ipsec/nss/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入当前密码:
Enter Password or Pin for "NSS Certificate DB": <password>
Enter Password or Pin for "NSS Certificate DB": <password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果数据库目前不受密码保护,请按 Enter 键。
输入新密码:
Enter new password: <new_password> Re-enter password: <new_password>
Enter new password: <new_password> Re-enter password: <new_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要解锁数据库,
ipsec服务需要/etc/ipsec.d/nsspassword文件。使用以下内容创建文件:如果主机没有在 FIPS 模式下运行:
NSS Certificate DB:<password>
NSS Certificate DB:<password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果主机在 FIPS 模式下运行:
NSS FIPS 140-2 Certificate DB:<password>
NSS FIPS 140-2 Certificate DB:<password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
对
/etc/ipsec.d/nsspassword文件设置安全权限:chmod 600 /etc/ipsec.d/nsspassword chown root:root /etc/ipsec.d/nsspassword
# chmod 600 /etc/ipsec.d/nsspassword # chown root:root /etc/ipsec.d/nsspasswordCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
ipsec服务是否正在运行:systemctl is-active ipsec
# systemctl is-active ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果命令返回
active,则服务成功使用密码文件解锁 NSS 数据库。对需要密码的 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":
# 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 Copied! Toggle word wrap Toggle overflow 验证命令是否提示输入密码。
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
# ipsec whack --fipsstatus
FIPS mode enabled
要在 FIPS 模式下列出 Libreswan 中允许的算法和密码,请输入:
6.9. 为 IPsec VPN 连接配置 TCP 回退 复制链接链接已复制到粘贴板!
在阻止 UDP 和封装安全 Payload (ESP)协议的限制网络上,标准 IPsec VPN 可能会失败。为确保此类环境中的连接性,Libreswan 可以在 TCP 连接中封装所有 VPN 流量,这是 RFC 8229 中所述的一种方法。
在 TCP 中封装 VPN 数据包可减少吞吐量,并增加延迟。因此,只使用 TCP 封装作为一个回退选项,或者基于 UDP 的连接是否在您的环境中始终被阻止。
先决条件
- IPsec 连接已配置。
流程
编辑
/etc/ipsec.conf文件,并在config setup部分中进行以下更改:将 Libreswan 配置为侦听一个 TCP 端口:
listen-tcp=yes
listen-tcp=yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,Libreswan 侦听端口 4500。如果要使用不同的端口,请输入:
tcp-remoteport=<port_number>
tcp-remoteport=<port_number>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 UDP 不可用或永久不可用,决定是否将 TCP 用作一个回退选项:
作为一个回退选项,请输入:
enable-tcp=fallback retransmit-timeout=5s
enable-tcp=fallback retransmit-timeout=5sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,在通过 TCP 重试连接前,Libreswan 会在尝试连接失败后等待 60 秒。降低
retransmit-timeout值会缩短延迟,使回退协议可以更快地启动。作为 UDP 的永久替换,请输入:
enable-tcp=yes
enable-tcp=yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您配置了一个与默认 4500 不同的 TCP 端口,请在防火墙中打开该端口:
firewall-cmd --permanent --add-port=<tcp_port>/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=<tcp_port>/tcp # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 在使用此网关的对等点上重复这个过程。
6.10. 在 Libreswan 中启用旧的密码和算法 复制链接链接已复制到粘贴板!
RHEL 使用系统范围的加密策略为所有应用程序(包括 Libreswan )实施一致且安全的基准。这些策略确保 IPsec 和互联网密钥交换(IKE)默认只使用强大的现代的加密密码和算法。但是,您可能需要有意降低安全性,以便与其他 IPsec 对等点向后兼容。
RHEL 系统范围的加密策略会创建一个名为 %default 的特殊连接。此连接为 keyexchange、esp 和 ike 参数设置默认值。
先决条件
- Libreswan 已安装。
流程
要覆盖 RHEL 系统范围的加密策略设置的默认值,请在连接配置中添加
keyexchange、esp和ike参数,并将它们设置为您需要的值。例如:conn <connection_name> keyexchange=ikev1 ike=aes-sha2,aes-sha1;modp2048 esp=aes-sha2,aes-sha1 ...conn <connection_name> keyexchange=ikev1 ike=aes-sha2,aes-sha1;modp2048 esp=aes-sha2,aes-sha1 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
ipsec服务:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.11. 将 VPN 连接分配给专用的路由表,以防止连接绕过隧道 复制链接链接已复制到粘贴板!
DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口,而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并在 CVE-2024-3661 漏洞文章中进行了所述。
要缓解此漏洞,您可以将 VPN 连接分配给一个专用的路由表。这可防止 DHCP 配置或 SLAAC 操纵用于 VPN 隧道的网络数据包的路由决策。
如果至少有一个条件适用于到您的环境,请按照以下步骤操作:
- 至少有一个网络接口使用 DHCP 或 SLAAC。
- 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
通过 VPN 路由整个流量可防止主机访问本地网络资源。
流程
- 决定您要使用哪个路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
配置 VPN 连接配置文件,来将 VPN 路由放在专用的路由表中:
nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您在之前的命令中使用的表设置一个低优先级值:
nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
# 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 Copied! Toggle word wrap Toggle overflow 优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。
重新连接 VPN 连接:
nmcli connection down <vpn_connection_profile> nmcli connection up <vpn_connection_profile>
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示表 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
# 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 50Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了
ipv4.never-default true,则不会创建默认路由,因此在此输出中不可见。显示表 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
# 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 mediumCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了
ipv6.never-default true,则不会创建默认路由,因此在此输出中不可见。
6.12. 使用 RHEL 系统角色配置 IPsec VPN 连接 复制链接链接已复制到粘贴板!
您可以使用虚拟专用网络(VPN)建立一个在不可信网络(如互联网)上的安全的、加密的隧道。此类隧道确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部。
通过使用 vpn RHEL 系统角色,您可以自动化创建 Libreswan IPsec VPN 配置的过程。
vpn RHEL 系统角色只能创建 VPN 配置,该配置使用预共享密钥(PSK)或证书来相互验证对等点。
6.12.1. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN 复制链接链接已复制到粘贴板!
主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。
对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。
通过使用 vpn RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 主机到主机连接的过程。默认情况下,角色创建一个基于隧道的 VPN。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
hosts: <list>定义一个带有您要在它们之间配置 VPN 的对等点的 YAML 字典。如果条目不是一个 Ansible 管理的节点,则您必须在
hostname参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1... - hosts: ... external-host.example.com: hostname: 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 角色在每个受管节点上配置 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>-
指定连接的启动方法。有效值是
add、ondemand、start和ignore。详情请查看安装了 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文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认连接已成功启动,例如:
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'
# 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 Copied! Toggle word wrap Toggle overflow 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全网络(如互联网)安全地进行通信。
对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。
例如,要通过最大程度减少被截获或中断的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 PSK 身份验证的 IPsec 主机到主机连接的过程。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 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>-
指定连接的启动方法。有效值是
add、ondemand、start和ignore。详情请查看安装了 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文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认连接已成功启动,例如:
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'
# 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 Copied! Toggle word wrap Toggle overflow 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
6.12.3. 使用 vpn RHEL 系统角色配置带有 PSK 身份验证的 IPsec 站点到站点 VPN 复制链接链接已复制到粘贴板!
站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这使分支机构中的设备能够访问公司总部中的资源,就如同它们都是同一本地网络的一部分一样。
对于身份验证,预共享密钥(PSK)是一种简单的方法,其使用只对两个对等点已知的单个共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须严格保密密钥。可以访问密钥的攻击者可能会破坏连接。
通过使用 vpn RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 站点到站点连接的过程。默认情况下,角色创建一个基于隧道的 VPN。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
hosts: <list>定义一个带有您要在它们之间配置 VPN 的网关的 YAML 字典。如果条目不是 Ansible 管理的节点,您必须在
hostname参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1... - hosts: ... external-host.example.com: hostname: 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 角色在每个受管节点上配置 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>-
指定连接的启动方法。有效值是
add、ondemand、start和ignore。详情请查看安装了 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文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认连接已成功启动,例如:
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'
# 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 Copied! Toggle word wrap Toggle overflow 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto变量设置为start以外的值,您可能需要首先手动激活受管节点上的连接。
6.12.4. 使用 vpn RHEL 系统角色,配置具有基于证书身份验证的 IPsec 网状 VPN 复制链接链接已复制到粘贴板!
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。
-
扩展的密钥用法(EKU)被设置为
流程
编辑
~/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
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.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
cert_name变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:pkcs12_pwd: <password>
pkcs12_pwd: <password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 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/32的clear策略,如 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文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在网格的一个节点上,ping 另一个节点来激活连接:
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确认连接处于活跃状态:
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'
[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 Copied! Toggle word wrap Toggle overflow
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 只验证状态,且不会防止错误但有效的配置。
通常,选择哪个主机是 left,right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right。
先决条件
远程对等点运行 Libreswan IPsec,并为 主机到主机 连接做好了准备。
由于
NetworkManager-libreswan插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec工具将密钥对存储在 NSS 数据库中。显示左和右对等点上的证书密钥属性 ID (CKAID):
ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 后面步骤中需要两个对等点的 CKAID。
显示公钥:
在左侧对等点中,输入:
ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在右侧对等点中,输入:
ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
命令显示公钥,以及必须在配置文件中使用的相应参数。
创建一个包含以下内容的 YAML 文件,如
~/ipsec-host-to-host-rsa-auth.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
ikev2: insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在使用 Nmstate 的主机配置中,此设置是必须的。
left=<ip_address_or_fqdn_of_left_peer>andright=<ip_address_or_fqdn_of_right_peer>- 定义对等点的 IP 地址或 DNS 名称。
leftid=<id>andrightid=<id>-
定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个 IP 地址或一个字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加一个前导
@符号。这要求 Libreswan peer 也使用字面字符串作为 ID 或身份验证失败。 leftrsasigkey=<public_key>andrightrsasigkey=<public_key>-
指定对等点的公钥。使用上一步中
ipsec showhostkey命令显示的值。 leftmodecfgclient: false- 在此主机上禁用动态配置。在使用 Nmstate 的主机配置中,此设置是必须的。
rightsubnet: <ip_address_of_right_peer>/32- 定义主机只能访问这个对等点。在使用 Nmstate 的主机配置中,此设置是必须的。
将设置应用到系统:
nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
# nmstatectl apply ~/ipsec-host-to-host-rsa-auth.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示 IPsec 状态:
ipsec status
# ipsec statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果成功建立连接,输出会包含如下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安全联盟(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;
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 Copied! Toggle word wrap Toggle overflow 这是您的数据流量通过的实际隧道。
故障排除
要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:
nmcli connection export <connection_name>
# nmcli connection export <connection_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.13.2. 使用 nmstatectl 配置带有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN 复制链接链接已复制到粘贴板!
站点到站点的 VPN 在两个不同的网络之间建立一个安全的、加密的隧道,在不安全的公共网络(如互联网)中无缝连接它们。例如,这可让分支机构中的设备访问公司总部的资源,就如同它们是同一本地网络的一部分一样。
对于验证网关设备,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需要简化部署,同时仍然提供强大的对等身份验证。
您可以使用 Nmstate API 配置与现有 Libreswan IPsec 网关的连接。在这种情况下,Nmstate 可确保生成的配置与 YAML 文件中的定义匹配,或者它自动回滚更改,以避免不正确的系统状态。请注意,Nmstate 只验证状态,且不会防止错误但有效的配置。
通常,选择哪个主机命是 left 和 right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right。
先决条件
远程网关运行 Libreswan IPsec,并为 站点到站点 连接做好了准备。
由于
NetworkManager-libreswan插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。
流程
如果 Libreswan 尚未安装,请执行以下步骤:
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
创建一个 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow ipsec工具将密钥对存储在 NSS 数据库中。在左侧和右侧显示证书密钥属性 ID (CKAID):
ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>
# ipsec showhostkey --list < 1> RSA keyid: <key_id> ckaid: <ckaid>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下步骤中,您需要两个对等点的 CKAID。
显示公钥:
在左侧对等点中,输入:
ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...# ipsec showhostkey --left --ckaid <ckaid_of_left_peer> # rsakey AwEAAdKCx leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在右侧对等点中,输入:
ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...# ipsec showhostkey --right --ckaid <ckaid_of_right_peer> # rsakey AwEAAcNWC rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
命令显示公钥,以及必须在配置文件中使用的相应参数。
创建一个包含以下内容的 YAML 文件,如
~/ipsec-site-to-site-rsa-auth.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
ikev2: insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。此设置在使用 Nmstate 的站点到站点配置中是必须的。
left=<ip_address_or_fqdn_of_left_peer>andright=<ip_address_or_fqdn_of_right_peer>- 定义对等点的 IP 地址或 DNS 名称。
leftid=<id>andrightid=<id>-
定义在互联网密钥交换(IKE)协商过程中每个对等点是如何被识别的。这可以是一个 IP 地址或一个字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加一个前导
@符号。这要求 Libreswan peer 也使用字面字符串作为 ID 或身份验证失败。 leftrsasigkey=<public_key>andrightrsasigkey=<public_key>-
指定对等点的公钥。使用上一步中
ipsec showhostkey命令显示的值。 leftmodecfgclient: false- 在此主机上禁用动态配置。此设置在使用 Nmstate 的站点到站点配置中是必须的。
leftsubnet=<subnet>andrightsubnet=<subnet>- 定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将设置应用到系统:
nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
# nmstatectl apply ~/ipsec-site-to-site-rsa-auth.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示 IPsec 状态:
ipsec status
# ipsec statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果成功建立连接,输出会包含如下行:
互联网密钥交换版本 2 (IKEv2)协商的阶段 1 已成功完成:
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安全联盟(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;
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 Copied! Toggle word wrap Toggle overflow 这是您的数据流量通过的实际隧道。
- 从本地子网中的客户端 ping 远程子网中的客户端。
故障排除
要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:
nmcli connection export <connection_name>
# nmcli connection export <connection_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.13.3. 使用 nmstatectl 将客户端配置为连接到 IPsec VPN 网关 复制链接链接已复制到粘贴板!
要访问远程私有网络上的资源,用户必须首先配置一个 IPsec VPN 连接。您可以使用 Nmstate API 配置与现有 Libreswan IPsec 网关的连接。在这种情况下,Nmstate 可确保生成的配置与 YAML 文件中的定义匹配,或者它自动回滚更改,以避免不正确的系统状态。请注意,Nmstate 只验证状态,且不会防止错误但有效的配置。
通常,选择哪个主机是 left,right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left ,对远程主机使用术语 right。
先决条件
远程网关运行 Libreswan IPsec,并为带有 基于证书的身份验证的主机到站点 连接做好了准备。
由于
NetworkManager-libreswan插件的设计,Nmstate 无法与其他对同一连接使用此插件的对等点进行通信。PKCS#12 文件
~/file.p12在客户端上存在,并包含以下内容:- 用户的私钥
- 用户证书
- CA 证书
- 中间证书(如果需要的话)
有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
-
证书中的扩展密钥用法(EKU)被设置为
TLS Web Client Authentication。
流程
如果 Libreswan 尚未安装:
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 初始化网络安全服务(NSS)数据库:
ipsec initnss
# ipsec initnssCopy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
/var/lib/ipsec/nss/目录下创建数据库。在防火墙中打开 IPsec 端口和协议:
firewall-cmd --permanent --add-service="ipsec" firewall-cmd --reload
# firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
将 PKCS #12 文件导入到 NSS 数据库中:
ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CACopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示用户和 CA 证书的昵称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您在 Nmstate YAML 文件中需要此信息。
创建一个包含以下内容的 YAML 文件,如
~/ipsec-host-to-site-cert-auth.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例中指定的设置包括:
ikev2: insist- 将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。此设置在使用 Nmstate 的主机到站点配置中是必须的。
left=<ip_address_or_fqdn_of_left_peer>andright=<ip_address_or_fqdn_of_right_peer>- 定义对等点的 IP 地址或 DNS 名称。
leftid=%fromcert和rightid=%fromcert- 将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
leftcert="<server_certificate_nickname>"- 设置 NSS 数据库中使用的服务器证书的昵称。
rightsubnet: <subnet>- 定义无类别域间路由(CIDR)格式的连接到网关的子网。
将设置应用到系统:
nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
# nmstatectl apply ~/ipsec-host-to-site-cert-auth.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 建立到远程网络中主机的连接或 ping 它。
故障排除
要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:
nmcli connection export <connection_name>
# nmcli connection export <connection_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您将它们与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别偏差设置(如 ID 和密钥)。
后续步骤
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能很容易被重定向。有关详情和缓解步骤,请参阅 将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
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
# 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
对于成功的连接,命令会显示一个带有连接名称和详情的条目。如果输出为空,则隧道没有建立。
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)]
# 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 Copied! Toggle word wrap Toggle overflow - 不匹配的 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
# 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,NiCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 不匹配的 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# 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_CHOSENCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 不匹配的 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# 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_UNACCEPTABLECopy to Clipboard Copied! Toggle word wrap Toggle overflow - 不匹配的 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
# 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 proposalCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 不匹配的 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
# 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:500Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 不匹配的 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
# ipsec up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILEDCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# 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
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
# 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
输出应包含与 in 和 out 方向匹配的 leftsubnet 和 rightsubnet 参数的策略。如果没有看到流量的策略,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...
# 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...
这个命令显示私有加密密钥。不要共享此输出,因为攻击者可以使用它来解密您的 VPN 流量。
如果策略存在,但没有看到具有相同 reqid 的对应状态,这通常意味着互联网密钥交换(IKE)协商失败。两个 VPN 端点无法就一组密钥达成一致。
如需更详细的诊断,请将 -s 选项与其中一个命令一起使用。这个选项添加流量计数器,这帮助识别内核是否通过特定规则处理数据包。
6.14.7. 内核 IPsec 子系统错误 复制链接链接已复制到粘贴板!
在个别情况下,内核的 IPsec 子系统中的漏洞可能导致它丢失与互联网密钥交换(IKE)用户空间守护进程的同步。这种不同步可能会导致在协商的安全关联与内核中 IPsec 策略的实际强制间出现差异,从而可能会中断安全网络通信。要检查内核级别的错误,请显示转换(XFRM)统计信息:
cat /proc/net/xfrm_stat
# cat /proc/net/xfrm_stat
如果输出中的任何计数器(如 XfrmInError )显示一个非零值,则这表示内核子系统存在问题。在这种情况下,开一个 支持问题单,并附加上命令的输出以及相应的 IKE 日志。
6.14.8. 显示 Libreswan 日志 复制链接链接已复制到粘贴板!
Libreswan 将事件记录到日志中。要显示 ipsec 服务的日志,请输入:
journalctl -xeu ipsec
# journalctl -xeu ipsec
如果默认日志记录级别没有提供足够的详情,请通过在 /etc/ipsec.conf 文件中的 config setup 部分中添加以下设置来启用全面的调试日志记录:
plutodebug=all logfile=/var/log/pluto.log
plutodebug=all
logfile=/var/log/pluto.log
由于调试日志记录可以产生许多条目,因此将消息重定向到专用的日志文件可防止 journald 和 systemd 服务对消息进行速率限制。
第 7 章 使用 MACsec 加密同一物理网络中的第 2 层流量 复制链接链接已复制到粘贴板!
您可以使用 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 连接。
流程
在配置 MACsec 的第一个主机上:
为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):
创建一个 16 字节的十六进制 CAK:
dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个 32 字节的十六进制 CKN:
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 在您要通过 MACsec 连接连接的两个主机上:
创建 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
# 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 f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
macsec.mka-cak和macsec.mka-ckn参数中使用上一步生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。配置 MACsec 连接中的 IP 设置。
配置
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'
# 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 Copied! Toggle word wrap Toggle overflow 配置
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'
# 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 Copied! Toggle word wrap Toggle overflow
激活连接:
nmcli connection up macsec0
# nmcli connection up macsec0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证流量是否加密:
tcpdump -nn -i enp1s0
# tcpdump -nn -i enp1s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示未加密的流量:
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 MACsec 统计信息:
ip macsec show
# ip macsec showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)
ip -s macsec show
# ip -s macsec showCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3. 使用 nmstatectl 配置 MACsec 连接 复制链接链接已复制到粘贴板!
您可以通过 nmstatectl 工具,以声明的方式将以太网接口配置为使用 MACsec。例如,在 YAML 文件中,您可以描述网络所需的状态,假设其在通过以太网连接的两个主机之间有一个 MACsec 连接。nmstatectl 工具解释 YAML 文件,并在主机之间部署持久和一致的网络配置。
先决条件
- 服务器配置中存在一个物理或虚拟以太网网络接口控制器(NIC)。
-
nmstate软件包已安装。
流程
在您配置 MACsec 的第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):
创建一个 16 字节的十六进制 CAK:
dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个 32 字节的十六进制 CKN:
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在您要通过 MACsec 连接连接的两个主机上,完成以下步骤:
使用以下设置创建一个 YAML 文件,如
create-macsec-connection.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在
mka-cak和mka-ckn参数中使用上一步中生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。 可选:在同一 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
-
静态 IPv4 地址 -
将设置应用到系统:
nmstatectl apply create-macsec-connection.yml
# nmstatectl apply create-macsec-connection.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
以 YAML 格式显示当前状态:
nmstatectl show macsec0
# nmstatectl show macsec0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证流量是否加密:
tcpdump -nn -i enp0s1
# tcpdump -nn -i enp0s1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示未加密的流量:
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 MACsec 统计信息:
ip macsec show
# ip macsec showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)
ip -s macsec show
# ip -s macsec showCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 8 章 保护网络服务 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 支持许多不同类型的网络服务器。这些服务器提供的网络服务可能会暴露系统的安全性,从而可能会面临各种类型的攻击,如拒绝服务攻击(DoS)、分布式拒绝服务攻击(DDoS)、脚本漏洞攻击和缓冲区溢出攻击。
为增加系统的安全性,务必要监控您使用的活跃网络服务。例如,当网络服务在计算机上运行时,其守护进程会侦听网络端口的连接,这可能会降低系统的安全性。要限制暴露会受到攻击的网络,应关闭所有未使用的服务。
8.1. 保护 rpcbind 服务 复制链接链接已复制到粘贴板!
rpcbind 服务是用于远程过程调用(RPC)服务的动态端口分配守护进程,如网络信息服务(NIS)和网络文件共享(NFS)。由于其身份验证机制较弱,并可为其控制的服务分配大量端口,因此保护 rpcbind 服务非常重要。
您可以通过限制访问所有网络并使用服务器上的防火墙规则来定义特定例外来保护 rpcbind。
-
NFSv3服务器需要rpcbind服务。 -
NFSv4上不需要rpcbind服务。
先决条件
-
已安装
rpcbind软件包。 -
firewalld软件包已安装,且服务正在运行。
流程
添加防火墙规则,例如:
限制 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'
# 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 Copied! Toggle word wrap Toggle overflow 限制 TCP 连接,并只接受来自本地主机
111端口的包:firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 限制 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'
# 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 Copied! Toggle word wrap Toggle overflow 要使防火墙设置永久化,请在添加防火墙规则时使用
--permanent选项。
重新载入防火墙以应用新规则:
firewall-cmd --reload
# firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出防火墙规则:
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
# 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" dropCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2. 保护 rpc.mountd 服务 复制链接链接已复制到粘贴板!
rpc.mountd 守护进程实现 NFS 挂载协议的服务器端。NFS 版本 3(RFC 1813)使用 NFS 挂载协议。
您可以通过对服务器添加防火墙规则来保护 rpc.mountd 服务。您可以限制对所有网络的访问,并使用防火墙规则定义特定的异常。
前提条件
-
已安装
rpc.mountd软件包。 -
firewalld软件包已安装,且服务正在运行。
流程
在服务器中添加防火墙规则,例如:
接受来自
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'
# firewall-cmd --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接受来自本地主机的
mountd连接:firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要使防火墙设置永久化,请在添加防火墙规则时使用
--permanent选项。
重新载入防火墙以应用新规则:
firewall-cmd --reload
# firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出防火墙规则:
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
# 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" acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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/gid0 的请求映射到匿名uid/gid。这不适用于其它可能比较敏感的uid或gid,如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)
/tmp/nfs/ bob.example.com(rw)
以下示例与前一个相同,但对 bob.example.com 主机共享具有只读权限的相同的目录,由于主机名后面有一个空格字符,因此可以对 world 共享具有读写权限的目录。
/tmp/nfs/ bob.example.com (rw)
/tmp/nfs/ bob.example.com (rw)
您可以通过输入 showmount -e <hostname> 命令检查您系统上的共享目录。
另外,在导出 NFS 服务器时请考虑以下最佳实践:
- 导出主目录存在风险,因为某些应用以纯文本或弱加密格式存储密码。您可以通过检查并改进应用程序代码来降低风险。
- 有些用户未对 SSH 密钥设置密码,这再次给主目录带来风险。您可以通过强制使用密码或使用 Kerberos 来降低这些风险。
-
将 NFS 导出仅限制为所需的客户端。在 NFS 服务器上使用
showmount -e命令来检查服务器正在导出什么。不要导出不需要的任何内容。 - 不要允许不必要的用户登录到服务器,以减少攻击风险。您可以定期检查谁可以访问服务器,以及可以访问服务器的什么数据。
要导出整个文件系统,因为导出文件系统的子目录不安全。攻击者可能会访问部分导出的文件系统的未导出部分。
8.3.2. 保护 NFS 客户端的挂载选项 复制链接链接已复制到粘贴板!
您可以将以下选项传递给 mount 命令,以增加基于 NFS 的客户端的安全性:
nosuid-
使用
nosuid选项禁用set-user-identifier或set-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打开四个额外端口:rpcbind服务动态分配 NFS 端口,这可能会在创建防火墙规则时导致问题。要简化这个过程,使用/etc/nfs.conf文件指定要使用哪些端口:-
在
[mountd]部分为mountd(rpc.mountd) 设置 TCP 和 UDP 端口,格式为port=<value>。 -
在
[statd]部分为statd(rpc.statd) 设置 TCP 和 UDP 端口,格式为port=<value>。
-
在
在
/etc/nfs.conf文件中为 NFS 锁定管理器(nlockmgr)设置 TCP 和 UDP 端口:-
在
[lockd]部分为nlockmgr(rpc.statd) 设置 TCP 端口,格式为port=value。或者,也可以使用/etc/modprobe.d/lockd.conf文件中的nlm_tcpport选项。 -
在
[lockd]部分为nlockmgr(rpc.statd) 设置 UDP 端口,格式为udp-port=value。或者,您可以使用/etc/modprobe.d/lockd.conf文件中的nlm_udpport选项。
-
在
验证
列出 NFS 服务器中的活跃端口和 RPC 程序:
rpcinfo -p
$ rpcinfo -pCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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.
ftpd_banner=Hello, all activity on ftp.example.com is logged.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在单独的文件中定义信息:
创建一个
.msg文件,其中包含横幅消息,如/etc/banners/ftp.msg:######### Hello, all activity on ftp.example.com is logged. #########
######### Hello, all activity on ftp.example.com is logged. #########Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为了简化多个横幅的管理,请将所有横幅放在
/etc/banners/目录中。将横幅文件的路径添加到
/etc/vsftpd/vsftpd.conf文件中的banner_file选项中:banner_file=/etc/banners/ftp.msg
banner_file=/etc/banners/ftp.msgCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示修改后的横幅:
ftp localhost Trying ::1… Connected to localhost (::1). Hello, all activity on ftp.example.com is logged.
$ ftp localhost Trying ::1… Connected to localhost (::1). Hello, all activity on ftp.example.com is logged.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# 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/uploadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/etc/vsftpd/vsftpd.conf文件中添加以下行:anon_upload_enable=YES anonymous_enable=YES
anon_upload_enable=YES anonymous_enable=YESCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:如果您的系统启用了 SELinux 并使用强制(enforcing)模式,请启用 SELinux 布尔值属性
allow_ftpd_anon_write和allow_ftpd_full_access。
允许匿名用户在目录中读取和写入,可能会导致服务器成为盗取软件的存储库。
8.4.3. 为 FTP 保护用户帐户 复制链接链接已复制到粘贴板!
FTP 通过不安全的网络以未加密的方式传输用户名和密码以进行身份验证。您可以通过拒绝系统用户从其用户帐户访问服务器来提高 FTP 安全性。
请根据您的配置执行以下几个步骤。
流程
通过在
/etc/vsftpd/vsftpd.conf文件中添加以下行来禁用vsftpd服务器中的所有用户帐户:local_enable=NO
local_enable=NOCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
要禁用特定帐户或特定帐户组(如
root用户和带有sudo权限的组)对 FTP 的访问,您可以将用户名添加到/etc/pam.d/vsftpdPAM 配置文件。 -
通过在
/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>
# chown root <directory_name>
# chmod 755 <directory_name>
在 /etc/httpd/conf/httpd.conf 文件中,您可以配置以下选项:
FollowSymLinks- 这个指令默认为启用,并遵循目录中的符号链接。
索引- 这个指令被默认启用。禁用这个指令,以防止访问者浏览服务器上的文件。
UserDir-
这个指令默认为禁用,因为它可以确认系统中存在用户帐户。要激活用户目录浏览
/root/以外的所有用户目录,使用UserDir enabled和UserDir disabledroot 指令。要将用户添加到禁用帐户列表中,请在UserDir disabled行中添加以空格分隔的用户列表。 ServerTokens这个指令控制向客户端发送的服务器响应标头字段。您可以使用以下参数来自定义信息:
ServerTokens Full提供所有可用信息,如 Web 服务器版本号、服务器操作系统详情、已安装的 Apache 模块,例如:
Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2
Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Full-Release提供与发行版本相关的所有可用信息,例如:
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Prod / ServerTokens ProductOnly提供 Web 服务器名称,例如:
Apache
ApacheCopy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Major提供 Web 服务器主发行版本,例如:
Apache/2
Apache/2Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Minor提供 Web 服务器次发行版本,例如:
Apache/2.4
Apache/2.4Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens Min/ServerTokens Minimal提供 Web 服务器最小发行版本,例如:
Apache/2.4.37
Apache/2.4.37Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServerTokens OS提供 Web 服务器发行版本和操作系统,例如:
Apache/2.4.37 (Red Hat Enterprise Linux)
Apache/2.4.37 (Red Hat Enterprise Linux)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
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
echo '# All proxy modules disabled' > /etc/httpd/conf.modules.d/00-proxy.conf
8.5.2. 保护 Nginx 服务器配置 复制链接链接已复制到粘贴板!
Nginx 是一个高性能 HTTP 和代理服务器。您可以使用以下配置选项强化 Nginx 配置。
流程
要禁用版本字符串,修改
server_tokens配置选项:server_tokens off;
server_tokens off;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个选项将停止显示其他详细信息,如服务器版本号。此配置仅显示 Nginx 提供的所有请求中的服务器名称,例如:
curl -sI http://localhost | grep Server Server: nginx
$ curl -sI http://localhost | grep Server Server: nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 添加额外的安全标头,以缓解特定
/etc/nginx/conf 文件中的某些已知 Web 应用程序漏洞:例如,
X-Frame-Options标头选项拒绝您的域之外的任何页面来帧由 Nginx 提供的任何内容,缓解了攻击:add_header X-Frame-Options "SAMEORIGIN";
add_header X-Frame-Options "SAMEORIGIN";Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
x-content-type标头在某些较旧的浏览器中可以防止 MIME-type sniffing:add_header X-Content-Type-Options nosniff;
add_header X-Content-Type-Options nosniff;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
X-XSS-Protection标头启用跨站点脚本过滤(XSS)过滤,这可防止浏览器渲染由 Nginx 中包含的潜在的恶意内容:add_header X-XSS-Protection "1; mode=block";
add_header X-XSS-Protection "1; mode=block";Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您可以限制公开的服务,并限制它们对访问者执行的操作,例如:
limit_except GET { allow 192.168.1.0/32; deny all; }limit_except GET { allow 192.168.1.0/32; deny all; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该片段将限制对除
GET和HEAD外的所有方法的访问。您可以禁用 HTTP 方法,例如:
# Allow GET, PUT, POST; return "405 Method Not Allowed" for all others. if ( $request_method !~ ^(GET|PUT|POST)$ ) { return 405; }# Allow GET, PUT, POST; return "405 Method Not Allowed" for all others. if ( $request_method !~ ^(GET|PUT|POST)$ ) { return 405; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 您可以配置 SSL 来保护 Nginx web 服务器提供的数据,请考虑仅通过 HTTPS 提供它。另外,您可以使用 Mozilla SSL 配置生成器生成在 Nginx 服务器中启用 SSL 的安全配置配置文件。生成的配置确保了,所有已知存在安全漏洞的协议(例如, SSLv2 和 SSLv3),加密程序和哈希算法(例如 3DES 和 MD5) 都已禁用。您还可以使用 SSL 服务器测试来验证您的配置是否满足现代安全要求。
8.6. 通过限制对经过身份验证的用户的访问来保护 PostgreSQL 复制链接链接已复制到粘贴板!
PostgreSQL 是一个对象相关数据库管理系统(DBMS)。在 Red Hat Enterprise Linux 中,PostgreSQL 由 postgresql-server 软件包提供。
您可以通过配置客户端身份验证来降低攻击的风险。pg_hba.conf 配置文件存储在数据库集群的数据目录中,控制客户端身份验证。按照以下步骤为基于主机的验证配置 PostgreSQL。
流程
安装 PostgreSQL:
dnf install postgresql-server
# dnf install postgresql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下选项之一初始化数据库存储区域:
使用
initdb工具:initdb -D /home/postgresql/db1/
$ initdb -D /home/postgresql/db1/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 带有
-D选项的initdb命令会创建您指定的目录(如果尚未存在),例如/home/postgresql/db1/。然后,此目录包含数据库中存储的所有数据以及客户端身份验证配置文件。使用
postgresql-setup脚本:postgresql-setup --initdb
$ postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,该脚本使用
/var/lib/pgsql/data/目录。此脚本可以帮助具有基本数据库集群管理的系统管理员。
要允许任何经过身份验证的用户使用其用户名访问任何数据库,请在
pg_hba.conf文件中修改以下行:local all all trust
local all all trustCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当使用创建数据库用户和没有本地用户的层次应用程序时,这可能会造成问题。如果您不想显式控制系统中所有用户名,请从
pg_hba.conf文件中删除local行条目。重启数据库以应用更改:
systemctl restart postgresql
# systemctl restart postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上一命令更新数据库,同时还验证配置文件的语法。
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
# firewall-cmd --remove-port=11211/udp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您在与应用程序相同的机器上使用单一 Memcached 服务器,请设置
memcached来仅侦听 localhost 流量。修改/etc/sysconfig/memcached文件中的OPTIONS值:OPTIONS="-l 127.0.0.1,::1"
OPTIONS="-l 127.0.0.1,::1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用简单验证和安全层(SASL)身份验证:
修改或添加
/etc/sasl2/memcached.conf文件:sasldb_path: /path.to/memcached.sasldb
sasldb_path: /path.to/memcached.sasldbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 SASL 数据库中添加帐户:
saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
# saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
memcached用户和组可以访问数据库:chown memcached:memcached /path.to/memcached.sasldb
# chown memcached:memcached /path.to/memcached.sasldbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
/etc/sysconfig/memcached文件中的OPTIONS参数中添加-S值在 Memcached 中启用 SASL 支持:OPTIONS="-S"
OPTIONS="-S"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启 Memcached 服务器以应用更改:
systemctl restart memcached
# systemctl restart memcachedCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 将 SASL 数据库中创建的用户名和密码添加到应用程序的 Memcached 客户端配置中。
使用 TLS 加密 Memcached 客户端和服务器间的通信:
通过在
/etc/sysconfig/memcached文件中的OPTIONS参数中添加-Z值来启用 Memcached 客户端和服务器间的加密通信:OPTIONS="-Z"
OPTIONS="-Z"Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
-o ssl_chain_cert选项,以 PEM 格式添加证书链文件路径。 -
使用
-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软件包已安装在系统上
流程
设置 Dovecot:
在
/etc/dovecot/conf.d/10-master.conf文件中包括以下行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于
/var/spool/postfix/目录中的邮件队列,以及在postfix用户和组下运行的应用程序。可选:建立 Dovecot 以通过 TCP 侦听 Postfix 验证请求:
service auth { inet_listener { port = <port_number> } }service auth { inet_listener { port = <port_number> } }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过编辑
/etc/dovecot/conf.d/10-auth.conf文件中的auth_mechanisms参数来指定电子邮件客户端用来使用 Dovecot 进行身份验证的方法:auth_mechanisms = plain login
auth_mechanisms = plain loginCopy to Clipboard Copied! Toggle word wrap Toggle overflow auth_mechanisms参数支持不同的纯文本和非纯文本身份验证方法。
通过修改
/etc/postfix/main.cf文件来建立 Postfix:在 Postfix SMTP 服务器上启用 SMTP 身份验证:
smtpd_sasl_auth_enable = yes
smtpd_sasl_auth_enable = yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为 SMTP 身份验证启用 Dovecot SASL 实现:
smtpd_sasl_type = dovecot
smtpd_sasl_type = dovecotCopy to Clipboard Copied! Toggle word wrap Toggle overflow 提供相对于 Postfix 队列目录的身份验证路径。请注意,使用相对路径可确保无论 Postfix 服务器是否以
chroot运行,配置都可以正常工作:smtpd_sasl_path = private/auth
smtpd_sasl_path = private/authCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此步骤使用 UNIX-域套接字在 Postfix 和 Dovecot 之间进行通信。
如果您使用 TCP 套接字进行通信,要将 Postfix 配置为在不同机器上查找 Dovecot,请使用类似如下的配置值:
smtpd_sasl_path = inet: <IP_address> : <port_number>
smtpd_sasl_path = inet: <IP_address> : <port_number>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,将
<IP_address>替换为 Dovecot 机器的 IP 地址,将<port_number>替换为在 Dovecot 的/etc/dovecot/conf.d/10-master.conf文件中指定的端口号。指定 Postfix SMTP 服务器为客户端提供的 SASL 机制。请注意,您可以为加密和未加密的会话指定不同的机制。
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymousCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以上指令指定在未加密的会话期间,不允许匿名身份验证,且不会允许传输未加密的用户名或密码的机制。对于使用 TLS 的加密会话,只允许非匿名身份验证机制。