SELinux
从版本 21.08 开始,Slurm 包含对作业设置 SELinux 上下文的支持,作为技术预览。该实现可能会在未来的版本中发生变化,并且默认情况下不启用此支持。
架构
启用后,Slurm 作业提交命令 — salloc、sbatch 和 srun — 将自动设置一个包含当前操作上下文的字段。此字段可以通过 --context 命令行选项覆盖。
重要的是要注意,此值可以被最终用户直接操作,具体的脚本需要验证和控制对这些上下文的访问。目前,MUNGE(Slurm 用于安全识别集群上的用户和主机)不提供 SELinux 上下文字段,因此没有安全机制将当前上下文发送到 Slurm 控制器。因此,在作业提交时提供的上下文 必须 由在 slurmctld 中运行的 job_submit 插件进行验证。
如果没有这样的脚本,则不会为用户的作业设置或管理任何上下文。
安装
来源:
SELinux 支持默认情况下是禁用的,必须在配置时启用。它需要 libselinux1 库和开发头文件才能构建。
configure --enable-selinux
设置
安装支持 SELinux 的 Slurm 版本后,您需要启用并创建一个 job_submit 插件,该插件将在将 SELinux 上下文传递给 slurmctld 之前进行验证。目前,没有可靠和安全的方法可以在内部获取/验证上下文,因此您必须创建此脚本并在 job_submit 插件中执行验证。
示例:
function slurm_job_submit(job_desc, part_list, submit_uid) if job_desc.req_context then local element = 0 for str in string.gmatch(job_desc.req_context, "([^:]+)") do if element == 0 and str ~= "unconfined_u" then slurm.log_user("错误: 无效的 SELinux 上下文") return slurm.ERROR elseif element == 1 and str ~= "unconfined_r" then slurm.log_user("错误: %s 不是有效的 SELinux 角色") return slurm.ERROR end element = element + 1 end job_desc.selinux_context = job_desc.req_context else -- 如果没有请求特定上下文,则强制使用特定上下文 job_desc.selinux_context = unconfined_u:unconfined_r:slurm_t:s0 end return slurm.SUCCESS end
请注意,如果 job_desc.req_context 的内容被认为是有效的,则 job_desc.selinux_context 是根据其内容设置的。job_desc.selinux_context 是设置将被使用的上下文。
初步测试
id 对于显示用户当前处于哪个上下文非常有用。作为测试以确保我们正在切换上下文,您可以使用 srun 运行快速测试。
mcmult@master:~$ srun id uid=1000(mcmult) gid=1000(mcmult) groups=1000(mcmult),27(sudo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 mcmult@master:~$ srun --context=unconfined_u:unconfined_r:unconfined_t:s0 id uid=1000(mcmult) gid=1000(mcmult) groups=1000(mcmult),27(sudo) context=unconfined_u:unconfined_r:unconfined_t:s0
记账
目前,Slurm 的记账中没有跟踪 SELinux 上下文的支持。随着支持在未来版本中的发展,这可能会有所变化。如果您需要跟踪 SELinux 上下文,可以将其存储在 admin 注释字段中,作为您的 job_submit 插件的一部分,如下面的示例所示。
示例:
function slurm_job_submit(job_desc, part_list, submit_uid) if job_desc.req_context then local element = 0 for str in string.gmatch(job_desc.req_context, "([^:]+)") do if element == 0 and str ~= "unconfined_u" then slurm.log_user("错误: 无效的 SELinux 上下文") return slurm.ERROR elseif element == 1 and str ~= "unconfined_r" then slurm.log_user("错误: %s 不是有效的 SELinux 角色") return slurm.ERROR end element = element + 1 end job_desc.selinux_context = job_desc.req_context else -- 如果没有请求特定上下文,则强制使用特定上下文 job_desc.selinux_context = unconfined_u:unconfined_r:slurm_t:s0 end job_desc.admin_comment = "SELinuxContext=" .. job_desc.selinux_context return slurm.SUCCESS end
注意在返回之前设置 "job_desc.admin_comment" 的添加。这将设置管理员注释,以显示我们将尝试为作业设置的上下文。
注意
如果您希望将 pam_slurm_adopt 与 SELinux 一起使用,请参阅 pam_slurm_adopt 文档,以获取有关如何使其工作的提示。请注意,当同时使用此功能和 pam_slurm_adopt 时,ssh 会话可能不会落在与作业相同的上下文中。
最后修改于 2023 年 9 月 22 日