我有一个守护进程(collectd),它执行数据收集脚本(通过 smartctl)。
collectd 的 exec-plugin 要求外部脚本在用户 != 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
但随后 sudo 抱怨道:
sudo:无法确定强制模式。:权限被拒绝 sudo:无法执行 /usr/sbin/smartctl:权限被拒绝
TYPE/ROLE 应该如何与 sudo 一起使用(在 CentOS 7 下)?
路线 b) 怎么样 - 如何使用自定义 SELinux 策略文件配置它?
答案1
您可以在自定义策略文件 ( ) 中指定转换,.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;
假设收集脚本位于用户的主目录下(并且标有user_home_t
)。