调用sudo时如何转换到另一个域?

max*_*zig 5 sudo selinux

我有一个守护进程(collectd),它执行一个用于数据收集的脚本(通过 smartctl)。

collectd 的 exec 插件要求外部脚本在用户 != root 下执行。

计划是这样设置:

  • 允许 collectd 更改用户并可能执行脚本(通过 SELinux)
  • 为手头的任务创建一个系统用户 X
  • 配置 sudo 以允许 X 执行 smartctl
  • 配置 SELinux,以便 a) sudo 转换到(比如说)无限制域 b)用户 X 的 setuid(或脚本的执行)转换到无限制域

我想出了最后一步 - 因为否则没有过渡,我必须允许收集所有与 smartctl 相关的低级权限(例如 sys_rawio、ioctl、execute_no_trans ...) - 我想避免这种情况。

Sudo 似乎提供了与 SELinux 相关的属性,例如可以在 sudoer 行中添加如下内容:

TYPE=unconfined_t ROLE=unconfined_r
Run Code Online (Sandbox Code Playgroud)

但随后 sudo 抱怨:

sudo:无法确定强制模式。:权限被拒绝
sudo: 无法执行 /usr/sbin/smartctl: 权限被拒绝

TYPE/ROLE 应该如何与 sudo 一起使用(在 CentOS 7 下)?

路由 b) - 如何使用自定义 SELinux 策略文件进行配置?

max*_*zig 3

您可以在自定义策略文件 ( ) 中指定转换,.te如下所示:

module collectdlocalexec 1.0;

require {
        type collectd_t;
        type user_home_t;
        type unconfined_t;
        type shell_exec_t;
        class capability {setgid setuid };
        class file { execute read open };
        class process transition;
}

allow collectd_t self:capability { setgid setuid };
allow collectd_t user_home_t:file { execute read open };
allow collectd_t shell_exec_t:file execute;
allow collectd_t unconfined_t:process transition;

type_transition collectd_t user_home_t:process unconfined_t;
Run Code Online (Sandbox Code Playgroud)

假设收集脚本位于用户的主目录下(并且标有user_home_t)。