使用 pam_succeed_if.so 允许给定组进行无密码 su

使用 pam_succeed_if.so 允许给定组进行无密码 su

我有一个服务用户srvuser和一个组maintainers。我怎样才能只允许组成maintainerssrvuser命令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

这里的缺点是,与 和 不同susudo运行 setuid 二进制文件不会在任何地方记录,并且 setuid 二进制文件可以由以目标用户身份运行的进程修改或删除。要解决此问题,您可以创建一个简单的固定功能包装程序,将执行情况记录setuid到目标,然后记录exec实际命令。

相关内容