我有一个服务用户srvuser
和一个组maintainers
。我怎样才能只允许组成maintainers
为srvuser
命令su
?我尝试编辑/etc/pam.d/su
:
auth sufficient pam_succeed_if.so use_uid user = maintainers and user ingroup maintainers
但and
在conf文件中显然不允许。有办法解决这个问题吗?
答案1
的文档中pam_succeed_if
似乎没有任何内容表明它支持多个连词,因此您需要在模块外部执行此操作。
如果您正在编写required
规则,则通过创建两个单独的规则来组合它们会很简单:
auth required pam_succeed_if.so user = srvuser
auth required pam_succeed_if.so use_uid user ingroup maintainers
但是,如果有一条sufficient
规则,例如当返回正结果时终止处理的规则,这将不起作用,而是会变成或者条件代替。但 PAM 支持某种流量控制,允许根据前一个模块的返回值跳过一些规则。请参阅文档在这里。
pam_permit
只要模块返回 true,就应该遵循该pam_succeed_if
规则,但如果它们返回除success
.
auth [success=ok default=2] pam_succeed_if.so user = srvuser
auth [success=ok default=1] pam_succeed_if.so use_uid user ingroup maintainers
auth [success=done default=ignore] pam_permit.so
... # other modules
正如您所看到的,语法很糟糕,我建议在尝试在任何地方实际使用它之前测试配置。
当然,要允许某个组的成员以另一个用户的权限运行进程,您不一定需要su
,sudo
或 PAM。使用通常的文件权限,您可以创建一个 setuid 二进制文件,并且只允许给定组的成员执行它:
# chown srvuser.maintainers ls
# chmod 4510 ls
# ls -l ls
-r-s--x--- 1 srvuser maintainers 118280 Mar 26 19:03 ls
这里的缺点是,与 和 不同su
,sudo
运行 setuid 二进制文件不会在任何地方记录,并且 setuid 二进制文件可以由以目标用户身份运行的进程修改或删除。要解决此问题,您可以创建一个简单的固定功能包装程序,将执行情况记录setuid
到目标,然后记录exec
实际命令。