TLS 证书管理器

概述

certmgr 插件接口可以与 tls 插件接口一起使用,以动态创建和更新 slurmd/sackd 节点的签名证书。

certmgr/script

certmgr/script 插件允许使用脚本执行验证节点身份和生成签名证书所需的操作。

OpenSSL 示例

这是一个使用 openssl 命令行工具生成证书签名请求并签署这些请求以创建签名证书的示例。此示例不适用于生产环境,仅用于展示每个脚本的预期职责。

在此示例中,有一系列需要在每台机器上预加载的内容,以便 Slurm 可以进行证书管理。请注意,任何针对 slurmd 的指令也适用于 sackd 节点。

slurmctld 需要访问 CA 证书,并且 CA 证书/密钥对必须由 SlurmUser 拥有(在生产环境中不推荐这样做)。有关如何生成此证书/密钥对的更多信息,请参见 TLS 页面。

需要创建和配置以下脚本。 有关每个脚本的更多详细信息,请参见 CertmgrParameters

  • get_node_token_script
  • generate_csr_script
  • validate_node_script
  • sign_csr_script

slurmctld 需要能够验证 slurmd 的证书签名请求。这是通过在 slurmd 节点上使用 get_node_token_script 检索的唯一令牌来完成的,并在 slurmctld 主机上使用 validate_node_script 进行验证。

每个 slurmd 将生成一个唯一的令牌。每个令牌将存储在其各自的 slurmd 主机上,以及在包含 slurmctld 主机上所有节点令牌的综合列表中。此令牌将从 slurmd 发送到 slurmctld,连同 slurmd 在运行时生成的证书签名请求,并在 slurmctld 创建签名证书之前由 slurmctld 进行验证。请注意,slurmd 在加载签名证书之前不会开始处理任何 RPC。

这是一个简单的示例,说明如何生成和存储这些令牌:
# 生成 base64 32 字符随机令牌
base64 /dev/urandom | head -c 32 > ${NODENAME}_token.txt

# 将令牌添加到令牌列表
echo "`cat ${NODENAME}_token.txt`" >> node_token_list.txt

节点 n1 需要使用 n1_token.txt 启动,和/或安全地将其传输到该节点。slurmctld 需要安全访问 node_token_list.txt 以便使用 validate_node_script 验证节点令牌。

get_node_token_scriptgenerate_csr_scriptget_node_cert_key_script 的路径需要指向在 slurmd 节点上存在并可执行的脚本。

get_node_token_script 示例:

将令牌打印到标准输出。成功时返回零退出代码,错误时返回非零退出代码。

#!/bin/bash

# Slurm 节点名称作为参数 $1 传入
TOKEN_PATH=/etc/slurm/certmgr/$1_token.txt

# 检查令牌文件是否存在
if [ ! -f $TOKEN_PATH ]
then
    echo "$BASH_SOURCE: 无法解析令牌路径 '$TOKEN_PATH'"
    exit 1
fi

# 将令牌打印到标准输出
cat $TOKEN_PATH

# 以退出代码 0 退出以表示成功
exit 0

generate_csr_script 示例:

将证书签名请求打印到标准输出。成功时返回零退出代码,错误时返回非零退出代码。

#!/bin/bash

# Slurm 节点名称作为参数 $1 传入
NODE_PRIVATE_KEY=/etc/slurm/certmgr/$1_private_key.pem

# 检查节点私钥文件是否存在
if [ ! -f $NODE_PRIVATE_KEY ]
then
    echo "$BASH_SOURCE: 无法解析节点私钥路径 '$NODE_PRIVATE_KEY'"
    exit 1
fi

# 使用节点私钥生成 CSR 并将 CSR 打印到标准输出
openssl req -new -key $NODE_PRIVATE_KEY \
    -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=$1"

# 检查 openssl 的退出代码
if [ $? -ne 0 ]
then
    echo "$BASH_SOURCE: 生成 CSR 失败"
    exit 1
fi

# 以退出代码 0 退出以表示成功
exit 0

get_node_cert_key_script 示例:

