如何告诉SSH在PAM之后而不是重新映射用户之前将setuid设置为setuid

问题描述

我正在研究由PAM模块和NSS模块组成的半径认证解决方案。

流程如下:

现在,我的问题如下。 OpenSSH服务器将在PAM之前读取NSS。

这意味着流程如下:

  • 用户ben的ssh输入
  • SSH查询NSS并将ben映射到认帐户radius
  • 用户显示密码提示并输入密码
  • 调用了我的PAM模块,并映射了ben-> admin
  • SSH将以radius而不是admin的形式生成会话,因为它使用在调用PAM之前从NSS获得的值

现在,此错误仅在第一次登录时发生,因为在第二次登录时,NSS将缓存数据并在第一次调用时返回正确的用户

但这仍然是一个问题,首先是因为我不希望每次都将第一个登录名落入错误用户,其次,如果ben失去了管理员权限,那么他的下一个登录名仍将映射为admin由于我的NSS模块的NSS缓存而通过SSH进行访问。

我无法在第一个NSS调用查询映射,因为从radius查询映射需要成功登录

我有一些线索,但是我真的很想在这个问题上有所见识。

我的线索是:

  • radius用户使用特殊的root setuid外壳,该外壳将读取我的NSS数据库并更改用户,然后执行真正的外壳,问题是我需要知道哪个半径用户登录我可以在我的PAM模块中编写env var,但是由于外壳将是setuid,因此我需要一种安全机制来确保var是可信任的。我唯一看到的是在var中具有加密签名,并让setuid shell使用根0600中的私钥进行验证。
  • 在PAM模块中致电setuid,但这听起来很可疑

解决方法

我最终将用户的外壳更改为setuid包装器,该包装器将特权授予了目标用户。

代码在这里:https://github.com/kuon/radius-auth-virtual