31.4. 使用 vpn RHEL 系统角色使用基于证书的身份验证配置 IPsec 网格 VPN
IPsec 网格会创建一个完全互连的网络,每个服务器都可以与所有其他服务器安全通信。这是涵盖多个数据中心或云供应商的分布式数据库集群或高可用性环境的理想选择。在每对服务器之间建立直接的加密隧道可确保安全通信,而无需中央瓶颈。
为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。网格中的每个主机都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。
通过使用 vpn
RHEL 系统角色,您可以使用受管节点中的基于证书的身份验证自动配置 VPN 网格。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 您可以为每个受管节点准备一个 PKCSautomationhub 文件:
每个文件包含:
- 服务器的私钥
- 服务器证书
- CA 证书
- 如果需要,则中间证书
-
这些文件名为 <
managed_node_name_as_in_the_inventory>.p12
。 - 文件存储在与 playbook 相同的目录中。
服务器证书包含以下字段:
-
扩展的密钥使用(EKU)设置为
TLS Web 服务器身份验证
。 - 通用名称(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.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
cert_name
变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将您的敏感变量存储在一个加密文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ 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
- 启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
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
,如 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.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在网格的一个节点中,ping 另一个节点激活连接:
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认连接处于活跃状态:
ipsec trafficstatus
[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