将用于生成 CSR 的私钥打印到标准输出。成功时返回零退出代码,错误时返回非零退出代码。

#!/bin/bash

# Slurm 节点名称作为参数 $1 传入
NODE_PRIVATE_KEY=/etc/slurm/certmgr/$1_cert_key.pem

# 检查节点私钥文件是否存在
if [ ! -f $NODE_PRIVATE_KEY ]
then
    echo "$BASH_SOURCE: 无法解析节点私钥路径 '$NODE_PRIVATE_KEY'"
    exit 1
fi

cat $NODE_PRIVATE_KEY

# 以退出代码 0 退出以表示成功
exit 0

validate_node_scriptsign_csr_script 的路径需要指向在 slurmctld 上存在并可执行的脚本。

validate_node_script 示例:

对于有效的节点令牌返回零退出代码,对于无效的节点令牌或其他错误返回非零退出代码。

#!/bin/bash

# 节点的唯一令牌作为参数 $1 传入
NODE_TOKEN=$1
NODE_TOKEN_LIST_FILE=/etc/slurm/certmgr/node_token_list.txt

# 检查节点令牌列表文件是否存在
if [ ! -f $NODE_TOKEN_LIST ]
then
    echo "$BASH_SOURCE: 无法解析节点令牌列表路径 '$NODE_TOKEN_LIST'"
    exit 1
fi

# 检查唯一节点令牌是否在令牌列表文件中
grep $1 $NODE_TOKEN_LIST_FILE

# 检查 grep 的退出代码以查看是否找到令牌
if [ $? -ne 0 ]
then
    echo "$BASH_SOURCE: 验证令牌 '$NODE_TOKEN' 失败"
    exit 1
fi

# 以退出代码 0 退出以表示成功(节点令牌有效)
exit 0

sign_csr_script 示例:

将签名证书打印到标准输出。成功时返回零退出代码,错误时返回非零退出代码。

#!/bin/bash

# 证书签名请求作为参数 $1 传入
CSR=$1
CA_CERT=/etc/slurm/certmgr/root_cert.pem
CA_KEY=/etc/slurm/certmgr/root_key.pem

# 检查 CA 证书文件是否存在
if [ ! -f $CA_CERT ]
then
    echo "$BASH_SOURCE: 无法解析 CA 证书路径 '$CA_CERT'"
    exit 1
fi

# 检查 CA 私钥权限
if [ `stat -c "%a" $CA_KEY` -ne $KEY_PERMISSIONS ]
then
    echo "$BASH_SOURCE: CA 私钥在 '$CA_KEY' 的权限不正确。权限应为 $KEY_PERMISSIONS"
    exit 1
fi

# 使用 CA 证书和 CA 私钥签署 CSR,并将签名证书打印到标准输出
openssl x509 -req -CA $CA_CERT -CAkey $CA_KEY 2>/dev/null <<< $CSR

# 检查 openssl 的退出代码
if [ $? -ne 0 ]
then
    echo "$BASH_SOURCE: 生成签名证书失败"
    exit 1
fi

# 以退出代码 0 退出以表示成功
exit 0

如果一切配置正确,以下行应出现在 slurmd 和 slurmctld 日志中,使用 DebugFlags=TLS 设置。

slurmd:

slurmd: certmgr/script: certmgr_p_get_node_token: TLS: 成功检索唯一节点令牌
slurmd: certmgr/script: certmgr_p_generate_csr: TLS: 成功生成 csr:
-----BEGIN CERTIFICATE REQUEST-----
. . .
-----END CERTIFICATE REQUEST-----

slurmctld:

slurmctld: certmgr/script: certmgr_p_sign_csr: TLS: 成功验证节点令牌
slurmctld: certmgr/script: certmgr_p_sign_csr: TLS: 成功生成签名证书:
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----

slurmd:

slurmd: TLS: 成功从 slurmctld 获取签名证书:
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----

DebugFlags=AuditTLS 也可以用于显示证书续订的较少详细日志。

最后修改于 2025 年 6 月 27 日