[ MQ 9.4.4 2025 年 10 月][Linux]

DR/HA RDQM 的安全复制

您可以指定 DR/HA RDQM 配置中的复制链接使用 TLS 加密。

在 DR/HA RDQM 配置中创建队列管理器时,可以指定用于在 HA 组中的队列管理器实例之间复制数据的链接使用 TLS 保护。 您还可以指定用于在两个 HA 配置之间复制数据的链接使用 TLS 加密。 您可以选择确保 HA 或 DR 复制链接的安全,也可以同时确保两者的安全。

要配置安全复制,请完成以下步骤:
  1. 配置所需的证书。
  2. 配置 tlshd 服务。
  3. 使用 crtmqm 创建新队列管理器时,指定 -re-reh-red 选项。
每个节点完成一次前两个步骤。 节点上所有配置为使用安全复制链接的 RDQM 队列管理器都共享证书和 tlshd 配置。

RDQM 安全复制链路可使用的 TLS 协议和密码套件由活动的全系统加密策略控制。 使用 Linux® update-crypto-policies 命令更改当前活动策略。

配置证书

您必须配置复制链接使用的证书。 您为每个节点创建的证书可用于任何复制链接。 如果使用安全复制链接的节点上有多个 RDQM 队列管理器,则使用相同的证书。

要在 RDQM DR/HA 配置中使用安全复制链接,需要六张证书,RDQM DR/HA 组中每个节点一张证书。

要配置证书,请为 RDQM 配置中的每个节点完成以下步骤:
  1. 使用以下命令生成私钥:
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out key_file
    其中 key_file 是为存储私钥而创建的文件名。
  2. 创建证书签名请求。
    在 RDQM DR/HA 配置中,创建的证书必须满足以下要求:
    • 证书通用名 (CN) 必须设置为 RDQM 节点的主机名。
    • 证书主题备选名称 (SAN) 必须包含 RDQM 节点的主机名和组 DNS 名称。 组 DNS 名称默认值为 encrypted.remote。 如果需要,可以指定不同的组 DNS 名称。

      两个 HA 组可以使用相同的组 DNS 名称,也可以为每个 HA 组指定不同的名称。

      HA 组中的每个节点都必须使用 SAN 中具有相同组 DNS 名称的证书。

      如果在创建证书时不使用 SAN 中 encrypted.remote 的默认值,则必须在创建队列管理器时使用 crtmqm 命令中的 -san 参数为本地和远程 HA 组指定组 DNS 名称。

    使用以下命令创建证书签名请求:
    openssl req -key key_file -subj "/CN=hostname"
                -addext "subjectAltName = DNS:hostname,DNS:group_dns_name"
                -new -out cert_req_file
    其中:
    • key_file 是包含在步骤 1 中创建的私人密钥的文件。
    • hostname 是节点的主机名。
    • group_dns_name 是组 DNS 名称。 要使用组 DNS 名称的默认值,请指定 encrypted.remote
    • cert_req_file 是为存储证书签名请求而创建的文件。
  3. 向证书颁发机构(CA)发送证书签署请求,以便签署。 从 CA 收到签名证书后,将私钥、签名证书和 CA 证书文件复制到要存储这些文件的目录。 例如, /etc/drbd.d/ 目录。
  4. 设置私钥和证书文件的文件权限和所有权,确保只有根用户才能查看私钥。
    • 将私钥和证书文件的所有权更改为根用户。
    • 设置私钥文件的权限,只有 root 用户才有读写权限。
下面的示例脚本创建了一个内部证书颁发机构和三个证书,供 RDQM DR/HA 配置使用。
重要提示: 本例不适合用于生产环境,仅作为快速设置测试环境的示例。 对于高级用户来说,证书管理是一个复杂的问题。 在生产过程中,你必须考虑旋转、撤销、密钥长度等问题。
在主 HA 组中的一个节点上运行以下脚本:
#!/bin/bash

# The CA name
ca_name="RDQM Test CA"

# The CA filename
ca_filename="rdqm_test_ca"

# Host certificates to generate
test_hosts=("alice" "bob" "charlie")

mkdir certificates && cd ./certificates

# Create private key for use with private CA using OpenSSL
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
-out $ca_filename.key

# Create a private CA certificate using OpenSSL
openssl req -key $ca_filename.key -new -x509 -days 3650 -subj "/CN=$ca_name" \
-out $ca_filename.crt

# Create certificates for each node
for host in ${test_hosts[@]}; do

    # Create a private key
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
    -out $host.key

    # Generate a CSR
    openssl req -key $host.key -subj "/CN=$host"  \
    -addext "subjectAltName = DNS:$host,DNS:encrypted.remote" \
    -new -out $host.csr

    # Create a valid certificate signed by the private CA
    openssl x509 -req -in $host.csr -CA $ca_filename.crt \
    -copy_extensions copyall -CAkey $ca_filename.key -CAcreateserial \
    -days 365 -out $host.crt

    # Remove sequential serial number
    rm -f $ca_filename.srl

    # Remove CSR
    rm -f $host.csr

done

在辅助 HA 组中的一个节点上运行相同的脚本,指定该组中三个节点的主机名。

示例在主组中节点的 certificates 目录下生成了以下文件:
  • rdqm_test_ca.crt
  • rdqm_test_ca.key
  • alice.crt
  • alice.csr
  • alice.key
  • bob.crt
  • bob.csr
  • bob.key
  • charlie.crt
  • charlie.csr
  • charlie.key

如果二级组中的主机名为 william、joey 和 kayser,那么二级组中节点的 certificates 目录中将生成以下文件:

  • rdqm_test_ca.crt
  • rdqm_test_ca.key
  • william.crt
  • william.csr
  • william.key
  • joey.crt
  • joey.csr
  • joey.key
  • kayser.crt
  • kayser.csr
  • kayser.key
