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 日