TLS

概述

可以通过 tls 插件接口为内部 Slurm 集群通信启用 TLS。

s2n

tls/s2n 插件使用亚马逊的 TLS 实现 s2n-tls,这是一个 C99 的 TLS/SSL 协议实现,旨在简单、小巧、快速,并将安全性作为优先考虑。

安装

从他们的公共 GitHub 仓库构建 s2n-tls:

git clone https://github.com/aws/s2n-tls.git
cd s2n-tls/
cmake . -B build/ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
cmake --build build/ -j $(nproc)
cmake --install build/

请注意,cmake -DBUILD_SHARED_LIBS=ON 标志 是构建 Slurm 使用的 libs2n.so 共享对象所必需的。

请遵循 s2n-tls 构建文档以获取有关不同可能设置的进一步指导。

设置

要为内部 Slurm 集群通信启用 TLS,请在 slurm.conf 和 slurmdbd.conf 中配置 TLSType 选项以使用 tls/s2n 插件。

所有 Slurm 组件都需要访问一个公共 CA 证书。 slurmctld、slurmdbd 和 slurmrestd 需要拥有各自独特的证书/密钥对。这些证书必须链到指定的 CA 证书。请注意,这些证书/密钥对只需由各自的守护进程访问。只有 CA 证书文件需要 由 Slurm 组件访问。

slurmd 和 sackd 也可以拥有静态预定义的证书/密钥对,或者它们 可以选择使用 certmgr 插件接口动态 检索和更新其证书/密钥对。如果未配置 certmgr 插件接口,则需要有一个静态 预定义的证书/密钥对。有关更多信息,请参见 TLS 证书管理 页面。

以下是默认的证书/密钥 PEM 文件名列表,预期在 Slurm 的默认 etc 目录中。可以通过 TLSParameters 为每个文件设置不同的绝对文件路径。

  • ca_cert.pem
  • ctld_cert.pem
  • ctld_cert_key.pem
  • dbd_cert.pem
  • dbd_cert_key.pem
  • restd_cert.pem
  • restd_cert_key.pem
  • sackd_cert.pem
  • sackd_cert_key.pem
  • slurmd_cert.pem
  • slurmd_cert_key.pem

在某些情况下(例如步骤 IO、等待步骤分配等),某些客户端 命令需要创建监听套接字服务器。为了让其他 Slurm 组件连接到这些监听套接字,它们需要一个可以信任的 TLS 证书。客户端命令通过临时生成 自签名证书,使用 certgen 插件接口,并 在预先建立的 TLS 连接中安全共享这些证书。

默认情况下,certgen 插件不需要配置,将 使用 openssl cli 生成自签名证书/密钥对。可以 选择配置使用不同的脚本生成该对,通过 CertgenParameters

配置 tls/s2n 插件和证书后, 可以在守护进程日志中看到以下调试日志:

debug:  tls/s2n: init: tls/s2n loaded
请注意,当未配置 tls/s2n 时,将始终看到这一行:
debug:  tls/none: init: tls/none loaded

配置了 DebugFlags=TLS 后,可以在日志中看到 RPC 连接的极其详细的视图。例如,以下是 slurmctld 和 slurmdbd 之间连接的内容:

slurmctld: tls/s2n: tls_p_create_conn: TLS: tls/s2n: cipher suite:TLS_AES_128_GCM_SHA256, {0x13,0x01}. fd:17.
slurmctld: tls/s2n: tls_p_create_conn: TLS: tls/s2n: connection successfully created. fd:17. tls mode:client
slurmdbd: tls/s2n: tls_p_create_conn: TLS: tls/s2n: cipher suite:TLS_AES_128_GCM_SHA256, {0x13,0x01}. fd:13.
slurmdbd: tls/s2n: tls_p_create_conn: TLS: tls/s2n: connection successfully created. fd:13. tls mode:server

OpenSSL 示例

以下是一些如何生成 tls/s2n 插件所需的证书密钥/对的示例。这些示例不适合在 生产环境中使用。

生成自签名 CA 证书密钥对:

openssl ecparam -out ca_key.pem -name prime256v1 -genkey
chmod 0400 ca_key.pem
openssl req -x509 -key ca_key.pem -out ca_cert.pem -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=my_slurm_ca"
chmod 0444 ca_cert.pem

从 CA 证书生成签名证书:

openssl ecparam -out ctld_key.pem -name prime256v1 -genkey
chmod 0400 ctld_key.pem # 确保密钥的所有权与运行守护进程的用户匹配
openssl req -new -key ctld_key.pem -out ctld_csr.pem -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=ctld"
openssl x509 -req -in ctld_csr.pem -CA ca_cert.pem -CAkey ca_key.pem -out ctld_cert.pem -sha384
chmod 0444 ctld_cert.pem

最后修改于 2025 年 6 月 09 日