Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合
Munge 是一个专门为高性能计算(HPC)环境设计的轻量级认证服务,它在 Slurm 等作业调度系统中扮演着关键的安全角色。
1. 核心安全模型
Munge 采用对称密钥加密机制,其安全模型基于以下几个核心要素:
(共享密钥)所有节点使用相同的 /etc/munge/munge.key
文件
(时效性凭证)生成的凭证具有有限的有效期(默认300秒)
(主机绑定)凭证与生成主机信息绑定
(用户上下文)保留原始用户UID/GID信息
2. 工作流程详解
2.1. 凭证生成阶段(编码)
输入准备:
收集当前时间戳
获取请求主机的网络标识(IP/主机名)
记录调用进程的UID/GID
可选的有效负载数据(对于Slurm通常是作业信息)
加密处理:
将第一步中收集的信息一锅烩了,伪代码如下:# 伪代码表示加密流程 def encode_credential():timestamp = get_current_time()source_ip = get_local_ip()uid = get_caller_uid()gid = get_caller_gid()# 构建凭证元数据metadata = pack(timestamp, ttl, source_ip, uid, gid)# 使用共享密钥加密cipher = AES128(key=munge_key, mode=CBC)encrypted = cipher.encrypt(metadata + payload)# 添加消息认证码(MAC)mac = HMAC_SHA256(key=munge_key, data=encrypted)# 最终编码return base64_encode(encrypted + mac)
2.2. 凭证验证阶段(解码)
接收验证:
解码 Base64 格式的凭证
分离加密数据和 MAC 校验码
完整性检查:
# 伪代码表示验证流程 def verify_credential(encoded):# 解码并分割数据raw = base64_decode(encoded)encrypted = raw[:-32] # 假设SHA256 MAC是32字节received_mac = raw[-32:]# 验证MACexpected_mac = HMAC_SHA256(key=munge_key, data=encrypted)if not constant_time_compare(received_mac, expected_mac):return AUTH_FAILURE
数据解密:
# 解密数据decrypted = AES128_decrypt(key=munge_key, ciphertext=encrypted)# 解包元数据meta = unpack(decrypted)timestamp = meta.timestampsource_ip = meta.source_ipuid = meta.uidgid = meta.gid
有效性验证:
检查时间戳是否在有效期内(当前时间 - timestamp < TTL)
验证源主机是否在可信列表中(Slurm配置的节点)
确认UID/GID是否有权限执行请求的操作
3. 在Slurm中的具体应用
3.1. 节点认证流程
slurmd 启动过程:
计算节点上的 slurmd 使用 Munge 生成认证令牌
令牌包含节点主机信息和启动时间
控制器通过验证此令牌确认节点合法性
作业调度过程:
3.2. 安全特性实现
防重放攻击:
每个凭证包含唯一时间戳
过期凭证立即失效(默认TTL 300秒)
防伪造攻击:
需要物理访问所有节点才能获取共享密钥
强加密算法(AES128+HMAC_SHA256)
权限隔离:
保留原始 UID/GID 信息
计算节点根据凭证中的用户信息创建进程
4. 加密技术细节
Munge 使用的加密栈包括:
组件 | 算法 | 用途 |
---|---|---|
数据加密 | AES-128-CBC | 保护凭证内容机密性 |
消息认证 | HMAC-SHA256 | 确保数据完整性 |
编码格式 | Base64 | 网络传输友好格式 |
时间保护 | UNIX时间戳 | 防止重放攻击 |
加密流程数学表示:
E = AES128-CBC(K, M)
MAC = HMAC-SHA256(K, E)
Credential = Base64(E || MAC)
其中:
K:共享的munge.key
M:元数据+有效负载
||:字节连接操作
5. 性能优化设计
Munge 针对HPC环境进行了特别优化:
(零网络通信)认证过程不需要网络交换
(本地缓存)频繁验证的结果会被缓存
(轻量级操作)使用高效的对称加密算法
(最小化依赖)不依赖PKI或其他复杂基础设施
6. 安全边界分析
Munge 提供的安全保证包括:
(节点身份认证)确保只有配置的节点能加入集群
( 作业来源验证)防止伪造作业提交
(用户权限传递)安全地将用户权限传递给计算节点
其安全边界限制:
不提供网络加密(通常与SSH/VPN配合使用)
不防御拥有 root 权限的攻击者(可读取munge.key)
依赖系统时间同步(通常需要NTP服务)
通过这种设计,Munge 在几乎不引入性能开销的情况下,为Slurm集群提供了必要的安全基础。
7. 应对凭证过期
Munge 通过以下几种机制解决凭证有效期(TTL,Time To Live)过期的问题,确保系统既安全又保持可用性。
7.1. 自动续期机制
(1)后台续期服务
Slurm 的 slurmctld
(控制守护进程)会 主动监控 即将过期的凭证,在凭证 TTL 过半时(默认 150 秒,300 秒 TTL 的一半),自动生成新凭证。新凭证通过 相同的安全通道 分发到相关节点,无缝衔接。
(2)作业执行期间的续期
对于长时间运行的作业,Slurm 会定期(如每小时)向计算节点发送 "存活信号"(keepalive)。每次通信时附带 更新的 Munge 凭证,避免作业因认证过期中断。
7.2. 时间同步容错
(1)时钟漂移补偿
Munge 允许配置 时钟偏差容忍值(通过 MUNGE_TIMESTAMP_DRIFT_MAX
环境变量):
# 在 /etc/default/munge 中设置(示例允许±5分钟偏差)
MUNGE_TIMESTAMP_DRIFT_MAX=300
即使节点间时间不同步,只要偏差在容忍范围内,凭证仍有效。
(2)NTP 强制同步
Slurm 部署时通常要求所有节点启用 NTP 服务:
sudo apt install ntp
sudo systemctl enable --now ntp
确保集群时间同步精度在 毫秒级,从根本上避免过期问题。
7.3. 失效后的恢复策略
(1)凭证重新生成
当检测到凭证过期时,Slurm 控制器(slurmctld
)触发 重新认证流程。节点上的 slurmd
重新申请新凭证。旧凭证被丢弃,新凭证立即生效。
(2)作业容错处理
如果作业因凭证过期被拒绝,Slurm 会自动重试提交(默认最多 3 次)。每次重试生成 全新的 Munge 凭证。
7.4. 配置调优建议
(1)调整 TTL 参数
在 /etc/munge/munge.conf
中修改默认 TTL:
# 延长凭证有效期至 10 分钟(600 秒)
MUNGE_TTL=600
权衡:更长 TTL 降低认证开销,但略微增加安全风险。
(2)日志监控
通过 Munge 日志(/var/log/munge/munged.log
)监控过期事件:
sudo grep "expired" /var/log/munge/munged.log
频繁出现过期警告时,需检查时间同步或调整 TTL。
7.5. 极端情况处理
(1)节点长时间离线后恢复
节点恢复在线时:slurmd
自动向 slurmctld
发起 重新注册请求。控制器生成 全新的 Munge 凭证 并下发。节点更新本地凭证缓存。
(2)密钥轮换期间的过渡
更换 Munge 密钥时(如 sudo /usr/sbin/create-munge-key
),新旧密钥可 并行使用 一段时间(通过 MUNGE_KEY_ROTATION_SECONDS
配置)。确保正在运行的作业不会因密钥更新中断。
综上所述,Munge 通过 自动续期 + 时间容错 + 失效恢复 三重机制解决凭证过期问题。对于 Slurm 用户,只需确保3点:
所有节点时间同步(NTP)
监控 Munge 日志中的过期警告
合理配置 TTL(默认 300 秒通常足够)
这些设计使得认证过程既安全(短期凭证)又可靠(无缝续期),无需人工干预。
8. 安装 munge
下载页:
https://github.com/dun/munge/releases
下载:
$ wget https://github.com/dun/munge/releases/download/munge-0.5.15/munge-0.5.15.tar.xz
$ tar xJf munge-0.5.15.tar.xz$ cd munge-0.5.15$ ./configure \--prefix=/usr \--sysconfdir=/etc \--localstatedir=/var \--runstatedir=/run$ make$ make check$ sudo make install
如果下载的是 source.tar.gz,则需要先运行 ./bootstrap,然后再执行 configure make 等等。
9. 参考
https://github.com/dun/munge/wiki/Man-Pages
https://github.com/dun/munge/wiki/Man-7-munge