如何阻止Slurm用户执行scancel取消自身作业及绕过Slurm?
问题翻译
在部署有Slurm的HPC环境中,用户通过SSH登录后会自动执行~/.profile中一段不可修改的脚本,脚本内容如下:
srun -A <ACCOUNT_NAME> -p <PARTITION> --mem=<MEMORY> --time=HH:MM:SS -N <NUM_NODES> --gres=gpu:<NUM_GPU> --pty /bin/bash -i
该脚本用于自动提交交互式bash作业。现咨询两个问题:
- 是否可以阻止用户绕过Slurm直接使用登录节点的shell?
- 是否可以阻止用户执行
scancel命令?
解决方案
一、阻止用户绕过Slurm
1. 依赖Slurm环境变量强制校验
srun启动的交互式shell会自动注入SLURM_JOB_ID等Slurm专属环境变量,可在系统级bash配置文件(如/etc/bash.bashrc或/etc/profile.d/slurm_enforce.sh)中添加校验逻辑,若检测不到Slurm环境变量则强制退出:
# 检查是否处于Slurm作业环境 if [ -z "$SLURM_JOB_ID" ]; then echo "错误:必须通过Slurm交互式作业访问系统,即将退出。" >&2 exit 1 fi
这种方式能覆盖所有用户的bash会话,且用户无法修改系统级配置。
2. 限制计算节点的SSH访问
确保用户只能登录登录节点(Head Node),禁止直接SSH连接计算节点:
- 修改计算节点的
sshd_config,添加AllowUsers slurm(仅允许Slurm服务用户登录),或通过PAM模块限制登录源IP为登录节点。 - 在Slurm配置中设置计算节点为
State=ALLOCATED或启用NodeName=... NoLogin=YES,阻止用户直接登录。
3. 限制登录节点的本地资源权限
即使用户绕过Slurm,也无法在登录节点执行有效计算:
- 将登录节点的用户默认shell改为受限shell(rbash),限制用户执行特定命令或访问系统资源。
- 用cgroup对登录节点的普通用户进程设置严格的CPU、内存限额,让本地shell无法承载计算任务。
二、阻止用户执行scancel命令
1. 基于Slurm权限配置精细控制
如果仅需阻止用户取消他人作业,Slurm默认已限制用户只能取消自己的作业;若需完全禁止用户取消作业,可通过QOS或用户权限配置实现:
- 创建禁止取消作业的QOS:
sacctmgr create qos qos_no_cancel AllowCancel=no - 将目标用户绑定到该QOS:
sacctmgr modify user <用户名> set DefaultQOS=qos_no_cancel
2. 修改scancel程序权限
直接修改scancel的文件权限,仅允许root和Slurm管理员组执行:
chmod 750 /usr/bin/scancel chgrp slurm /usr/bin/scancel
注意:此方法会完全禁止普通用户使用scancel,包括取消自己的作业,需根据业务场景谨慎使用。
3. 禁用scancel的别名(辅助手段)
在系统级bash配置中添加别名,拦截scancel命令的调用(但用户仍可通过绝对路径绕过,需配合权限控制):
alias scancel='echo "禁止执行scancel命令,请联系管理员处理作业。"'
内容的提问来源于stack exchange,提问作者klaus
相关产品推荐
相关产品推荐

