当前位置: 首页 > news >正文

Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合

    Munge 是一个专门为高性能计算(HPC)环境设计的轻量级认证服务,它在 Slurm 等作业调度系统中扮演着关键的安全角色。

1. 核心安全模型

    Munge 采用对称密钥加密机制,其安全模型基于以下几个核心要素:

        (共享密钥)所有节点使用相同的 /etc/munge/munge.key 文件

        (时效性凭证)生成的凭证具有有限的有效期(默认300秒)

        (主机绑定)凭证与生成主机信息绑定

        (用户上下文)保留原始用户UID/GID信息

2. 工作流程详解

2.1. 凭证生成阶段(编码)

  1. 输入准备

    • 收集当前时间戳

    • 获取请求主机的网络标识(IP/主机名)

    • 记录调用进程的UID/GID

    • 可选的有效负载数据(对于Slurm通常是作业信息)

  2. 加密处理

    将第一步中收集的信息一锅烩了,伪代码如下:
    # 伪代码表示加密流程
    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. 凭证验证阶段(解码)

  1. 接收验证

    • 解码 Base64 格式的凭证

    • 分离加密数据和 MAC 校验码

  2. 完整性检查

    # 伪代码表示验证流程
    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
  3. 数据解密

        # 解密数据decrypted = AES128_decrypt(key=munge_key, ciphertext=encrypted)# 解包元数据meta = unpack(decrypted)timestamp = meta.timestampsource_ip = meta.source_ipuid = meta.uidgid = meta.gid
  4. 有效性验证

    • 检查时间戳是否在有效期内(当前时间 - timestamp < TTL)

    • 验证源主机是否在可信列表中(Slurm配置的节点)

    • 确认UID/GID是否有权限执行请求的操作

3. 在Slurm中的具体应用

3.1. 节点认证流程

  1. slurmd 启动过程

    • 计算节点上的 slurmd 使用 Munge 生成认证令牌

    • 令牌包含节点主机信息和启动时间

    • 控制器通过验证此令牌确认节点合法性

  2. 作业调度过程: 

3.2. 安全特性实现

  1. 防重放攻击

    • 每个凭证包含唯一时间戳

    • 过期凭证立即失效(默认TTL 300秒)

  2. 防伪造攻击

    • 需要物理访问所有节点才能获取共享密钥

    • 强加密算法(AES128+HMAC_SHA256)

  3. 权限隔离

    • 保留原始 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环境进行了特别优化:

  1. (零网络通信)认证过程不需要网络交换

  2. (本地缓存)频繁验证的结果会被缓存

  3. (轻量级操作)使用高效的对称加密算法

  4. (最小化依赖)不依赖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点:

  1. 所有节点时间同步(NTP)

  2. 监控 Munge 日志中的过期警告

  3. 合理配置 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

http://www.lryc.cn/news/608474.html

相关文章:

  • 交互 Codeforces Round 1040 Interactive RBS
  • 深入 Go 底层原理(十一):Go 的反射(Reflection)机制
  • 基于深度学习的医学图像分析:使用GAN实现医学图像增强
  • SpringBoot 启动富文本文字更改
  • 基于 LightGBM 的二手车价格预测
  • 一种基于入侵杂草优化算法(IWO)的聚类算法,并与K-Means、高斯混合模型(GMM)进行对比,Matlab
  • 用键盘快速移动Word和WPS文字中的选中段落
  • 【笔试真题】2024秋招京东后端开发岗位-第一批笔试
  • 数据链路层、NAT、代理服务、内网穿透
  • 使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践
  • 数字化生产管理系统设计
  • 从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
  • cuda编程笔记(12)--学习cuFFT的简单使用
  • Java单元测试和设计模式
  • 【LeetCode 热题 100】739. 每日温度——(解法一)单调栈+从右到左
  • 【语音技术】什么是动态实体
  • 【Django】-6- 登录用户身份鉴权
  • Mybatis学习之获取参数值(四)
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题
  • STM32学习记录--Day6
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现道路车辆事故的检测识别(C#代码UI界面版)
  • SpringBoot 服务器配置
  • 面经——电子电路技术知识详解
  • 【Python3教程】Python3高级篇之网络编程
  • 文心4.5开源测评:国产大模型的轻量化革命与全栈突破
  • GaussDB 约束的使用举例
  • 高效轻量的C++ HTTP服务:cpp-httplib使用指南
  • Redis核心机制与实践深度解析:从持久化到分布式锁
  • 路面障碍物识别漏检率↓76%:陌讯多模态融合算法实战解析