完成以下步骤即可部署证书:
  1. 将 CA 证书 (rdqm_test_ca.crt) 复制到每个节点的 /etc/drbd.d/ 目录。 (这些是示例路径,您可以根据需要选择其他位置)
  2. 将每个节点的证书(.crt 文件)和私钥(.key 文件)复制到 /etc/drbd.d/。 (这些是示例路径,您可以根据需要选择其他位置)
  3. 更改每个节点上私钥和证书的文件权限和所有权。 这样可以确保只有根用户才能查看私钥的内容:
    chmod 600 /etc/drbd.d/*.key
    chown root:root /etc/drbd.d/*.key 
    chown root:root /etc/drbd.d/*.crt
  4. 将证书颁发机构的私人密钥存放在安全的地方。

配置 tlshd 服务

在完成任何 DRBD TLS 握手之前,需要先配置 tlshd 服务,然后启用并启动它。 tlshd 服务与 drbd-utils-9 软件包一起安装。

该服务的配置文件为 /etc/tlshd.conf ,初始内容为

[debug]
loglevel=0
tls=0
nl=0

[authenticate]
#keyrings= <keyring>;<keyring>;<keyring>

[authenticate.client]
#x509.truststore= <pathname>
#x509.certificate= <pathname>
#x509.private_key= <pathname>

[authenticate.server]
#x509.truststore= <pathname>
#x509.certificate= <pathname>
#x509.private_key= <pathname>
在启用和启动 tlshd 服务之前,必须在 authenticate.clientauthenticate.server 部分为以下属性指定值(DRBD 可以在任一方向上建立连接,除非防火墙阻止了其中一个方向):
x509.truststore
RDQM 节点所使用证书的 CA 证书文件路径。 如果需要复杂的信任链,则必须将其记录在一个文件中。
x509.certificate
包含 RDQM 节点 CA 签名证书的文件路径。
x509.private_key
包含 RDQM 节点私钥的文件路径。 文件的所有者必须是 root 用户,读/写权限必须只授予 root 用户。
这些属性中指定的路径必须全部标识本地文件。
您还可以选择指定证书吊销列表(CRL)。 您必须在 authenticate.clientauthenticate.server 两个部分中设置此项:
x509.crl
文件路径,该文件包含 PEM 编码的证书吊销列表 (CRL),在每次握手过程中用于验证证书的吊销状态。 如果未指定该选项,则跳过 CRL 检查。
如果使用 " 配置证书 "中的示例脚本创建了证书,那么服务器 alice 的配置文件如下:
[authenticate.client]
x509.truststore=/etc/drbd.d/rdqm_test_ca.crt
x509.certificate=/etc/drbd.d/alice.crt
x509.private_key=/etc/drbd.d/alice.key

[authenticate.server]
x509.truststore=/etc/drbd.d/rdqm_test_ca.crt
x509.certificate=/etc/drbd.d/alice.crt
x509.private_key=/etc/drbd.d/alice.key
首次启用服务前,请输入以下命令:
systemctl daemon-reload
要启动 tlshd 服务,请输入以下命令:
systemctl enable --now tlshd

创建 DR/HA RDQM

使用带有 -re 选项的 crtmqm 命令创建 DR/HA 队列管理器,该队列管理器具有安全的 HA 和 DR 复制链接,例如,主组中的主实例:
crtmqm -sx -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -re <DRHAQueueManagerName>
在主组中的每个其他节点上运行以下命令,以创建辅助实例:
crtmqm -sxs -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -re <DRHAQueueManagerName>
使用以下命令在辅助组中创建主实例:
crtmqm -sx -rr s -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -re <DRHAQueueManagerName>
在辅助组中的每个其他节点上运行以下命令以创建辅助实例:
crtmqm -sxs -rr s -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -re <DRHAQueueManagerName>
要只保护组中的 HA 复制链接,请在命令中指定 -reh 选项。 例如:
crtmqm -sx -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -reh <DRHAQueueManagerName>
要只确保组之间 DR 复制链接的安全,请在命令中指定 -red 选项。 例如:
crtmqm -sx -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -red <DRHAQueueManagerName>
前面的示例假定,在需要安全灾难恢复复制链路时,已为每个节点创建了证书,证书 SAN 中组 DNS 名称的默认值为 encrypted.remote 。 如果使用不同的值创建证书,则必须在使用 -san 选项创建队列管理器时指定该值。 例如:
crtmqm -sx -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -red -san <customSubjectAltName> <DRHAQueueManagerName>
如果在两个组的证书中使用了相同的组 DNS 名称,则在创建 DR/HA RDQM 配置的所有 crtmqm 命令中使用 -san <customSubjectAltName> 选项指定该值。
如果在每个 HA 组的证书中使用了不同的组 DNS 名称,那么在每个组中创建队列管理器时,请在主 HA 组和辅助 HA 组的证书中以逗号分隔的值指定组 DNS 名称。 以下命令将在主 HA 组中创建主队列管理器:
crtmqm -sx -rr p -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -red -san <primarySubjectAltName>,<secondarySubjectAltName> <DRHAQueueManagerName>
以下命令将在辅助 HA 组上创建主队列管理器:
crtmqm -sx -rr s -rl <Local_IPs> -ri <Recovery_IPs> -rp <DRPort> -red -san <secondarySubjectAltName>,<primarySubjectAltName> <DRHAQueueManagerName>
(在这些示例中,您可以指定 -re-red 选项)

使用 rdqmstatus 命令确认复制链接已使用 TLS 加密。 有关更多信息,请参阅查看 DR/HA RDQM 和 HA 组状态

有关创建 DR/HA RDQM 的更多信息,请参阅创建 DR/HA RDQM