安全网络
大约 104 分钟
安全网络
来源:官方文档 原始多页入口:安全网络 内容规模:约 131,279 字符,113 个章节标题,436 个命令/代码块,37 条提示框
阅读提要
- 副标题:配置安全网络和网络通信
- 摘要:了解工具和技术以提高网络安全性,并降低数据泄露和入侵的风险。
- 主要章节:配置安全网络和网络通信;对红帽文档提供反馈;第 1 章 使用 OpenSSH 的两个系统间使用安全通讯;第 2 章 创建并管理 TLS 密钥和证书;第 3 章 使用共享的系统证书;第 4 章 计划并使用 TLS;第 5 章 使用加密 DNS (eDNS)保护系统 DNS 流量.;第 6 章 设置 IPsec VPN;第 7 章 使用 MACsec 加密同一物理网络中的第 2 层流量;第 8 章 保护网络服务
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
配置安全网络和网络通信
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 使用 OpenSSH 的两个系统间使用安全通讯
- 要点:使用 OpenSSH 在两个系统之间创建安全通信。OpenSSH 加密连接。它可以防止远程登录会话被窃取和入侵。
1.1. SSH 和 OpenSSH
- 要点:SSH (Secure Shell)是远程机器登录和命令执行的程序。SSH 协议通过不安全的网络提供两个不可信主机之间的加密通信。您还可以通过安全频道转发 X11 连接和任意 TCP/IP 端口。
- 要点:当您将其用于远程 shell 登录或文件复制时,SSH 协议会降低安全威胁。它可防止两个系统间的通信被截获。它还可防止模拟特定主机。
- 列表:ssh 是一个远程登录程序(SSH 客户端).
- 列表:sshd 是一个 OpenSSH SSH 守护进程。
- 列表:scp 是一个安全的远程文件复制程序。
- 列表:sftp 是一个安全的文件传输程序。
- 列表:ssh-agent 是用于缓存私钥的身份验证代理。
- 列表:ssh-add 为 ssh-agent添加私钥身份。
- 注意:注意 在 RHEL 9 及更新的版本中,SFTP 默认替换了 SCP。SCP 具有安全问题,如 CVE-2020-15778。 如果 SFTP 在您的场景中不可用或不兼容,您可以强制使用原始 SCP/RCP 协议。使用 scp 命令和 -O 选项。
1.2. 生成 SSH 密钥对
- 要点:在本地系统中生成 SSH 密钥对,并将公钥复制到 OpenSSH 服务器以启用无密码登录。每个要创建密钥的用户都必须运行此流程。
- 要点:要在重新安装系统后保留生成的密钥对,请在创建新密钥前备份 ~/.ssh/ 目录。重新安装后,将其复制到主目录中。您可以为系统中的所有用户(包括 root 用户)进行此操作。
- 列表:您已经以希望使用密钥连接到 OpenSSH 服务器的用户的身份登录了。
- 列表:OpenSSH 服务器被配置为允许基于密钥的身份验证。
- 列表:生成一个 ECDSA 密钥对: $ ssh-keygen -t ecdsa Generating public/private ecdsa key pair. Enter file in which to save the key (/home/<username>/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): <password> Enter same passphrase again: <password> Your identification has been saved in /home/<username>/.ssh/id_ecdsa. Your…
- 列表:使用 ssh-keygen 命令(不带任何参数)的 RSA 密钥对
- 列表:输入 ssh-keygen -t ed25519 命令进行 Ed25519 密钥对 请注意,Ed25519 算法不符合 FIPS-140,OpenSSH 在 FIPS 模式下无法使用 Ed25519 密钥。
- 列表:将公钥复制到远程机器上: $ ssh-copy-id <username>@<ssh-server-example.com> /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed <username>@<ssh-server-example.com>'s password: … Number of key(s) added: 1 Now try logging into the machine, with: "ssh '<username>@<ssh-ser…
- 命令/配置摘录:
$ ssh-keygen -t ecdsa Generating public/private ecdsa key pair. Enter file in which to save the key (/home/<username>/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): <password> Enter same passphrase again: <password> Your identification has been saved in /home/<username>/.ssh/id_ecdsa. Your public key has been saved in /home/<username>/.ssh/id_ecdsa.pub. The key fingerprint is: SHA256:Q/x+qms4j7PCQ0qFd09iZEFHA+SqwBKRNaU72oZfaCI <username>@<localhost.example.com> The key's randomart image is: +---[ECDSA 256]---+ |.oo..o=++ | |.. o .oo . | |. .. o. o | |....o.+... | |o.oo.o +S . | |.=.+. .o | |E.*+. . . . | |.=..+ +.. o | | . oo*+o…
$ ssh-copy-id <username>@<ssh-server-example.com> /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed <username>@<ssh-server-example.com>'s password: … Number of key(s) added: 1 Now try logging into the machine, with: "ssh '<username>@<ssh-server-example.com>'" and check to make sure that only the key(s) you wanted were added.1.3. 将基于密钥的身份验证设置为 OpenSSH 服务器的唯一方法
- 要点:要提高系统安全性,通过在 OpenSSH 服务器上禁用密码身份验证来强制进行基于密钥的身份验证。
- 要点:先决条件
- 列表:已安装 openssh-server 软件包。
- 列表:sshd 守护进程正在服务器中运行。
- 列表:您已使用密钥连接到 OpenSSH 服务器。 详情请参阅 生成 SSH 密钥对 部分。
- 列表:在文本编辑器中打开 /etc/ssh/sshd_config 配置,例如: # vi /etc/ssh/sshd_config
- 列表:将 PasswordAuthentication 选项改为 no: PasswordAuthentication no
- 列表:在不是新默认安装的系统上,检查是否设置了 PubkeyAuthentication 参数,或是否设置为 yes。
- 命令/配置摘录:
# vi /etc/ssh/sshd_config
PasswordAuthentication no- 注意:警告 如果您在没有确保基于密钥的验证正常工作的情况下禁用密码身份验证,您可以将自己锁定在服务器中。在应用此配置前全面测试您的 SSH 密钥身份验证,并在测试时保持当前会话打开状态,以便在需要时恢复更改。
1.4. 通过保存在智能卡上的 SSH 密钥进行身份验证
- 要点:使用保存在智能卡中的 SSH 密钥来为您的凭证添加物理保护层。此方法增强了安全性,防止未经授权的访问。
- 要点:您可以在智能卡上创建并存储 ECDSA 和 RSA 密钥,并通过 OpenSSH 客户端上的智能卡进行身份验证。智能卡验证替换了默认密码验证。
- 列表:在客户端中安装了 opensc 软件包,pcscd 服务正在运行。
- 列表:列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到 key.pub 文件: $ ssh-keygen -D pkcs11: > keys.pub
- 列表:将公钥传送到远程服务器。使用ssh-copy-id 命令和上一步中创建的 keys.pub 文件: $ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
- 列表:使用 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] $ 因为 OpenSSH 使用 p11-kit-proxy 包装器,且 OpenSC PKCS #11 模块已注册到 p11-kit 工具,因此您可以简化上一个命令: $ ssh -i "pkcs11:id…
- 列表:可选:您可以在 ~/.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] $ ssh 客户端工具现在自动使用此 URI 和智能卡中的密钥。
- 命令/配置摘录:
$ ssh-keygen -D pkcs11: > keys.pub
$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>1.5. 使 OpenSSH 更安全
- 要点:通过修改 OpenSSH 配置来强化您的系统安全性,如实施更强大的密钥并限制用户访问。这有助于保护您的服务器免受各种攻击。
- 要点:要使 SSH 生效,防止使用不安全连接协议,并使用 OpenSSH 套件替换它们。否则,用户的密码可能仅由一个会话的 SSH 保护,稍后仅在通过 Telnet 登录时捕获。另外,禁用用于身份验证的密码并只允许密钥对减少攻击面。
- 注意:警告 以 root 用户身份登录并不是一个安全的做法,因为管理员无法审核运行哪个特权命令。要使用管理命令,请登录并使用 sudo。
1.5.1. 创建并强制实施更强大的 SSH 密钥类型
- 要点:仅生成 ECDSA 或 Ed25519 密钥,以比较旧的算法使用其安全性和性能优势。您还可以将 OpenSSH 服务器配置为禁用自动生成的 RSA 主机密钥,并强制使用更强大的密钥类型。
- 要点:您可以使用 -t 选项指示 ssh-keygen 命令生成 Elliptic Curve Digital Signature Algorithm (ECDSA)或 Edwards-Curve 25519 (Ed25519)密钥。同等对称密钥强度下,ECDSA 提供了比 RSA 更好的性能。它还会生成较短的密钥。Ed25519 公钥算法是 一种变形的 Edwards 曲线的实现,其比 RSA、DSA 和 ECDSA 更安全,也更快。
- 列表:openssh-server 软件包已安装在您的系统上。
- 列表:要在 RHEL 中配置主机密钥创建,请使用 sshd-keygen@.service 实例化服务。例如,禁用自动创建 RSA 密钥类型: # systemctl mask sshd-keygen@rsa.service 注意 在启用了 cloud-init 方法的镜像中,ssh-keygen 单元被自动禁用。这是因为 ssh-keygen template 服务可能会干扰 cloud-init 工具,导致主机密钥生成出现问题。要防止这些问题,如果 cloud-init 正在运行,则 etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init…
- 列表:因为 OpenSSH 会自动创建 RSA、ECDSA 和 Ed25519 服务器主机密钥(如果缺少它们),因此请删除不太安全加密的密钥: # rm -f /etc/ssh/ssh_host_rsa_key
- 列表:要只允许 SSH 连接的特定密钥类型,请取消注释 /etc/ssh/sshd_config 中的相关行。例如,要只允许 Ed25519 主机密钥,则相应的行必须如下所示: # HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
- 列表:重启 sshd 服务: # systemctl restart sshd
- 列表:验证只有配置的主机密钥类型是否存在: # ls -l /etc/ssh/ssh_host_*_key 输出显示您配置的密钥类型。如果您只强制使用 Ed25519,则只会显示 ssh_host_ed25519_key 文件。
- 命令/配置摘录:
# systemctl mask sshd-keygen@rsa.service
# rm -f /etc/ssh/ssh_host_rsa_key- 注意:重要 Ed25519 算法与 FIPS-140 不兼容,OpenSSH 在 FIPS 模式下无法与 Ed25519 密钥一起工作。
- 注意:注意 在启用了 cloud-init 方法的镜像中,ssh-keygen 单元被自动禁用。这是因为 ssh-keygen template 服务可能会干扰 cloud-init 工具,导致主机密钥生成出现问题。要防止这些问题,如果 cloud-init 正在运行,则 etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf 置入配置文件会禁用 ssh-keygen 单元。
1.5.2. 在 OpenSSH 服务器中自定义允许的加密
- 要点:您可以使用 /etc/ssh/sshd_config.d/ 目录或应用自定义系统范围的加密策略来指定 OpenSSH 服务器的加密配置。这可让您根据您的场景强化或松散 SSH 连接。
- 要点:要覆盖 OpenSSH 服务器的系统范围的加密策略,请在位于 /etc/ssh/sshd_config.d/ 的置入配置文件中指定加密策略。由于第一个匹配项是 wins,因此将文件命名为小于 50 的两位前缀,并且带有 .conf 后缀,例如 49-crypto-policy-override.conf。这样,它会以字典顺序排列在 50-redhat.conf 文件前,并覆盖默认配置。
- 列表:已安装 openssh-server 软件包。
- 列表:sshd 守护进程正在服务器中运行。
- 列表:创建一个新的配置文件,其名称为字典前面的 50-redhat.conf,例如: # touch /etc/ssh/sshd_config.d/49-crypto-policy-override.conf
- 列表:在文本编辑器中打开该文件,并指定您想要允许的密码和消息验证代码(MAC),例如: Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512,hmac-sha2-256
- 列表:保存更改,并重新载入 sshd 服务: # systemctl reload sshd
- 列表:在 sshd -T 命令的输出中检查您的 OpenSSH 服务器上允许的密码和 MAC: # sshd -T | grep -iE '(ciphers|macs)'
- 命令/配置摘录:
# touch /etc/ssh/sshd_config.d/49-crypto-policy-override.conf
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512,hmac-sha2-2561.5.3. 为 SSH 设置非默认端口
- 要点:默认情况下,sshd 守护进程侦听 TCP 端口 22。更改端口可降低系统暴露给基于自动网络扫描的攻击,从而通过隐蔽性提高了安全性。
- 要点:先决条件
- 列表:以 # 命令提示符开头的命令需要 sudo 提供的管理特权或 root 用户访问权限。有关如何配置 sudo 访问权限的详情,请参考 启用非特权用户,以运行某些命令。
- 列表:policycoreutils-python-utils 软件包安装在您的系统中。
- 列表:在您选择的文本编辑器中打开 /etc/ssh/sshd_config 配置文件。
- 列表:删除 Port 指令前面的 # 字符,并指定与 22 不同的端口号,例如: Port <49286>
- 列表:更新默认 SELinux 策略以允许使用非默认端口: # semanage port -a -t ssh_port_t -p tcp <49286>
- 列表:更新 firewalld 配置: # firewall-cmd --add-port <49286>/tcp # firewall-cmd --remove-port=22/tcp # firewall-cmd --runtime-to-permanent
- 命令/配置摘录:
Port <49286>
# semanage port -a -t ssh_port_t -p tcp <49286>- 注意:注意 更改 SSH 端口仅提供有限的安全优势。无论端口号如何,攻击者执行完整的端口扫描可以发现该服务。实际的安全改进包括禁用密码身份验证、使用基于密钥的身份验证并实施正确的访问控制。
- 注意:重要 更改 SSH 端口后,更新客户端配置以使用新端口。这包括: 用户 SSH 配置文件(~/.ssh/config) 连接到服务器的自动化工具和脚本 监控系统和备份工具 负载均衡器和代理配置 如果没有这些更新,到服务器的连接会失败。
1.5.4. 仅针对特定用户、组或 IP 范围进行 SSH 访问
- 要点:通过使用 /etc/ssh/sshd_config 配置文件中的 AllowUsers 和 AllowGroups 指令,您只能允许某些用户、域或组连接到您的 OpenSSH 服务器。
- 要点:您可以组合 AllowUsers 和 Allow Groups 来更准确地限制访问,例如:
- 列表:连接的源 IP 在 192.168.1.0/24 或 10.0.0.0/24 子网中。
- 列表:源 IP 不是 192.168.1.2。
- 列表:用户是 example-group 组的成员。
- 命令/配置摘录:
AllowUsers *@192.168.1.* *@10.0.0.* !*@192.168.1.2 AllowGroups example-group- 注意:警告 错误配置 AllowUsers 或 AllowGroups 可将您锁定在服务器中。在应用这些指令前,请验证您的用户帐户和源 IP 是否与限制。打开新的 SSH 会话并保持当前会话处于活跃状态时,可以测试配置,以便在新连接失败时恢复更改。
1.5.5. x Security extension
- 要点:如果您不需要在 OpenSSH 服务器配置中禁用 X11 转发,以减少系统的攻击面。
- 要点:Red Hat Enterprise Linux 客户端中的 X 服务器不提供 X 安全性扩展。如果没有此扩展,当连接到带有 X11 转发的不可信 SSH 服务器时,客户端无法请求额外的安全层。
1.5.6. 其他资源
- 列表:将基于密钥的身份验证设置为 OpenSSH 服务器上的唯一方法
- 列表:使用系统范围的加密策略
- 列表:如何只禁用 ssh 服务的特定算法和密码(红帽知识库)
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 端口在跳板服务器和远程服务器之间有所不同时,请使用此格式,例如: $ ssh -J <example.user.1>@<jump-1.example.com>:<75>,<example.user.2>@<jump-2.example.com>:<75>,<example.user.3…
- 列表:对于通过跳过服务器的常规连接,请将配置存储在 SSH 配置文件中: 通过编辑本地系统中的 ~/.ssh/config 文件来定义跳板主机,例如: Host <jump-server-1> HostName <jump-1.example.com> Host 参数定义您可以在 ssh 命令中使用的主机的名称或别名。该值可以匹配实际主机名,但也可以是任意字符串。 HostName 参数设置跳过主机的实际主机名或 IP 地址。 使用 ProxyJump 指令将远程服务器跳板配置添加到本地系统上的 ~/.ssh/config 文件中,例如: Host <remote-server-1> HostName <target-server-…
- 列表:通过编辑本地系统中的 ~/.ssh/config 文件来定义跳板主机,例如: Host <jump-server-1> HostName <jump-1.example.com> Host 参数定义您可以在 ssh 命令中使用的主机的名称或别名。该值可以匹配实际主机名,但也可以是任意字符串。 HostName 参数设置跳过主机的实际主机名或 IP 地址。
- 列表:Host 参数定义您可以在 ssh 命令中使用的主机的名称或别名。该值可以匹配实际主机名,但也可以是任意字符串。
- 命令/配置摘录:
$ ssh -J <jump-1.example.com>,<jump-2.example.com>,<jump-3.example.com> <target-server-1.example.com>
$ 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>1.7. 使用 RHEL 系统角色配置 OpenSSH 服务器和客户端
- 要点:您可以使用 sshd RHEL 系统角色配置 OpenSSH 服务器,使用 ssh RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。
- 要点:对于需要安全远程交互的任何系统,此类配置是必需的,例如:
- 列表:远程系统管理:使用 SSH 客户端安全地从另一台计算机连接到您的机器。
- 列表:安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP),在本地机器和远程系统间安全地传输文件。
- 列表:自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
- 列表:隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
- 列表:基于密钥的身份验证:对基于密码登录的更加安全的替代。
- 列表:基于证书的验证:集中信任管理和更好的可扩展性。
1.7.1. sshd RHEL 系统角色如何将 playbook 中的设置映射到配置文件
- 要点:在 sshd RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config 文件。
- 要点:在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yes 和 no。您可以使用列表来定义多行配置项。例如:
- 命令/配置摘录:
sshd_ListenAddress: - 0.0.0.0 - '::'
ListenAddress 0.0.0.0 ListenAddress ::1.7.2. 使用 sshd RHEL 系统角色配置 OpenSSH 服务器
- 要点:您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器,以进行安全远程访问。
- 要点:该角色通过提供名称来确保远程用户的安全通信环境:
- 列表:管理来自远程客户端的传入 SSH 连接
- 列表:凭证验证
- 列表:保护数据传输和命令执行
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 命令/配置摘录:
--- - name: SSH server configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to prevent root and password login except from particular subnet ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config: PermitRootLogin: no PasswordAuthentication: no Match: - Condition: "Address 192.0.2.0/24" PermitRootLogin: yes PasswordAuthentication: yes
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:注意 您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色一起使用,如 RHEL 系统角色中的身份管理。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9 及更新版本)。
1.7.3. 对非独占配置使用 sshd RHEL 系统角色
- 要点:默认情况下,应用 sshd RHEL 系统角色会覆盖整个配置。如果您之前使用不同的 playbook 调整配置,这可能会出现问题。您可以使用非独占配置将更改仅应用到所选配置选项。
- 要点:您可以应用非独占配置:
- 列表:在 RHEL 8 及更早版本中使用配置片段。
- 列表:在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为 /etc/ssh/sshd_config.d/00-ansible_system_role.conf。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : 对于运行 RHEL 8 或更早版本的受管节点: --- - name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure SSHD to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_namespace: <my_appl…
- 命令/配置摘录:
--- - name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure SSHD to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_namespace: <my_application> sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR
- name: Non-exclusive sshd configuration hosts: managed-node-01.example.com tasks: - name: Configure sshd to accept environment variables ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_config_file: /etc/ssh/sshd_config.d/<42-my_application>.conf sshd_config: # Environment variables to accept AcceptEnv: LANG LS_COLORS EDITOR1.7.4. 使用 sshd RHEL 系统角色覆盖 SSH 服务器上的系统范围的加密策略
- 要点:当默认加密设置不符合某些安全或兼容性需求时,您可以使用 sshd RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围的加密策略。
- 要点:在以下显著情况下覆盖系统范围的加密策略:
- 列表:与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
- 列表:强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
- 列表:性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
- 列表:针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 命令/配置摘录:
- name: Deploy SSH configuration for OpenSSH server hosts: managed-node-01.example.com tasks: - name: Overriding the system-wide cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.sshd vars: sshd_sysconfig: true sshd_sysconfig_override_crypto_policy: true sshd_KexAlgorithms: ecdh-sha2-nistp521 sshd_Ciphers: aes256-ctr sshd_MACs: hmac-sha2-512-etm@openssh.com sshd_HostKeyAlgorithms: rsa-sha2-512,rsa-sha2-256
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:警告 从 sshd RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA-1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略。
- 注意:注意 在 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 来启用覆盖。
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 LocalForward 403 localhost:4003- 注意:注意 配置选项区分大小写。
1.7.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端
- 要点:您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。
- 要点:OpenSSH 客户端在本地用户和远程 OpenSSH 服务器之间建立安全连接。它们确保:
- 列表:安全连接启动
- 列表:凭证置备
- 列表:与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
- 列表:能够安全地向和从 OpenSSH 服务器发送文件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 命令/配置摘录:
--- - name: SSH client configuration hosts: managed-node-01.example.com tasks: - name: Configure ssh clients ansible.builtin.include_role: name: redhat.rhel_system_roles.ssh vars: ssh_user: root ssh: Compression: true GSSAPIAuthentication: no ControlMaster: auto ControlPath: ~/.ssh/.cm%C Host: - Condition: example Hostname: server.example.com User: user1 ssh_ForwardX11: no
$ ansible-playbook --syntax-check ~/playbook.yml- 注意:注意 您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色一起使用,例如 RHEL 系统角色中的身份管理。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。
1.8. 其他资源
- 列表:为使用非标准配置的应用程序和服务配置 SELinux
- 列表:使用 firewalld 控制网络流量
第 2 章 创建并管理 TLS 密钥和证书
- 要点:使用 OpenSSL 和 GnuTLS 等工具包创建和管理 TLS 私钥和证书。正确配置这些资产对于安全通信至关重要。
2.1. TLS 证书
- 要点:TLS (传输层安全)是一个协议,它在客户端/服务器应用程序之间建立加密数据交换。TLS 使用公钥和私钥对系统来加密客户端和服务器之间的通信。TLS 是到 SSL (安全套接字层)的后继协议。
- 要点:TLS 使用 X.509 证书将主机名或机构等身份绑定到使用数字签名的公共密钥。X.509 是一个定义公钥证书格式的标准。
- 列表:RFC 5280:互联网 X.509 公钥基础架构证书和证书撤销列表(CRL)配置文件
2.2. OpenSSL 中的 post-quantum 加密算法
- 要点:您可以使用 OpenSSL TLS 工具包使用 post-quantum 算法生成密钥和证书。这有助于增强新兴威胁的安全性,同时保持与传统算法的兼容性。
- 要点:从 RHEL 10.1 开始,您可以使用 OpenSSL 生成密钥、签名消息、验证签名和使用 ML-DSA 后子算法创建 X.509 证书。
- 列表:系统范围的加密策略
- 列表:Red Hat Enterprise Linux 10 中的 post-quantum 加密(红帽博客)
- 列表:RHEL 10 post-quantum 加密的互操作性(红帽知识库)
- 列表:红帽的 post-quantum 加密的路径(红帽博客)
- 列表:红帽如何将 post-quantum 加密集成到我们的产品中(红帽博客)
- 命令/配置摘录:
$ openssl req \ -x509 \ -newkey mldsa65 \ -keyout <localhost-mldsa.key> \ -subj /CN=<localhost> \ -addext subjectAltName=DNS:<localhost> \ -days <30> \ -nodes \ -out <localhost-mldsa.crt>
$ openssl s_server \ -cert <localhost-mldsa.crt> -key <localhost-mldsa.key> \ -dcert <localhost-rsa.crt> -dkey <localhost-rsa.key> >/dev/null & $ openssl s_client \ -connect <localhost:4433> \ -CAfile <localhost-mldsa.crt> </dev/null \ |& grep -E '(Peer signature type|Negotiated TLS1.3 group)' Peer signature type: mldsa65 Negotiated TLS1.3 group: X25519MLKEM7682.3. 使用 OpenSSL 创建一个私有 CA
- 要点:当您的情况需要在您的内部网络内验证实体时,私有证书颁发机构(CA)非常有用。
- 要点:例如,当您根据控制下的 CA 签名的证书创建 VPN 网关时,请使用私有 CA。当您不想支付商业 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 req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<example_CA>" -out <ca.crt> 生成的 ca.crt 文件是一个自签名 CA 证书,可用来为其他证书签名 10 年。对于私有 CA,您可以使用通用名称(CN)的任何字符串替换 <example_CA>。
- 列表:对 CA 的私钥设置安全权限,例如: # chown <root>:<root> <ca.key> # chmod 600 <ca.key>
- 列表:要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以 root 用户身份将其添加到客户端的系统范围信任存储中: # trust anchor <ca.crt> 如需更多信息,请参阅 使用共享的系统证书 一章。
- 列表:创建证书签名请求(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 Priva…
- 命令/配置摘录:
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <ca.key>
$ openssl req -key <ca.key> -new -x509 -days 3650 -addext keyUsage=critical,keyCertSign,cRLSign -subj "/CN=<example_CA>" -out <ca.crt>2.4. 使用 OpenSSL 为 TLS 服务器证书创建私钥和 CSR
- 要点:您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,请首先为您的服务器创建私钥和证书签名请求(CSR)。
- 要点:流程
- 列表:在服务器系统上生成私钥,例如: $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server_private.key>
- 列表:可选:使用文本编辑器准备一个简化创建 CSR 的配置文件,例如: $ vi <example_server.cnf> [server-cert] keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] C = <US> O = <Example Organization> CN = <server.example.com> [alt_name] …
- 列表:使用之前创建的私钥创建 CSR: $ openssl req -key <server_private.key> -config <example_server.cnf> -new -out <server_cert.csr> 如果省略了 -config 选项,req 工具会提示您额外的信息,例如: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Na…
- 列表:将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 OpenSSL 为 CSR 发布证书。
- 列表:从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如: $ openssl x509 -text -noout -in <server_cert.crt> Certificate: … Issuer: CN = Example CA Validity Not Before: Feb 2 20:27:29 2023 GMT Not After : Feb 2 20:27:29 2024 GMT Subject: C = US, O = Example Organization, CN = server.example.com Subject Public Key Info: Public Key …
- 命令/配置摘录:
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <server_private.key>
$ vi <example_server.cnf> [server-cert] keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] C = <US> O = <Example Organization> CN = <server.example.com> [alt_name] DNS.1 = <example.com> DNS.2 = <server.example.com> IP.1 = <192.168.0.1> IP.2 = <::1> IP.3 = <127.0.0.1>2.5. 使用 OpenSSL 为 TLS 客户端证书创建私钥和 CSR
- 要点:您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,请首先为您的客户端创建私钥和证书签名请求(CSR)。
- 要点:流程
- 列表:在客户端系统上生成私钥,例如: $ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
- 列表:可选:使用文本编辑器准备一个简化创建 CSR 的配置文件,例如: $ vi <example_client.cnf> [client-cert] keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] CN = <client.example.com> [clnt_alt_name] email= <client@example.com> extendedKeyUsage …
- 列表:使用之前创建的私钥创建 CSR: $ openssl req -key <client-private.key> -config <example_client.cnf> -new -out <client-cert.csr> 如果省略了 -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) []: <cli…
- 列表:将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 OpenSSL 为 CSR 发布证书 部分。
- 列表:检查证书的人类可读部分是否与您的要求匹配,例如: $ openssl x509 -text -noout -in <client-cert.crt> Certificate: … X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Alternative Name: email:client@example.com …
- 命令/配置摘录:
$ openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out <client-private.key>
$ vi <example_client.cnf> [client-cert] keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth subjectAltName = @alt_name [req] distinguished_name = dn prompt = no [dn] CN = <client.example.com> [clnt_alt_name] email= <client@example.com>2.6. 使用私有 CA 使用 OpenSSL 为 CSR 发布证书
- 要点:要建立 TLS 加密的数据交换频道,系统必须从证书颁发机构(CA)获取有效的证书。如果您有私有 CA,您可以通过签名证书签名请求(CSR)来创建请求的证书。
- 要点:前提条件
- 列表:您已配置了私有 CA。如需更多信息,请参阅 使用 OpenSSL 创建私有 CA 部分。
- 列表:您有一个包含 CSR 的文件。您可以在 第 2.4 节 “使用 OpenSSL 为 TLS 服务器证书创建私钥和 CSR” 部分中找到创建 CSR 的示例。
- 列表:可选:使用文本编辑器准备一个 OpenSSL 配置文件来为证书添加扩展,例如: $ vim <openssl.cnf> [server-cert] extendedKeyUsage = serverAuth [client-cert] extendedKeyUsage = clientAuth 上例仅演示了原则。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 要提高安全性,请在从 CSR 创建另一个证书前删除序列号文件。这样,您确保…
- 列表:验证证书内容和字段: $ openssl x509 -in <server_cert.crt> -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: ... Issuer: C = US, O = Example CA, CN = Example CA Validity Not Before: May 21 10:30:00 2026 GMT Not After : May 21 10:30:00 2027 GMT Subject: C = US, O = Example Organization, CN = server.example.c…
- 列表:验证证书是否由正确的 CA 签名: $ openssl verify -CAfile <ca.crt> <server_cert.crt> <server_cert.crt>: OK
- 命令/配置摘录:
$ vim <openssl.cnf> [server-cert] extendedKeyUsage = serverAuth [client-cert] extendedKeyUsage = clientAuth
$ 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 Key2.7. 使用 GnuTLS 创建私有 CA
- 要点:当您的情况需要在您的内部网络内验证实体时,私有证书颁发机构(CA)非常有用。
- 要点:例如,当您根据控制下的 CA 签名的证书创建 VPN 网关时,请使用私有 CA。当您不想支付商业 CA 时,也可以使用私有 CA。要在这样的用例中签名证书,私有 CA 使用自签名证书。
- 列表:您有 root 权限或使用 sudo 输入管理命令的权限。需要此类权限的命令标记为 #。
- 列表:您已在系统上安装了 GnuTLS。如果没有,您可以使用这个命令: $ dnf install gnutls-utils
- 列表:为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 ECDSA (Elliptic Curve Digital Signature Algorithm)密钥: $ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key> 密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。
- 列表:为证书创建一个模板文件。 使用文本编辑器创建文件,例如: $ vi <ca.cfg> 编辑文件以包含必要的认证详情: organization = "Example Inc." state = "Example" country = EX cn = "Example CA" serial = 007 expiration_days = 365 ca cert_signing_key crl_signing_key
- 列表:使用文本编辑器创建文件,例如: $ vi <ca.cfg>
- 列表:编辑文件以包含必要的认证详情: organization = "Example Inc." state = "Example" country = EX cn = "Example CA" serial = 007 expiration_days = 365 ca cert_signing_key crl_signing_key
- 命令/配置摘录:
$ dnf install gnutls-utils
$ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>2.8. 使用 GnuTLS 为 TLS 服务器证书创建私钥和 CSR
- 要点:您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,请首先为您的服务器创建私钥和证书签名请求(CSR)。
- 要点:流程
- 列表:在服务器系统上生成私钥,例如: $ certtool --generate-privkey --sec-param High --outfile <example_server.key>
- 列表:可选:使用文本编辑器准备一个简化创建 CSR 的配置文件,例如: $ vim <example_server.cnf> signing_key encryption_key key_agreement tls_www_server country = "US" organization = "Example Organization" cn = "server.example.com" dns_name = "example.com" dns_name = "server.example.com" ip_address = "192.168.0.1" ip_address = "::1" ip_address = "127.0.0…
- 列表:使用之前创建的私钥创建 CSR: $ certtool --generate-request --template <example_server.cfg> --load-privkey <example_server.key> --outfile <example_server.crq> 如果省略 --template 选项,certool 工具会提示您输入额外的信息,例如: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to en…
- 列表:将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。如需更多信息,请参阅 使用私有 CA ,使用 GnuTLS 为 CSR 发布证书。
- 列表:从 CA 获取请求的证书后,检查证书的人类可读部分是否与您的要求匹配,例如: $ certtool --certificate-info --infile <example_server.crt> Certificate: … Issuer: CN = Example CA Validity Not Before: Feb 2 20:27:29 2023 GMT Not After : Feb 2 20:27:29 2024 GMT Subject: C = US, O = Example Organization, CN = server.example.com Subject Public Key Info: P…
- 命令/配置摘录:
$ certtool --generate-privkey --sec-param High --outfile <example_server.key>
$ vim <example_server.cnf> signing_key encryption_key key_agreement tls_www_server country = "US" organization = "Example Organization" cn = "server.example.com" dns_name = "example.com" dns_name = "server.example.com" ip_address = "192.168.0.1" ip_address = "::1" ip_address = "127.0.0.1"2.9. 使用 GnuTLS 为 TLS 客户端证书创建私钥和 CSR
- 要点:您只有有了来自证书颁发机构(CA)的有效 TLS 证书时才可以使用 TLS 加密的通信频道。要获取证书,请首先为您的客户端创建私钥和证书签名请求(CSR)。
- 要点:流程
- 列表:在客户端系统上生成私钥,例如: $ certtool --generate-privkey --sec-param High --outfile <example_client.key>
- 列表:可选:使用文本编辑器准备一个简化创建 CSR 的配置文件,例如: $ vim <example_client.cnf> signing_key encryption_key tls_www_client cn = "client.example.com" email = "client@example.com"
- 列表:使用之前创建的私钥创建 CSR: $ certtool --generate-request --template <example_client.cfg> --load-privkey <example_client.key> --outfile <example_client.crq> 如果省略 --template 选项 certtool 工具会提示您输入额外的信息,例如: Generating a PKCS #10 certificate request... Country name (2 chars): <US> State or province name: <Washington> Locality name: <…
- 列表:将 CSR 提交给您选择的 CA 进行签名。或者,对于可信网络中的内部使用场景,请使用您的私有 CA 进行签名。请参阅 第 2.10 节 “使用私有 CA ,使用 GnuTLS 为 CSR 发布证书” 了解更多信息。
- 列表:检查证书的人类可读部分是否与您的要求匹配,例如: $ certtool --certificate-info --infile <example_client.crt> Certificate: … X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Alternative Name: email:client@example.com …
- 命令/配置摘录:
$ certtool --generate-privkey --sec-param High --outfile <example_client.key>
$ vim <example_client.cnf> signing_key encryption_key tls_www_client cn = "client.example.com" email = "client@example.com"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"
- 列表:使用 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 --certificate-info --infile <example_server.crt> X.509 Certificate Information: Version: 3 Serial Number (hex): 00 Issuer: CN=Example CA Validity: Not Before: Tue May 21 10:30:00 UTC 2026 Not After: Wed May 21 10:30:00 UTC 2027 Subject: CN=server.example.com ...
- 列表:验证证书是否由正确的 CA 签名: $ certtool --verify --load-ca-certificate <ca.crt> --infile <example_server.crt> Certificate[0]: CN=server.example.com Issued by: CN=Example CA Verification output: Verified.
- 命令/配置摘录:
$ vi <server_extensions.cfg> honor_crq_extensions ocsp_uri = "http://ocsp.example.com"
$ 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>第 3 章 使用共享的系统证书
- 要点:使用 RHEL 中的集中式系统信任存储来管理 TLS 证书。使用共享信任位置简化了系统中的证书管理和验证。
3.1. 系统范围的信任存储
- 要点:RHEL 包含一个用于管理 TLS 证书的集中式系统。NSS、GnuTLS、OpenSSL 和 Java 使用这个共享证书存储来检索系统证书定位符和拒绝列表信息。
- 要点:默认情况下,truststore 包含 Mozilla CA 列表,其中包括正和负信任。您可以使用集中式系统更新核心 Mozilla CA 列表。
- 列表:信任锚属于 /usr/share/pki/ca-trust-source/anchors/ 或 /etc/pki/ca-trust/source/anchors/。
- 列表:/usr/share/pki/ca-trust-source/anchors/ 或
- 列表:/etc/pki/ca-trust/source/anchors/。
- 列表:不信任的证书存储在 /usr/share/pki/ca-trust-source/blocklist/ 或 /etc/pki/ca-trust/source/blocklist/。
- 列表:/usr/share/pki/ca-trust-source/blocklist/ 或
- 列表:/etc/pki/ca-trust/source/blocklist/。
- 注意:注意 在分层加密系统中,信任锚是其他各方认为值得信任的权威实体。在 X.509 架构中,根证书是从中派生信任链的信任锚。要启用链验证,信任方必须有权访问信任锚。
3.2. 将新证书添加到系统范围的 truststore 中
- 要点:您可以将新证书添加到系统范围的信任存储中。在系统上运行的所有加密应用程序都会将其识别为可信。
- 要点:前提条件
- 列表:ca-certificates 软件包存在于系统中。
- 列表:将 PEM 或 DER 格式的证书文件复制到 /usr/share/pki/ca-trust-source/anchors/ 或 /etc/pki/ca-trust/source/anchors/ : # cp <~/certificate-trust-examples/Cert-trust-test-ca.pem> /usr/share/pki/ca-trust-source/anchors/
- 列表:更新系统范围的信任存储配置: # update-ca-trust extract
- 命令/配置摘录:
# cp <~/certificate-trust-examples/Cert-trust-test-ca.pem> /usr/share/pki/ca-trust-source/anchors/
# update-ca-trust extract- 注意:注意 虽然 Mozilla Firefox 浏览器可以使用添加的证书而不执行 update-ca-trust,但在每次 CA 更改后输入 update-ca-trust 命令。 浏览器,如 Mozilla Firefox 和 Chromium、缓存文件。您可能需要清除浏览器的缓存或重启浏览器来加载当前系统证书配置。
3.3. 使用 trust 命令信任的系统证书管理
- 要点:您可以使用 trust 命令管理共享系统范围信任存储中的证书。
- 要点:您可以使用以下方法从系统范围的信任存储中添加或删除证书:
- 列表:使用相应文件和 update-ca-trust 命令的基本文件操作。详情请参阅 Adding new certificate to the system-wide truststore 部分。
- 列表:trust 命令。
- 列表:要查看 trust 命令的内置帮助信息,请输入不带任何参数或使用 --help 指令的 trust 命令。另外,信任命令的所有 子命令都提供详细的内置帮助,例如: $ trust list --help usage: trust list --filter=<what> …
- 列表:要列出所有系统信任锚点和证书,请使用 trust list 命令,例如: $ trust list … pkcs11:id=%DD%04%09%07%A2%F5%7A%7D%52%53%12%92%95%EE%38%80%25%0D%A6%59;type=cert type: certificate label: SSL.com Root Certification Authority RSA trust: anchor category: authority …
- 列表:要将信任锚存储到系统范围的信任存储中,请使用 trust anchor 子命令。指定证书的路径。将 <path.to/certificate.crt > 替换为证书的路径: # trust anchor <path.to/certificate.crt>
- 列表:要删除证书,请使用证书的路径或证书的 ID: # trust anchor --remove <path.to/certificate.crt> # trust anchor --remove "pkcs11:id=<%AA%BB%CC%DD%EE>;type=cert"
- 命令/配置摘录:
$ trust list --help usage: trust list --filter=<what> …
$ trust list … pkcs11:id=%DD%04%09%07%A2%F5%7A%7D%52%53%12%92%95%EE%38%80%25%0D%A6%59;type=cert type: certificate label: SSL.com Root Certification Authority RSA trust: anchor category: authority …第 4 章 计划并使用 TLS
- 要点:在强化 TLS 时,您必须平衡安全性和客户端兼容性。更严格的设置限制客户端支持。放松的设置支持更多客户端,但降低了安全性。
- 要点:TLS (传输层安全)保护网络流量。您可以通过设置来提高安全性:
- 列表:key-exchange 方法
- 列表:身份验证方法
- 列表:加密算法
4.1. SSL 和 TLS 协议
- 要点:查看 SSL 和 TLS 协议的历史记录和使用建议,以了解哪些版本安全,并避免。
- 要点:Netscape 公司为安全互联网通讯开发了安全套接字层(SSL)协议。Internet Engineering Task Force (IETF)采用它并重命名了传输层安全(TLS)。
- 列表:IETF:传输层安全(TLS)协议版本 1.3
- 表格样本(共 7 行):
- 协议版本 | 用法建议
- SSL v2 | 不要使用。此版本具有严重的安全漏洞。RHEL 7 将其从核心加密库中删除。
- SSL v3 | 不要使用。此版本具有严重的安全漏洞。RHEL 8 将其从核心加密库中删除。
- TLS 1.0 | 不建议。这个版本有无法修复的已知问题。它不支持现代密码套件。RHEL 10 在所有加密策略中禁用它。
4.2. 在 RHEL 10 中对 TLS 的安全注意事项
- 要点:在 RHEL 中配置 TLS 时,请查看关键安全方面。您可以通过选择协议、密码套件和密钥长度来强化加密设置。
- 要点:RHEL 10 库为大多数部署提供安全的默认设置。TLS 实现尽可能使用安全算法。它们不会阻止连接或到旧的客户端或服务器。
- 注意:警告 为 LEGACY 加密策略禁用的算法不符合红帽的 RHEL 10 安全愿景。其安全属性不可靠。考虑放弃使用这些算法,而不是重新启用它们。 如果您重新启用它们以便与旧硬件的互操作性,请将它们视为不安全。应用额外的保护措施,例如将其网络交互隔离到单独的网络段。不要在公共网络中使用它们。
4.2.1. 协议
- 要点:最新的 TLS 版本提供最佳安全性。TLS 1.2 是最低版本,即使使用 LEGACY 加密策略也是如此。
- 要点:您可以通过选择不使用加密策略或提供自定义策略来重新启用旧的协议版本。不支持生成的配置。
- 注意:警告 在 FIPS 模式下运行的 RHEL 9.2 及更高版本系统强制执行扩展主 Secret (EMS)扩展(RFC 7627)。任何 TLS 1.2 连接都需要 FIPS 140-3 标准。不支持 EMS 或 TLS 1.3 的传统客户端无法在 FIPS 模式中连接到 RHEL 9 和 10 服务器。FIPS 模式中的 RHEL 9 和 10 客户端无法连接到只支持没有 EMS 的 TLS 1.2 的服务器。
4.2.2. 密码套件
- 要点:首选现代、安全的密码套件到旧的不安全密码套件。始终禁用 eNULL 和 aNULL 密码套件。它们不提供加密或身份验证。
- 要点:根据 RC4 或 HMAC-MD5 禁用密码套件。这有严重的缺点。同时禁用导出密码套件。它们被有意弱,并容易破解。
4.2.3. 公钥长度
- 要点:使用 RSA 密钥时,首选至少由 SHA-256 签名的 3072 位的密钥长度。这足以实现真正 128 位安全。
- 要点:其他资源
- 列表:使用系统范围的加密策略
- 列表:使用 Red Hat Enterprise Linux 9.2 强制的 TLS 扩展"Extended Master Secret" (红帽知识库)
- 注意:警告 您的系统安全性仅与链中最弱的链接相同。只是一个强大的密码不能保证良好的安全性。 密钥和证书同样重要。认证认证机构(CA)用于签署您的密钥的哈希功能和密钥也很重要。
4.3. 应用程序中的 TLS 配置强化
- 要点:您可以使用自定义 TLS 配置设置覆盖系统范围的加密策略来强化特定应用程序。
- 要点:RHEL 系统范围的加密策略确保了使用加密库的应用程序的安全合规性。它们可防止使用已知的不安全协议、密码或算法。
4.3.1. Apache HTTP 服务器的 TLS 配置
- 要点:Apache HTTP 服务器与 OpenSSL 和 NSS 库兼容,用于处理 TLS 要求。RHEL 10 包括 mod_ssl 功能的软件包。
- 要点:mod_ssl 软件包会创建 /etc/httpd/conf.d/ssl.conf 配置文件。您可以使用此文件修改与服务器的 TLS 相关的设置。
- 命令/配置摘录:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.14.3.2. Nginx HTTP 和代理服务器的 TLS 配置
- 要点:要在 Nginx 中启用 TLS 1.3 支持,请将 TLSv1.3 值添加到 /etc/nginx/nginx.conf 的 server 部分中的 ssl_protocols 选项:
- 命令/配置摘录:
server { listen 443 ssl http2; listen [::]:443 ssl http2; … ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers … }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 时,请考虑以下三个指令:
- 列表:使用系统范围的加密策略
- 列表:部署 Web 服务器和反向代理
- 列表:在Apache HTTP服务器上配置TLS加密
- 列表:在 Nginx web 服务器中添加 TLS 加密
- 列表:安全使用传输层安全性(TLS)和数据报传输层安全性(DTLS)的建议
- 列表:Mozilla SSL 配置生成器
- 命令/配置摘录:
ssl_protocols = !SSLv2 !SSLv3 !TLSv1第 5 章 使用加密 DNS (eDNS)保护系统 DNS 流量.
- 要点:您可以启用加密的 DNS (eDNS)来保护使用 DNS-over-TLS (DoT)协议的 DNS 通信。加密 DNS 会加密所有 DNS 流量端到端,且没有回退到不安全的协议。它与零信任架构(ZTA)的原则一致。
- 要点:RHEL 中 eDNS 的当前实现只使用 DoT 协议。您可以使用两种主要方法在启用了 eDNS 的情况下安装 RHEL:
- 列表:从本地介质执行交互式安装。
- 列表:构建自定义可引导 ISO,以确保在安装过程中和安装后使用 enforce 策略配置 eDNS。
- 列表:转换现有的 RHEL 安装以使用 eDNS。
5.1. RHEL 中 eDNS 的组件概述
- 要点:核心组件在 eDNS 设置中交互,以启用正确的配置和安全性。
- 要点:以下组件在 RHEL 中组成 eDNS 设置:
5.1.1. EDNS 解析过程和核心交互
- 列表:解析主机名的应用程序请求。
- 列表:系统读取 /etc/resolv.conf 文件,并将查询发送给本地 unbound 服务。
- 列表:unbound 首先检查其内部缓存,来检查有效的,缓存的响应。
- 列表:如果没有在缓存中找到,unbound 使用 TLS 加密 DNS 查询并将其发送到配置的上游 DoT 启用 DNS 服务器。
- 列表:上游 DoT 服务器处理查询,并将加密的 DNS 响应发回给 unbound。
- 列表:unbound 解密、验证和缓存响应。
5.2. 从本地安装介质安装启用了 eDNS 的 RHEL
- 要点:使用 enforce 策略直接从本地介质启用加密 DNS (eDNS)的 RHEL。这有助于确保所有 DNS 查询都会在安装过程中和安装后保持私有和安全。
- 要点:如果需要一个自定义 CA 证书捆绑包,则必须使用 Kickstart 文件中的 %certificate 部分安装它。
- 列表:以 # 命令提示符开头的命令需要 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
- 列表:准备可引导安装介质。具体步骤请参阅 为 RHEL 创建可引导安装介质。如果您使用自定义 CA 捆绑包,请在介质中包含 Kickstart 文件。
- 列表:引导安装介质。
- 命令/配置摘录:
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %end
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.ks5.3. 使用自定义的可引导 ISO 安装启用了 eDNS 的 RHEL
- 要点:创建自定义可引导 ISO,以使用严格的 enforce 策略安装启用了加密 DNS (eDNS)的 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
- 列表:将 Kickstart 文件和内核参数添加到 ISO 中: 下面的脚本示例演示了如何创建一个自定义的启用了 eDNS 的可引导 ISO。您必须创建一个脚本文件来自动化此过程。 #!/bin/bash set -ex KERNELARGS="" # Enable network KERNELARGS+="ip=dhcp " # Set DoT DNS server KERNELARGS+="rd.net.dns=dns+tls://<server_ip>#<dns_server_hostname> " # Set to 'exclusive' to disable fallback to unencrypted DNS. O…
- 命令/配置摘录:
%certificate --dir /etc/pki/dns/extracted/pem/ --filename tls-ca-bundle.pem -----BEGIN CERTIFICATE----- <Base64-encoded_certificate_content> -----END CERTIFICATE----- %end
#!/bin/bash set -ex KERNELARGS="" # Enable network KERNELARGS+="ip=dhcp " # Set DoT DNS server KERNELARGS+="rd.net.dns=dns+tls://_<server_ip>_#_<dns_server_hostname>_ " # Set to 'exclusive' to disable fallback to unencrypted DNS. Other values: 'backup', 'prefer'. KERNELARGS+="rd.net.dns-resolve-mode=exclusive " # Set the dnsconfd plugin for NetworkManager KERNELARGS+="rd.net.dns-backend=dnsconfd " # Remove any existing ISO to prevent conflicts with the new build rm -f _<output_iso_filename>_ # Create a new bootable ISO with the Kickstart config file and kernel arguments mkksiso --ks _<kickstart_file>_ --cmdline "$KERNELARGS" _<input_iso_file…5.4. 在现有 RHEL 安装上启用 eDNS
- 要点:您可以在现有 RHEL 安装上启用加密的 DNS (eDNS),以使用 DNS-over-TLS 处理所有 DNS 流量。
- 要点:先决条件
- 列表:以 # 命令提示符开头的命令需要 sudo 提供的管理特权或 root 用户访问权限。有关如何配置 sudo 访问权限的详情,请参考 启用非特权用户,以运行某些命令。
- 列表:有一个现有的 RHEL 安装。
- 列表:以下软件包已安装在您的系统上: dnsconfd dnsconfd-dracut grubby
- 列表:dnsconfd
- 列表:dnsconfd-dracut
- 列表:grubby
- 命令/配置摘录:
[main] dns=dnsconfd [global-dns] resolve-mode=exclusive [global-dns-domain-*] servers=dns+tls://<server_ip_1><dns_server_hostname_1>,dns+tls://<server_ip_2><dns_server_hostname_2>
# systemctl enable --now dnsconfd- 注意:注意 在 /etc/pki/dns/extracted/pem 中添加或删除证书后,重启 dnsconfd 服务以应用更改。
5.5. DNS 配置的内核参数
- 要点:您可以使用内核参数在引导时启用 DNS over TLS (DoT),并为您的系统设置 DNS 解析行为。
- 要点:定义在解析过程中如何使用全局配置中的 DNS 服务器。以下模式与内核参数和 NetworkManager.conf 全局配置相关:
- 命令/配置摘录:
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.net5.6. 其他资源
- 列表:在 IdM 中保护带有 DoT 的 DNS
第 6 章 设置 IPsec VPN
- 要点:使用 IPsec 协议套件的 Libreswan 实现,配置和管理安全虚拟专用网络(VPN)。libreswan 创建加密隧道来通过互联网进行安全数据传输。
- 要点:IPsec 隧道确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部,或为远程用户提供对公司网络的安全访问。
- 列表:手动编辑 Libreswan 配置文件,来精细控制高级选项。
- 列表:使用 vpn RHEL 系统角色自动化创建 Libreswan VPN 配置的过程。
- 列表:使用 Nmstate ,通过声明性 API 配置 Libreswan 连接。
- 注意:注意 Libreswan 是 RHEL 中唯一支持的 VPN 技术。
6.1. IPsec VPN 中的组件
- 要点:在设置 IPsec VPN 前,务必要了解其主要组件:用于身份验证和协商的互联网密钥交换(IKE),以及用于数据加密和传输的 IPsec。
- 要点:IKE 是两个端点之间身份验证和协商的协议。它协商连接规则,包括加密算法。Libreswan 在 pluto 守护进程中实现 IKE。
6.2. Libreswan 身份验证方法
- 要点:根据您的安全需求和网络环境,选择合适的验证方法来建立安全 VPN 连接。
- 要点:Libreswan 支持以下验证方法:
6.3. 手动配置具有原始 RSA 密钥身份验证的 IPsec 主机到主机的 VPN
- 要点:主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。
- 要点:对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求,并提供强大的对等身份验证来简化部署。
- 列表:如果 Libreswan 尚未安装,请执行以下步骤: 安装 libreswan 软件包: # dnf install libreswan 初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。 启用并启动 ipsec 服务: # systemctl enable --now ipsec 在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 列表:安装 libreswan 软件包: # dnf install libreswan
- 列表:初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。
- 列表:启用并启动 ipsec 服务: # systemctl enable --now ipsec
- 列表:在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 列表:创建一个 RSA 密钥对: # ipsec newhostkey ipsec 工具将密钥对存储在 NSS 数据库中。
- 命令/配置摘录:
# dnf install libreswan
# ipsec initnss- 注意:注意 您可以在两个主机上使用同样的配置文件,Libreswan 使用内部信息决定在左还是右主机上操作。但是,务必确保 left* 参数中的所有值都属于一个对等主机,且 right* 参数中的值属于另一个主机。
6.4. 手动配置具有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN
- 要点:站点到站点的 VPN 在两个不同的网络之间建立一个安全、加密的隧道,在不安全的公共网络(如互联网)中链接它们。
- 要点:例如,站点到站点 VPN 允许分支办公室中的设备访问公司总部的资源,就如同它们都是同一本地网络的一部分一样。
- 列表:两个网络中的路由确保流量通过本地 VPN 网关设备发送到远程网络。
- 列表:如果 Libreswan 尚未安装,请执行以下步骤: 安装 libreswan 软件包: # dnf install libreswan 初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。 启用并启动 ipsec 服务: # systemctl enable --now ipsec 在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 列表:安装 libreswan 软件包: # dnf install libreswan
- 列表:初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。
- 列表:启用并启动 ipsec 服务: # systemctl enable --now ipsec
- 列表:在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 命令/配置摘录:
# dnf install libreswan
# ipsec initnss- 注意:注意 您可以在两个网关设备上使用同样的配置文件,Libreswan 使用内部信息决定在左还是右主机上操作。但是,务必确保 left* 参数中的所有值都属于一个对等主机,且 right* 参数中的值属于另一个主机。
6.5. 手动配置具有基于证书身份验证的 IPsec 主机到站点 VPN
- 要点:主机到站点 VPN 在远程计算机和专用网络之间创建一个安全、加密的连接。这会跨公共网络(如互联网)链接它们。
- 要点:远程员工使用主机到站点的 VPN 访问其公司的内部网络。它们可以从其计算机访问资源,就如同它们在办公室中一样。
6.5.1. 手动设置 IPsec 网关
- 要点:您必须正确配置 Libreswan IPsec 网关来启用安全远程访问。Libreswan 从网络安全服务(NSS)数据库读取服务器证书、私钥和 CA 证书。
- 要点:以下示例允许经过身份验证的用户访问内部 192.0.2.0/24 子网,并将虚拟 IP 池中的 IP 地址动态分配给每个客户端。要保持安全性,网关会验证客户端证书是否由同一可信 CA 发布,并自动使用证书撤销列表(CRL)来确保对于任何撤销的证书都拒绝访问。
- 列表:Public Key Cryptography Standards #12(PKCS #12)文件 ~/file.p12 在网关上存在,并具有以下内容: 服务器的私钥 服务器证书 CA 证书 如果需要,则为中间证书 有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
- 列表:服务器的私钥
- 列表:服务器证书
- 列表:CA 证书
- 列表:如果需要,则为中间证书
- 列表:服务器证书包含以下字段: Extended Key Usage(EKU)被设置为 TLS Web Server Authentication。 Common Name (CN)或 Subject Alternative Name(SAN)被设置为网关的完全限定域名(FQDN)。 X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
- 命令/配置摘录:
# dnf install libreswan
# ipsec initnss6.5.2. 使用 GNOME 设置将客户端配置为连接到 IPsec VPN 网关
- 要点:要访问远程私有网络上的资源,用户必须首先配置一个 IPsec VPN 连接。GNOME Settings 应用程序提供一个图形化的解决方案,来在 NetworkManager 中创建一个 IPsec VPN 连接配置文件,并建立隧道。
- 要点:先决条件
- 列表:您已配置了 IPsec VPN 网关。
- 列表:已安装 NetworkManager-libreswan-gnome 软件包。
- 列表:PKCS #12 文件 ~/file.p12 客户端上存在,其中包含以下内容: 用户的私钥 用户证书 CA 证书 如果需要,则为中间证书 有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
- 列表:用户的私钥
- 列表:用户证书
- 列表:CA 证书
- 命令/配置摘录:
# ipsec initnss
# ipsec import ~/file.p12 Enter password for PKCS12 file: <password> pk12util: PKCS12 IMPORT SUCCESSFUL correcting trust bits for Example-CA- 表格样本(共 7 行):
- 字段名称 | 值 | 相应的 ipsec.conf 参数
- Name | <networkmanager_profile_name> | N/A
- Gateway | <ip_address_or_fqdn_of_the_gateway> | right
- 类型 | IKEv2 (certificate) | authby
6.6. 手动配置具有基于证书的身份验证的 IPsec 网格 VPN
- 要点:IPsec 网格会创建一个完全互连的网络,其中每个服务器都可以与其他服务器安全且直接地进行通信。这是跨多个数据中心或云提供商的分布式数据库集群或高可用性环境的理想选择。
- 要点:在每对服务器之间建立直接的加密隧道可确保安全通信,而没有中央瓶颈。为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供安全、可扩展的解决方案。网格中的每个主机都存在一个由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个操作,如果证书出现在列表中,则拒绝访问。
- 列表:网格中的每个对等点都存在一个 Public Key Cryptography Standards #12 (PKCS #12)文件,其中包含以下内容: 服务器的私钥 服务器证书 CA 证书 如果需要,则为中间证书 有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
- 列表:服务器的私钥
- 列表:服务器证书
- 列表:CA 证书
- 列表:如果需要,则为中间证书
- 列表:服务器证书包含以下字段: Extended Key Usage(EKU)被设置为 TLS Web Server Authentication。 Common Name(CN)或 Subject Alternative Name(SAN)被设置为主机的完全限定域名(FQDN)。 X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
- 命令/配置摘录:
# dnf install libreswan
# ipsec initnss6.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/
- 列表:输入当前密码: Enter Password or Pin for "NSS Certificate DB": <password> 如果数据库目前不受密码保护,请按 Enter 键。
- 列表:输入新密码: Enter new password: <new_password> Re-enter password: <new_password>
- 列表:要解锁数据库,ipsec 服务需要 /etc/ipsec.d/nsspassword 文件。使用以下内容创建文件: 如果主机没有在 FIPS 模式下运行: NSS Certificate DB:<password> 如果主机在 FIPS 模式下运行: NSS FIPS 140-2 Certificate DB:<password>
- 列表:如果主机没有在 FIPS 模式下运行: NSS Certificate DB:<password>
- 命令/配置摘录:
# certutil -W -d /var/lib/ipsec/nss/
Enter Password or Pin for "NSS Certificate DB": <password>6.8. 在启用了 FIPS 模式的系统上使用 IPsec
- 要点:Federal Information Processing Standard (FIPS)模式中的 RHEL 只使用经过验证的加密模块。FIPS 模式禁用旧的协议和密码。联邦合规性通常需要 FIPS 模式。它还提高了系统安全性。
- 要点:RHEL 中的 Libreswan IPsec 工具完全兼容 FIPS。当 FIPS 模式为 on 时,Libreswan 使用认证的加密模块。您不需要配置任何内容。无论您在新的 FIPS 系统上安装 Libreswan,或者在现有的 Libreswan VPN 中启用 FIPS。
- 命令/配置摘录:
# ipsec whack --fipsstatus FIPS mode enabled
# ipsec pluto --selftest 2>&1 ... FIPS Encryption algorithms: AES_CCM_16 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm, aes_ccm_c AES_CCM_12 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm_b AES_CCM_8 {256,192,*128} IKEv1: ESP IKEv2: ESP FIPS aes_ccm_a ...6.9. 为 IPsec VPN 连接配置 TCP 回退
- 要点:标准 IPsec VPN 可能会在阻止 UDP 和 Encapsulating Security Payload(ESP)协议的限制网络中失败。要确保此类环境中的连接性,Libreswan 可以在 TCP 连接内封装所有 VPN 流量。
- 要点:先决条件
- 列表:IPsec 连接已配置。
- 列表:编辑 /etc/ipsec.conf 文件,并在 config setup 部分中进行以下更改: 将 Libreswan 配置为侦听 TCP 端口: listen-tcp=yes 默认情况下,Libreswan 侦听端口 4500。如果要使用不同的端口,请输入: tcp-remoteport=<port_number> 如果 UDP 不可用或永久使用,则决定是否使用 TCP 作为回退选项: 作为回退选项,请输入: enable-tcp=fallback retransmit-timeout=5s 默认情况下,Libreswan 在使用 UDP 尝试连接失败后会等待 60 秒,然后再通过 TCP 重试连接。降低 retransmit…
- 列表:将 Libreswan 配置为侦听 TCP 端口: listen-tcp=yes
- 列表:默认情况下,Libreswan 侦听端口 4500。如果要使用不同的端口,请输入: tcp-remoteport=<port_number>
- 列表:如果 UDP 不可用或永久使用,则决定是否使用 TCP 作为回退选项: 作为回退选项,请输入: enable-tcp=fallback retransmit-timeout=5s 默认情况下,Libreswan 在使用 UDP 尝试连接失败后会等待 60 秒,然后再通过 TCP 重试连接。降低 retransmit-timeout 值会缩短延迟,从而使回退协议可以更快地启动。 作为 UDP 的永久替换,请输入: enable-tcp=yes
- 列表:作为回退选项,请输入: enable-tcp=fallback retransmit-timeout=5s 默认情况下,Libreswan 在使用 UDP 尝试连接失败后会等待 60 秒,然后再通过 TCP 重试连接。降低 retransmit-timeout 值会缩短延迟,从而使回退协议可以更快地启动。
- 命令/配置摘录:
listen-tcp=yes
tcp-remoteport=<port_number>- 注意:重要 在 TCP 中封装 VPN 数据包可减少吞吐量并增加延迟。因此,只使用 TCP 封装作为回退选项,或者如果您的环境中始终阻止了基于 UDP 的连接。
6.10. 在 Libreswan 中启用旧的密码和算法
- 要点:在 Libreswan 中启用旧的密码和算法,来向后兼容其他 IPsec 对等点。这会覆盖 RHEL 系统范围的加密策略,该策略默认为 IPsec 和互联网密钥交换(IKE)强制执行强大的加密密码和算法。
- 要点: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 ...
- 列表:重启 ipsec 服务: # systemctl restart ipsec
- 命令/配置摘录:
conn <connection_name> keyexchange=ikev1 ike=aes-sha2,aes-sha1;modp2048 esp=aes-sha2,aes-sha1 ...
# systemctl restart ipsec6.11. 将 VPN 连接分配给专用的路由表,以防止连接绕过隧道
- 要点:要防止 VPN 连接免受流量重定向攻击,请将其分配给一个专用路由表。这可防止恶意的网络服务器绕过安全隧道,并损害数据完整性。
- 要点:DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口,而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并在 CVE-2024-3661 漏洞文章中进行了所述。
- 列表:至少有一个网络接口使用 DHCP 或 SLAAC。
- 列表:您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
- 列表:决定您要使用哪个路由表。以下步骤使用表 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.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75" 优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。
- 列表:重新连接 VPN 连接: # nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
- 命令/配置摘录:
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-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"- 注意:重要 通过 VPN 路由整个流量可防止主机访问本地网络资源。
6.12. 使用 RHEL 系统角色配置 IPsec VPN 连接
- 要点:配置 IPsec VPN 连接,以便在不受信任的网络上建立加密隧道,并确保数据在传输过程中的完整性。通过使用 RHEL 系统角色,您可以自动化用例的设置,如将分支机构连接到总部。
- 注意:注意 vpn RHEL 系统角色只能创建使用预共享密钥(PSK)或证书来相互验证对等点的 VPN 配置。
6.12.1. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN
- 要点:主机到主机的 VPN 在两个设备之间建立一个加密连接,允许应用程序通过不安全的网络安全地通信。通过使用 vpn RHEL 系统角色,您可以自动化创建 IPsec 主机到主机连接的过程。
- 要点:对于身份验证,预共享密钥(PSK)是一个直接的方法,其使用一个只有两个对等点知道的共享 secret 。这种方法易于配置,非常适合优先考虑易于部署的基本设置。但是,您必须对密钥进行严格保密。可以访问密钥的攻击者可能会破坏连接。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: …
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
... - hosts: ... external-host.example.com: hostname: 192.0.2.16.12.2. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN ,并将数据和控制平面分开
- 要点:使用 vpn RHEL 系统角色自动化创建 IPsec 主机到主机的 VPN 过程。要通过最大程度减少被截获或破坏的控制消息的风险来提高安全性,请为数据流量和控制流量配置单独的连接。
- 要点:主机到主机 VPN 在两个设备之间建立一个直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: mana…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP…
$ ansible-playbook --syntax-check ~/playbook.yml6.12.3. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 站点到站点 VPN
- 要点:站点到站点的 VPN 在两个不同的网络之间建立了一个加密的隧道,在不安全的公共网络中连接它们。通过使用 vpn RHEL 系统角色,您可以自动化创建 IPsec 站点到站点 VPN 连接的过程。
- 要点:站点到站点 VPN 可让分支机构中的设备访问公司总部中的资源,就像它们都是同一本地网络的一部分一样。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: …
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: subnets: - 192.0.2.0/24 managed-node-02.example.com: subnets: - 198.51.100.0/24 - 203.0.113.0/24 auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
... - hosts: ... external-host.example.com: hostname: 192.0.2.16.12.4. 使用 vpn RHEL 系统角色配置带有基于证书身份验证的 IPsec 网格 VPN
- 要点:IPsec 网格会创建一个完全互连的网络,其中每个服务器都可以与其他服务器安全且直接地进行通信。通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。
- 要点:IPsec 网格适用于跨多个数据中心或云提供商的分布式数据库集群或高可用性环境。在每对服务器之间建立直接的加密隧道可确保安全通信,而没有中央瓶颈。
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:您可以为每个受管节点准备一个 PKCS #12 文件: 每个文件包含: 服务器的私钥 服务器证书 CA 证书 如果需要,则为中间证书 文件被命名为 <managed_node_name_as_in_the_inventory>.p12。 文件存储在与 playbook 相同的目录中。 服务器证书包含以下字段: Extended Key Usage(EKU)被设置为 TLS Web Server Authentication。 Common Name(CN)或 Subject Alternative Name(SAN)被设置为主机的完全限定域名(FQDN)。 X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
- 列表:每个文件包含: 服务器的私钥 服务器证书 CA 证书 如果需要,则为中间证书
- 列表:服务器的私钥
- 命令/配置摘录:
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
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>6.13. 使用 nmstatectl 配置 IPsec VPN 连接
- 要点:配置 IPsec VPN 连接,以便在不受信任的网络上建立加密隧道,并确保数据在传输过程中的完整性。通过使用 Nmstate,您可以使用声明性 API 创建 IPsec VPN 连接。
- 要点:您可以使用 nmstatectl 工具通过 Nmstate API 配置 Libreswan IPsec VPN 连接。nmstatectl 工具是一个命令行工具,用于通过声明性 Nmstate API 管理主机网络。您不必运行多个命令来配置接口,而是在 YAML 文件中定义预期的状态。然后,nmstate 会采用此定义并将其应用到系统。这种方法的关键优点是原子结果。nmstate 确保生成的配置与您的 YAML 定义准确匹配。如果配置的任何部分无法应用,它会自动回滚所有更改,并防止系统进入不正确或损坏的网络状态。
- 注意:注意 由于 NetworkManager-libreswan 插件的设计,您只能在一个对等点上使用 nmstatectl,且必须在另一个对等点上手动配置 Libreswan。
6.13.1. 使用 nmstatectl,配置具有原始 RSA 密钥身份验证的 IPsec 主机到主机的 VPN
- 要点:您可以使用声明性 Nmstate API 在两个设备之间配置主机到主机的 VPN,来在不安全的网络上安全地进行通信。nmstate 确保结果与配置文件匹配或回滚更改。
- 要点:对于身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求,并提供强大的对等身份验证来简化部署。
- 列表:远程对等点运行 Libreswan IPsec,并为 主机到主机 连接做好了准备。 由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他也使用此插件进行同样连接的对等点进行通信。
- 列表:如果 Libreswan 尚未安装,请执行以下步骤: 安装所需的软件包: # dnf install nmstate libreswan NetworkManager-libreswan 重启 NetworkManager 服务: # systemctl restart NetworkManager 初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。 在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewa…
- 列表:安装所需的软件包: # dnf install nmstate libreswan NetworkManager-libreswan
- 列表:重启 NetworkManager 服务: # systemctl restart NetworkManager
- 列表:初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。
- 列表:在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 命令/配置摘录:
# dnf install nmstate libreswan NetworkManager-libreswan
# systemctl restart NetworkManager- 注意:注意 通常,选择将哪台主机命名为 left 和 right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left,对远程主机使用术语 right。
6.13.2. 使用 nmstatectl 配置具有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN
- 要点:您可以使用声明性 Nmstate API 在两个不同的网络之间配置站点到站点 VPN,在不安全的网络中连接它们。nmstate 确保结果与配置文件匹配或回滚更改。
- 要点:为对网关设备进行身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求,并提供强大的对等身份验证来简化部署。
- 列表:远程网关运行 Libreswan IPsec,并为 站点到站点 连接做好了准备。 由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他也使用此插件进行同样连接的对等点进行通信。
- 列表:如果 Libreswan 尚未安装,请执行以下步骤: 安装所需的软件包: # dnf install nmstate libreswan NetworkManager-libreswan 重启 NetworkManager 服务: # systemctl restart NetworkManager 初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。 在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewa…
- 列表:安装所需的软件包: # dnf install nmstate libreswan NetworkManager-libreswan
- 列表:重启 NetworkManager 服务: # systemctl restart NetworkManager
- 列表:初始化 Network Security Services (NSS)数据库: # ipsec initnss 命令在 /var/lib/ipsec/nss/ 目录中创建数据库。
- 列表:在防火墙中打开 IPsec 端口和协议: # firewall-cmd --permanent --add-service="ipsec" # firewall-cmd --reload
- 命令/配置摘录:
# dnf install nmstate libreswan NetworkManager-libreswan
# systemctl restart NetworkManager- 注意:注意 通常,选择将哪些主机命名为 left 和 right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left,对远程主机使用术语 right。
6.13.3. 使用 nmstatectl 将客户端配置为连接到 IPsec VPN 网关
- 要点:要访问远程私有网络上的资源,用户必须首先配置一个 IPsec VPN 连接。通过使用 Nmstate,您可以使用声明性 API 创建与现有 Libreswan IPsec 网关的连接。
- 要点:先决条件
- 列表:远程网关运行 Libreswan IPsec,并为带有 基于证书的身份验证的主机到站点 连接做好了准备。 由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他也使用此插件进行同样连接的对等点进行通信。
- 列表:PKCS#12 文件 ~/file.p12 在客户端上存在,其包含以下内容: 用户的私钥 用户证书 CA 证书 如果需要,则为中间证书 有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。
- 列表:用户的私钥
- 列表:用户证书
- 列表:CA 证书
- 列表:如果需要,则为中间证书
- 命令/配置摘录:
# dnf install nmstate libreswan NetworkManager-libreswan
# systemctl restart NetworkManager- 注意:注意 通常,选择将哪台主机命名为 left 和 right 是任意的。但是,NetworkManager 始终对本地主机使用术语 left,对远程主机使用术语 right。
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/326.14.2. 与防火墙相关的问题
- 要点:诊断由防火墙相关的问题导致的 IPsec 连接失败。
- 要点:如果端点或中间路由上的防火墙丢弃了互联网密钥交换版本 2 (IKEv2)数据包,则 ipsec up 命令会超时,并显示重复的 retransmission 消息:
- 命令/配置摘录:
181 "vpn.example.com"[1] 192.0.2.2 #15: initiating IKEv2 IKE SA 181 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: sent v2I1, expected v2R1 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 0.5 seconds for response 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 1 seconds for response 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 2 seconds for response ...
# tcpdump -i <interface> -n -n esp or udp port 500 or udp port 4500 or tcp port 45006.14.3. 不匹配的配置
- 要点:如果端点没有配置匹配的互联网密钥交换(IKE)版本、算法、IP 地址范围或预共享密钥(PSK),则 VPN 连接会失败。如果识别到不匹配,则您必须使两个端点上的设置保持一致,以解决这个问题。
- 要点:如果连接被拒绝,则会显示一个 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 ... 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,Ni6.14.4. MTU 问题
- 要点:诊断由最大传输单元(MTU)问题导致的间歇性 IPsec 连接失败。加密会增加数据包大小,在数据包超过网络的 MTU 时导致碎片和丢失数据,通常会看到更大的数据传输。
- 要点:一个常见的症状是,小数据包(例如 ping)可以正常工作,但大型数据包(如 SSH 会话)在登录后冻结。要解决这个问题,请通过将 mtu=1400 选项添加到配置文件来降低隧道的 MTU。
6.14.5. NAT 冲突
- 要点:解决当 IPsec 主机也充当 NAT 路由器时发生的 NAT 冲突。不正确的 NAT 应用程序可以在加密之前转换源 IP 地址,导致数据包在网络上被未加密发送。
- 要点:例如,如果在应用 IPsec 加密之前,如果数据包的源 IP 地址被伪装规则转换了,则数据包的源不再与 IPsec 策略匹配,并且 Libreswan 在网络上将其未经加密发送。
- 命令/配置摘录:
# 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 return6.14.6. 内核级 IPsec 问题
- 要点:当 VPN 隧道似乎已建立但没有流量流时,对内核级 IPsec 问题进行故障排除。在这种情况下,检查内核的 IPsec 状态,以检查隧道策略和加密密钥是否已正确安装。
- 要点:这个过程涉及检查两个组件:
- 列表:安全策略数据库(SPD):指示内核要加密哪些流量的规则。
- 列表:安全关联数据库(SAD):指示内核如何加密该流量的密钥。
- 命令/配置摘录:
# 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 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 流量。
6.14.7. 内核 IPsec 子系统错误
- 要点:内核 IPsec 子系统中的缺陷可能会导致它失去与 IKE 守护进程的同步。这可能会导致协商的安全关联和实际 IPsec 策略实施之间的差异,从而破坏了安全的网络通信。
- 要点:要检查内核级错误,请显示转换(XFRM)统计信息:
- 命令/配置摘录:
# cat /proc/net/xfrm_stat6.14.8. 显示 Libreswan 日志
- 要点:显示 Libreswan 日志来诊断和排除 IPsec 服务事件和问题。访问 ipsec 服务的日志,以深入了解连接状态和潜在的问题。
- 要点:要显示日志,请输入:
- 命令/配置摘录:
# journalctl -xeu ipsec
plutodebug=all logfile=/var/log/pluto.log第 7 章 使用 MACsec 加密同一物理网络中的第 2 层流量
- 要点:配置 MACsec 以加密同一物理网络中的第 2 层流量。这有助于直接连接的设备(如主机或交换机)之间的安全点对点通信。
7.1. MACsec 如何提高安全性
- 要点:使用 Media Access Control Security (MACsec)来加密和验证第 2 层的 LAN 流量。这无需在第 7 层加密单个服务。
- 要点:MACsec 保护设备间的点对点通信。例如,您可以在通过 Metro-Ethernet 连接连接到分支和中心办公室的两个主机上配置 MACsec 来提高安全性。
- 列表:动态主机配置协议(DHCP)
- 列表:地址解析协议(ARP)
- 列表:IPv4 和 IPv6 流量
- 列表:任何通过 IP 的流量,如 TCP 或 UDP
- 列表:host-to-host
- 列表:host-to-switch 和 switch-to-other-hosts
- 注意:重要 您只能在同一物理或虚拟 LAN 中的主机之间使用 MACsec。
7.2. 使用 nmcli 配置 MACsec 连接
- 要点:您可以使用 nmcli 工具将以太网接口配置为使用 MACsec。例如,您可以在通过以太网连接的两个主机之间创建一个 MACsec 连接。
- 要点:流程
- 列表:在第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN): 创建一个 16 字节的十六进制 CAK: # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a 创建一个 32 字节的十六进制 CKN: # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e18…
- 列表:创建一个 16 字节的十六进制 CAK: # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
- 列表:创建一个 32 字节的十六进制 CKN: # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
- 列表:在两个主机上,使用第 1 步中的 CAK 和 CKN 创建 MACsec 连接。在 MACsec-protected 网络的每个主机上,这些值必须相同: # 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 f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df14…
- 列表:配置 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' 配置 IPv6 设置。例如,要为 macsec0 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器,请输入: # nmcli connection modify macsec0 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'
- 命令/配置摘录:
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c45507.3. 使用 nmstatectl 配置 MACsec 连接
- 要点:您可以使用声明性 Nmstate API 将以太网接口配置为使用 MACsec。nmstate 确保结果与配置文件匹配或回滚更改。
- 要点:先决条件
- 列表:服务器配置中存在一个物理或虚拟以太网网络接口控制器(NIC)。
- 列表:nmstate 软件包已安装。
- 列表:在第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN): 创建一个 16 字节的十六进制 CAK: # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a 创建一个 32 字节的十六进制 CKN: # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e18…
- 列表:创建一个 16 字节的十六进制 CAK: # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
- 列表:创建一个 32 字节的十六进制 CKN: # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
- 列表:在您要通过 MACsec 连接连接的两个主机上,完成以下步骤: 使用以下设置创建一个 YAML 文件,如 create-macsec-connection.yml : --- routes: config: - destination: 0.0.0.0/0 next-hop-interface: macsec0 next-hop-address: 192.0.2.2 table-id: 254 - destination: 192.0.2.2/32 next-hop-interface: macsec0 next-hop-address: 0.0.0.0 table-id: 254 dns-resolver: …
- 命令/配置摘录:
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550第 8 章 保护网络服务
- 要点:强化和监控网络服务,以保护您的系统免受各种风险。关闭未使用的服务有助于限制暴露。
- 要点:Red Hat Enterprise Linux 支持许多不同类型的网络服务器。它们的网络服务可能会使系统暴露于各种类型的攻击。这包括拒绝服务(DoS)、分布式拒绝服务(DDoS)、脚本漏洞和缓冲区溢出攻击。
8.1. 保护 rpcbind 服务
- 要点:您可以通过限制访问所有网络并使用服务器上的防火墙规则来定义特定例外来保护 rpcbind。
- 要点:rpcbind 服务是用于远程过程调用(RPC)服务的动态端口分配守护进程,如网络信息服务(NIS)和网络文件共享(NFS)。由于其身份验证机制较弱,并可为其控制的服务分配大量端口,从而保护 rpcbind。
- 列表:已安装 rpcbind 软件包。
- 列表:firewalld 软件包已安装,且服务正在运行。
- 列表:添加防火墙规则,例如: 限制 TCP 连接并仅接受来自端口 111 的 192.168.0.0/24 主机中的包: # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop' 限制 TCP 连接并只接受来自端口 111 上的本地主机的软件包: # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source addr…
- 列表:限制 TCP 连接并仅接受来自端口 111 的 192.168.0.0/24 主机中的包: # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'
- 列表:限制 TCP 连接并只接受来自端口 111 上的本地主机的软件包: # firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
- 列表:限制 UDP 连接并仅接受来自端口 111 的 192.168.0.0/24 主机中的包: # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop' 要使防火墙设置永久化,请在添加防火墙规则时使用 --permanent 选项。
- 命令/配置摘录:
# 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="127.0.0.1" accept'- 注意:注意 NFSv3 服务器需要 rpcbind 服务。 NFSv4 上不需要 rpcbind 服务。
8.2. 保护 rpc.mountd 服务
- 要点:rpc.mountd 守护进程实现 NFS 挂载协议的服务器端。NFS 版本 3(RFC 1813)使用 NFS 挂载协议。
- 要点:您可以通过添加防火墙规则来保护 rpc.mountd 服务。限制对所有网络的访问,并定义特定的例外。
- 列表:已安装 rpc.mountd 软件包。
- 列表:firewalld 软件包已安装,且服务正在运行。
- 列表:使用-- permanent 选项添加防火墙规则,使其在重启后保持不变。 示例: 从 192.168.0.0/24 网络丢弃挂载连接: # firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop' 接受来自本地主机的 mountd 连接: # firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" ser…
- 列表:从 192.168.0.0/24 网络丢弃挂载连接: # firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'
- 列表:接受来自本地主机的 mountd 连接: # firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
- 列表:重新载入防火墙以应用新规则: # firewall-cmd --reload
- 命令/配置摘录:
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" service name="mountd" source address="192.168.0.0/24" invert="True" drop'
# firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'8.3. 保护 NFS 服务
- 要点:使用 Kerberos 身份验证和加密文件系统操作来保护网络文件系统(NFS)。正确的安全配置有助于保护远程主机通过网络挂载文件系统。
- 要点:在将 NFSv4 与网络地址转换(NAT)或防火墙搭配使用时,您可以通过修改 /etc/default/nfs 文件来关闭委托。委托(Delegation)是服务器将文件管理委派给客户端的一种技术。与其相反,NFSv3 不使用 Kerberos 锁定和挂载文件。
8.3.1. 保护 NFS 服务器的导出选项
- 要点:使用 /etc/exports 文件中的导出选项,定义哪些主机可以访问导出的文件系统及其保存的权限。这有助于控制访问和限制安全风险。
- 要点:配置要导出哪些文件系统以及哪些主机可以在 /etc/exports 文件中访问它们。
- 列表:导出主目录存在风险,因为某些应用以纯文本或弱加密格式存储密码。您可以通过检查并改进应用程序代码来降低风险。
- 列表:有些用户没有在 SSH 密钥上设置密码,这再次给主目录带来风险。您可以通过强制使用密码或使用 Kerberos 来降低这些风险。
- 列表:将 NFS 导出仅限制为所需的客户端。在 NFS 服务器上使用 showmount -e 命令来检查服务器正在导出什么。不要导出不需要的任何内容。
- 列表:不要允许不必要的用户登录到服务器,以减少攻击风险。您可以定期检查谁可以访问服务器,以及可以访问服务器的什么数据。
- 列表:使用 Ansible 为 IdM 用户自动挂载 NFS 共享
- 命令/配置摘录:
/tmp/nfs/ bob.example.com(rw)
/tmp/nfs/ bob.example.com (rw)- 注意:警告 /etc/exports 文件语法中的额外空格可能会导致配置中有显著变化。 在以下示例中,/tmp/nfs/ 目录与 bob.example.com 主机共享,并具有读写权限: /tmp/nfs/ bob.example.com(rw) 以下示例与前一个相同,但与 bob.example.com 主机共享具有只读权限的同一目录,由于主机名后面的单个空格字符,并将其共享为具有读写权限的全局目录: /tmp/nfs/ bob.example.com (rw)
- 注意:警告 要导出整个文件系统,因为导出文件系统的子目录不安全。攻击者可能会访问部分导出的文件系统的未导出部分。
8.3.2. 保护 NFS 客户端的挂载选项
- 要点:您可以在配置 NFS 客户端时应用挂载选项,以帮助强制实施更强大的安全性。这些设置可确保客户端/服务器通信使用所需的安全协议,如 Kerberos。
- 要点:mount 命令的以下选项可能会增加基于 NFS 的客户端的安全性:
- 列表:常用的 NFS 挂载选项
- 注意:重要 krb5-libs 软件包提供的 MIT Kerberos 库不支持新部署中的数据加密标准(DES)算法。因为安全和兼容性的原因,在 Kerberos 库中默认禁用 DES。出于兼容性的原因,请使用更新、更安全的算法而不是 DES。
8.3.3. 使用防火墙保护 NFS
- 要点:要保护 NFS 服务器上的防火墙,请仅开放所需的端口。不要将 NFS 连接端口号用于任何其他服务。
- 要点:先决条件
- 列表:已安装 nfs-utils 软件包。
- 列表:firewalld 软件包已安装并运行。
- 列表:为 NFS 服务配置静态端口以简化防火墙规则。rpcbind 服务默认动态分配 NFS 端口。在 /etc/nfs.conf 文件中指定静态端口: 对于 NFSv3,配置这些服务: 在 [mountd] 部分为 mountd (rpc.mountd) 设置 TCP 和 UDP 端口,格式为 port=<value>。 在 [statd] 部分为 statd (rpc.statd) 设置 TCP 和 UDP 端口,格式为 port=<value>。 在 [lockd] 部分为 lock manager 设置 TCP 端口,格式为 port= <value>。或者,使用 /etc/modprobe.d/lockd.conf 文件…
- 列表:在 [mountd] 部分为 mountd (rpc.mountd) 设置 TCP 和 UDP 端口,格式为 port=<value>。
- 列表:在 [statd] 部分为 statd (rpc.statd) 设置 TCP 和 UDP 端口,格式为 port=<value>。
- 列表:在 [lockd] 部分为 lock manager 设置 TCP 端口,格式为 port= <value>。或者,使用 /etc/modprobe.d/lockd.conf 文件中的 nlm_tcpport 选项。
- 命令/配置摘录:
# firewall-cmd --permanent --add-port=2049/tcp
# firewall-cmd --permanent --add-port=2049/tcp # firewall-cmd --permanent --add-port=<mountd_port>/tcp # firewall-cmd --permanent --add-port=<mountd_port>/udp # firewall-cmd --permanent --add-port=<statd_port>/tcp # firewall-cmd --permanent --add-port=<statd_port>/udp # firewall-cmd --permanent --add-port=<lockd_tcp_port>/tcp # firewall-cmd --permanent --add-port=<lockd_udp_port>/udp8.4. 保护 FTP 服务
- 要点:您可以使用文件传输协议(FTP)来通过网络传输文件。因为服务器的所有 FTP 事务(包括用户身份验证)都未加密,因此确保其被安全配置。
- 要点:Red Hat Enterprise Linux 提供两种 FTP 服务器:
8.4.1. 保护 FTP 的问候横幅
- 要点:当用户连接到 FTP 服务时,服务器默认显示问候横幅,其中包括版本信息。攻击者可以利用此信息来识别系统中的漏洞。您可以通过更改默认的横幅来隐藏此信息。
- 要点:您可以通过编辑 /etc/banners/ftp.msg 文件来定义自定义横幅。它可以直接包含一个单行消息,或引用一个单独的文件,其中包含多行消息。
- 列表:要定义单行消息,请在 /etc/vsftpd/vsftpd.conf 文件中添加以下选项: ftpd_banner=Hello, all activity on ftp.example.com is logged.
- 列表:在单独的文件中定义信息: 创建一个 .msg 文件,其中包含横幅消息,如 /etc/banners/ftp.msg : ######### Hello, all activity on ftp.example.com is logged. ######### 为了简化多个横幅的管理,请将所有横幅放在 /etc/banners/ 目录中。 将横幅文件的路径添加到 /etc/vsftpd/vsftpd.conf 文件中的 banner_file 选项中: banner_file=/etc/banners/ftp.msg
- 列表:创建一个 .msg 文件,其中包含横幅消息,如 /etc/banners/ftp.msg : ######### Hello, all activity on ftp.example.com is logged. ######### 为了简化多个横幅的管理,请将所有横幅放在 /etc/banners/ 目录中。
- 列表:将横幅文件的路径添加到 /etc/vsftpd/vsftpd.conf 文件中的 banner_file 选项中: banner_file=/etc/banners/ftp.msg
- 列表:显示修改后的横幅: $ ftp localhost Trying ::1… Connected to localhost (::1). Hello, all activity on ftp.example.com is logged.
- 命令/配置摘录:
ftpd_banner=Hello, all activity on ftp.example.com is logged.
######### Hello, all activity on ftp.example.com is logged. #########8.4.2. 在 FTP 中配置仅写匿名上传
- 要点:配置匿名 FTP 访问以允许上传。防止读取访问权限以提高安全性。
- 要点:默认情况下,vsftpd 软件包会创建 /var/ftp/ 目录树。匿名用户具有只读权限。配置仅写目录,匿名用户可以上传文件。它们无法读取或修改现有的内容。
- 列表:在 /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
- 列表:在 /etc/vsftpd/vsftpd.conf 文件中添加以下行: anon_upload_enable=YES anonymous_enable=YES
- 列表:可选:如果系统启用了 SELinux 并强制实施,启用 SELinux 布尔值属性 allow_ftpd_anon_write 和 allow_ftpd_full_access。 警告 配置用于匿名读写访问的目录会增加风险。服务器可能成为 stolen 软件的存储库。
- 命令/配置摘录:
# 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
anon_upload_enable=YES anonymous_enable=YES- 注意:警告 配置用于匿名读写访问的目录会增加风险。服务器可能成为 stolen 软件的存储库。
8.4.3. FTP 用户帐户的安全提示
- 要点:FTP 通过不安全的网络以未加密的方式传输用户名和密码以进行身份验证。您可以通过拒绝系统用户从其用户帐户访问服务器来提高 FTP 安全性。
- 要点:根据您的配置执行以下许多配置步骤:
- 列表:通过在 /etc/vsftpd/vsftpd.conf 文件中添加以下行来禁用 vsftpd 服务器中的所有用户帐户: local_enable=NO
- 列表:要禁用特定帐户或特定帐户组(如 root 用户和带有 sudo 权限的组)对 FTP 的访问,您可以将用户名添加到 /etc/pam.d/vsftpd PAM 配置文件。
- 列表:通过在 /etc/vsftpd/ftpusers 文件中添加用户名来禁用用户帐户。
- 命令/配置摘录:
local_enable=NO8.5. 保护 HTTP 服务器
- 要点:强化 HTTP 服务器,如 Apache 和 Nginx,以缓解安全风险。这包括在主配置文件中配置安全选项并检查脚本是否正确运行。
8.5.1. httpd.conf 中的安全增强
- 要点:您可以通过在 /etc/httpd/conf/httpd.conf 文件中配置安全选项来提高 Apache HTTP 服务器的安全性。
- 要点:在 /etc/httpd/conf/httpd.conf 文件中,您可以配置以下选项:
- 列表:配置 Apache HTTP Web 服务器
- 列表:在非标准配置中为 Apache HTTP 服务器自定义 SELinux 策略
- 命令/配置摘录:
Apache/2.4.37 (Red Hat Enterprise Linux) MyMod/1.2
Apache/2.4.37 (Red Hat Enterprise Linux) (Release 41.module+el8.5.0+11772+c8e0c271)- 注意:重要 不要删除 IncludesNoExec 指令。默认情况下,Server Side Includes (SSI)模块无法运行命令。更改这个设置可让攻击者在系统中输入命令。
8.5.2. nginx 服务器配置强化
- 要点:通过调整安全选项来强化 Nginx HTTP 和代理服务器配置。这有助于保护您的系统免受常见 Web 应用程序漏洞的影响。
- 要点:配置以下安全选项以防止常见的 Web 应用程序漏洞:
- 列表:要禁用版本字符串,修改 server_tokens 配置选项: server_tokens off; 这个选项将停止显示其他详细信息,如服务器版本号。此配置仅显示 Nginx 提供的所有请求中的服务器名称,例如: $ curl -sI http://localhost | grep Server Server: nginx
- 列表:在服务器或位置块中添加安全标头(在 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d configured.conf 文件中): 例如,X-Frame-Options 标头选项拒绝您的域之外的任何页面来帧由 Nginx 提供的任何内容,缓解了攻击: add_header X-Frame-Options "SAMEORIGIN"; 例如,x-content-type 标头在某些较旧的浏览器中可以防止 MIME-type sniffing: add_header X-Content-Type-Options nosniff; 例如,X-XSS-Protection 标头启用跨站点脚本过滤(XSS)过滤…
- 列表:例如,X-Frame-Options 标头选项拒绝您的域之外的任何页面来帧由 Nginx 提供的任何内容,缓解了攻击: add_header X-Frame-Options "SAMEORIGIN";
- 列表:例如,x-content-type 标头在某些较旧的浏览器中可以防止 MIME-type sniffing: add_header X-Content-Type-Options nosniff;
- 列表:例如,X-XSS-Protection 标头启用跨站点脚本过滤(XSS)过滤,这可防止浏览器渲染由 Nginx 中包含的潜在的恶意内容: add_header X-XSS-Protection "1; mode=block";
- 列表:您可以限制公开的服务,并限制它们对访问者执行的操作,例如: limit_except GET { allow 192.168.1.0/32; deny all; } 该片段将限制对除 GET 和 HEAD 外的所有方法的访问。
- 命令/配置摘录:
server_tokens off;
$ curl -sI http://localhost | grep Server Server: nginx8.6. 通过限制对经过身份验证的用户的访问来保护 PostgreSQL
- 要点:通过配置客户端身份验证来保护 PostgreSQL 数据库。限制对经过身份验证的用户的访问权限。这可减少未经授权的访问和攻击风险。
- 要点:PostgreSQL 是一个对象相关数据库管理系统(DBMS)。postgresql-server 软件包在 Red Hat Enterprise Linux 中提供 PostgreSQL。
- 列表:安装 PostgreSQL: # dnf install postgresql-server
- 列表:使用以下选项之一初始化数据库存储区域: 使用 initdb 工具: $ initdb -D /home/postgresql/db1/ 此目录包含所有数据库数据。它还包含客户端身份验证配置文件。 使用 postgresql-setup 脚本: $ postgresql-setup --initdb 默认情况下,该脚本使用 /var/lib/pgsql/data/ 目录。此脚本可帮助进行基本的数据库集群管理。
- 列表:使用 initdb 工具: $ initdb -D /home/postgresql/db1/ 此目录包含所有数据库数据。它还包含客户端身份验证配置文件。
- 列表:使用 postgresql-setup 脚本: $ postgresql-setup --initdb 默认情况下,该脚本使用 /var/lib/pgsql/data/ 目录。此脚本可帮助进行基本的数据库集群管理。
- 列表:在 pg_hba.conf 文件中配置本地身份验证。默认情况下,该文件包含: local all all trust 此 信任 身份验证允许任何本地用户访问任何数据库。要要求身份验证,请将 信任 更改为其他方法。使用 peer 根据系统用户名进行身份验证。使用 md5 进行密码验证: local all all peer 您可以完全禁用本地套接字连接。如果您使用分层应用程序创建没有对应本地用户的数据库用户的层次应用程序,请删除 local 行条目。
- 列表:重启数据库以应用更改: # systemctl restart postgresql 此命令更新数据库。它还验证配置文件的语法。
- 命令/配置摘录:
# dnf install postgresql-server
$ initdb -D /home/postgresql/db1/8.7. 保护 Memcached 服务
- 要点:保护 Memcached 缓存服务免受拒绝服务(DoS)攻击和未授权的访问。将其配置为仅接受本地流量。启用用户身份验证。这可防止 DDoS 扩展。只有授权的客户端才能访问存储的数据。
- 要点:Memcached 是一个开源、高性能分布式内存对象缓存系统。它通过降低数据库负载来提高动态 Web 应用程序的性能。
8.7.1. Memcached 强化针对 DDoS 攻击
- 要点:强化 Memcached 免受分布式拒绝服务(DDoS)攻击,以防止攻击者克服服务。
- 要点:根据您的配置执行这些步骤:
- 列表:限制访问本地网络。配置防火墙以阻止外部流量。删除默认端口 11211 : # firewall-cmd --remove-port=11211/udp # firewall-cmd --runtime-to-permanent
- 列表:将 Memcached 限制为本地连接。编辑 /etc/sysconfig/memcached 中的 OPTIONS 值: OPTIONS="-l 127.0.0.1,::1"
- 列表:启用简单验证和安全层(SASL)身份验证: 创建 /etc/sasl2/memcached.conf 并设置 SASL 数据库路径: sasldb_path: /path.to/memcached.sasldb 在 SASL 数据库中添加帐户: # saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb 为 memcached 用户和组设置权限: # chown memcached:memcached /path.to/memcached.sasldb 启用 SASL 支持。Add -S to OPTIONS in /etc/sysconfig/memc…
- 列表:创建 /etc/sasl2/memcached.conf 并设置 SASL 数据库路径: sasldb_path: /path.to/memcached.sasldb
- 列表:在 SASL 数据库中添加帐户: # saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
- 列表:为 memcached 用户和组设置权限: # chown memcached:memcached /path.to/memcached.sasldb
- 命令/配置摘录:
# firewall-cmd --remove-port=11211/udp # firewall-cmd --runtime-to-permanent
OPTIONS="-l 127.0.0.1,::1"8.8. 保护 Postfix 服务
- 要点:通过将其配置为使用加密并应用降低不同攻击风险的设置,保护 Postfix 邮件传输代理。这包括使用 SASL 和设置限制来配置 SMTP 身份验证(AUTH),以减少漏洞到拒绝服务(DoS)攻击。
- 要点:Postfix 是邮件传输代理(MTA),其使用简单邮件传输协议(SMTP)在其他 MTA 之间发送电子邮件,并将电子邮件发送给客户端或传输代理。虽然 MTA 可以加密彼此之间的流量,但默认情况下可能不会这样做。
8.8.1. 减少 Postfix 网络相关的安全风险
- 要点:通过调整配置选项来限制访问,降低与网络相关的 Postfix 安全风险。
- 要点:要降低攻击者通过网络破坏您的系统的风险,请尽可能执行尽可能多的任务:
- 列表:不要在网络文件系统(NFS)卷上共享 /var/spool/postfix/ 邮件假脱机目录。NFSv2 和 NFSv3 不维护对用户和组 ID 的控制,允许具有相同 UID 的用户接收和读取彼此的邮件。使用 Kerberos 的 NFSv4 没有这个限制,因为 SECRPC_GSS 内核模块不使用基于 UID 的身份验证。但是,避免将邮件假脱机目录放在 NFS 卷上,以减少安全风险。
- 列表:要求邮件用户仅使用电子邮件程序访问 Postfix。不允许邮件服务器上的 shell 帐户。将 /etc/passwd 文件中的所有用户 shell 设置为 /sbin/nologin,但可能例外是 root 用户。这可防止用户直接访问邮件服务器并减少攻击面。
- 列表:为了防止 Postfix 免受网络攻击,默认配置为仅侦听本地回环地址。您可以通过查看 /etc/postfix/main.cf 文件中的 inet_interfaces = localhost 行来验证这一点。这样可确保 Postfix 仅接受来自本地系统而不是来自网络的邮件(如 cron 作业报告)。这是默认设置,保护 Postfix 免受网络攻击。要删除 localhost 限制并允许 Postfix 侦听所有接口,请将 /etc/postfix/main.cf 中的 inet_interfaces 参数设为 all。
8.8.2. 用于限制 DoS 攻击的 Postfix 配置选项
- 要点:您可以通过配置某些 Postfix 选项来限制拒绝服务(DoS)攻击。这涉及设置严格的速率和消息大小限制,以防止服务器被大量流量。
- 要点:攻击者可以用流量填充服务器,或发送触发崩溃的信息,从而导致拒绝服务(DoS)攻击。您可以通过在 /etc/postfix/main.cf 文件中设置限制来配置系统,以降低此类攻击的风险。您可以更改现有指令的值,或者您可以使用 <directive> = < value> 格式的自定义值 添加新指令。
8.8.3. 将 Postfix 配置为使用 SASL
- 要点:您可以将 Postfix 邮件传输代理配置为使用简单身份验证和安全层(SASL)。这增强了在发送和接收电子消息时的身份验证。
- 要点:Postfix 支持基于 SASL 的 SMTP 身份验证(AUTH)。SMTP AUTH 是简单邮件传输协议的扩展。目前,Postfix SMTP 服务器通过以下方式支持 SASL 实现:
- 列表:dovecot 软件包已安装在系统上
- 列表:配置 Dovecot: 在 /etc/dovecot/conf.d/10-master.conf 文件中包括以下行: service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } } 前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于 /var/spool/postfix/ 目录中的邮件队列,以及在 postfix 用户和组下运行的应用程序。 可选:将 Dovecot…
- 列表:在 /etc/dovecot/conf.d/10-master.conf 文件中包括以下行: service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } } 前面的示例对 Postfix 和 Dovecot 之间的通信使用 UNIX-域套接字。该示例还假定默认的 Postfix SMTP 服务器设置,其包括位于 /var/spool/postfix/ 目录中的邮件队列,以及在 postfix 用户和组下运行的应用程序。
- 列表:可选:将 Dovecot 配置为通过 TCP 侦听 Postfix 验证请求: service auth { inet_listener { port = <port_number> } }
- 列表:通过编辑 /etc/dovecot/conf.d/10-auth.conf 文件中的 auth_mechanisms 参数来指定电子邮件客户端用来使用 Dovecot 进行身份验证的方法: auth_mechanisms = plain login auth_mechanisms 参数支持不同的纯文本和非纯文本身份验证方法。
- 列表:通过修改 /etc/postfix/main.cf 文件来配置 Postfix: 在 Postfix SMTP 服务器上启用 SMTP 身份验证: smtpd_sasl_auth_enable = yes 为 SMTP 身份验证启用 Dovecot SASL 实现: smtpd_sasl_type = dovecot 提供相对于 Postfix 队列目录的身份验证路径。请注意,使用相对路径可确保无论 Postfix 服务器是否以 chroot 运行,配置都可以正常工作: smtpd_sasl_path = private/auth 此步骤使用 UNIX-域套接字在 Postfix 和 Dovecot 之间进行通信。 如果您使用 T…
- 命令/配置摘录:
service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }
service auth { inet_listener { port = <port_number> } }完整目录
- 配置安全网络和网络通信
- 对红帽文档提供反馈
- 第 1 章 使用 OpenSSH 的两个系统间使用安全通讯
- 1.1. SSH 和 OpenSSH
- 1.2. 生成 SSH 密钥对
- 1.3. 将基于密钥的身份验证设置为 OpenSSH 服务器的唯一方法
- 1.4. 通过保存在智能卡上的 SSH 密钥进行身份验证
- 1.5. 使 OpenSSH 更安全
- 1.5.1. 创建并强制实施更强大的 SSH 密钥类型
- 1.5.2. 在 OpenSSH 服务器中自定义允许的加密
- 1.5.3. 为 SSH 设置非默认端口
- 1.5.4. 仅针对特定用户、组或 IP 范围进行 SSH 访问
- 1.5.5. x Security extension
- 1.5.6. 其他资源
- 1.6. 通过 SSH 跳板机连接到远程服务器
- 1.7. 使用 RHEL 系统角色配置 OpenSSH 服务器和客户端
- 1.7.1. sshd RHEL 系统角色如何将 playbook 中的设置映射到配置文件
- 1.7.2. 使用 sshd RHEL 系统角色配置 OpenSSH 服务器
- 1.7.3. 对非独占配置使用 sshd RHEL 系统角色
- 1.7.4. 使用 sshd RHEL 系统角色覆盖 SSH 服务器上的系统范围的加密策略
- 1.7.5. ssh RHEL 系统角色如何将 playbook 中的设置映射到配置文件
- 1.7.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端
- 1.8. 其他资源
- 第 2 章 创建并管理 TLS 密钥和证书
- 2.1. TLS 证书
- 2.2. OpenSSL 中的 post-quantum 加密算法
- 2.3. 使用 OpenSSL 创建一个私有 CA
- 2.4. 使用 OpenSSL 为 TLS 服务器证书创建私钥和 CSR
- 2.5. 使用 OpenSSL 为 TLS 客户端证书创建私钥和 CSR
- 2.6. 使用私有 CA 使用 OpenSSL 为 CSR 发布证书
- 2.7. 使用 GnuTLS 创建私有 CA
- 2.8. 使用 GnuTLS 为 TLS 服务器证书创建私钥和 CSR
- 2.9. 使用 GnuTLS 为 TLS 客户端证书创建私钥和 CSR
- 2.10. 使用私有 CA ,使用 GnuTLS 为 CSR 发布证书
- 第 3 章 使用共享的系统证书
- 3.1. 系统范围的信任存储
- 3.2. 将新证书添加到系统范围的 truststore 中
- 3.3. 使用 trust 命令信任的系统证书管理
- 第 4 章 计划并使用 TLS
- 4.1. SSL 和 TLS 协议
- 4.2. 在 RHEL 10 中对 TLS 的安全注意事项
- 4.2.1. 协议
- 4.2.2. 密码套件
- 4.2.3. 公钥长度
- 4.3. 应用程序中的 TLS 配置强化
- 4.3.1. Apache HTTP 服务器的 TLS 配置
- 4.3.2. Nginx HTTP 和代理服务器的 TLS 配置
- 4.3.3. Dovecot 邮件服务器的 TLS 配置
- 第 5 章 使用加密 DNS (eDNS)保护系统 DNS 流量.
- 5.1. RHEL 中 eDNS 的组件概述
- 5.1.1. EDNS 解析过程和核心交互
- 5.2. 从本地安装介质安装启用了 eDNS 的 RHEL
- 5.3. 使用自定义的可引导 ISO 安装启用了 eDNS 的 RHEL
- 5.4. 在现有 RHEL 安装上启用 eDNS
- 5.5. DNS 配置的内核参数
- 5.6. 其他资源
- 5.1. RHEL 中 eDNS 的组件概述
- 第 6 章 设置 IPsec VPN
- 6.1. IPsec VPN 中的组件
- 6.2. Libreswan 身份验证方法
- 6.3. 手动配置具有原始 RSA 密钥身份验证的 IPsec 主机到主机的 VPN
- 6.4. 手动配置具有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN
- 6.5. 手动配置具有基于证书身份验证的 IPsec 主机到站点 VPN
- 6.5.1. 手动设置 IPsec 网关
- 6.5.2. 使用 GNOME 设置将客户端配置为连接到 IPsec VPN 网关
- 6.6. 手动配置具有基于证书的身份验证的 IPsec 网格 VPN
- 6.7. 使用密码保护 IPsec NSS 数据库
- 6.8. 在启用了 FIPS 模式的系统上使用 IPsec
- 6.9. 为 IPsec VPN 连接配置 TCP 回退
- 6.10. 在 Libreswan 中启用旧的密码和算法
- 6.11. 将 VPN 连接分配给专用的路由表,以防止连接绕过隧道
- 6.12. 使用 RHEL 系统角色配置 IPsec VPN 连接
- 6.12.1. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN
- 6.12.2. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 主机到主机的 VPN ,并将数据和控制平面分开
- 6.12.3. 使用 vpn RHEL 系统角色配置具有 PSK 身份验证的 IPsec 站点到站点 VPN
- 6.12.4. 使用 vpn RHEL 系统角色配置带有基于证书身份验证的 IPsec 网格 VPN
- 6.13. 使用 nmstatectl 配置 IPsec VPN 连接
- 6.13.1. 使用 nmstatectl,配置具有原始 RSA 密钥身份验证的 IPsec 主机到主机的 VPN
- 6.13.2. 使用 nmstatectl 配置具有原始 RSA 密钥身份验证的 IPsec 站点到站点 VPN
- 6.13.3. 使用 nmstatectl 将客户端配置为连接到 IPsec VPN 网关
- 6.14. IPsec 配置故障排除
- 6.14.1. 基本连接问题
- 6.14.2. 与防火墙相关的问题
- 6.14.3. 不匹配的配置
- 6.14.4. MTU 问题
- 6.14.5. NAT 冲突
- 6.14.6. 内核级 IPsec 问题
- 6.14.7. 内核 IPsec 子系统错误
- 6.14.8. 显示 Libreswan 日志
- 第 7 章 使用 MACsec 加密同一物理网络中的第 2 层流量
- 7.1. MACsec 如何提高安全性
- 7.2. 使用 nmcli 配置 MACsec 连接
- 7.3. 使用 nmstatectl 配置 MACsec 连接
- 第 8 章 保护网络服务
- 8.1. 保护 rpcbind 服务
- 8.2. 保护 rpc.mountd 服务
- 8.3. 保护 NFS 服务
- 8.3.1. 保护 NFS 服务器的导出选项
- 8.3.2. 保护 NFS 客户端的挂载选项
- 8.3.3. 使用防火墙保护 NFS
- 8.4. 保护 FTP 服务
- 8.4.1. 保护 FTP 的问候横幅
- 8.4.2. 在 FTP 中配置仅写匿名上传
- 8.4.3. FTP 用户帐户的安全提示
- 8.5. 保护 HTTP 服务器
- 8.5.1. httpd.conf 中的安全增强
- 8.5.2. nginx 服务器配置强化
- 8.6. 通过限制对经过身份验证的用户的访问来保护 PostgreSQL
- 8.7. 保护 Memcached 服务
- 8.7.1. Memcached 强化针对 DDoS 攻击
- 8.8. 保护 Postfix 服务
- 8.8.1. 减少 Postfix 网络相关的安全风险
- 8.8.2. 用于限制 DoS 攻击的 Postfix 配置选项
- 8.8.3. 将 Postfix 配置为使用 SASL
