linux - 如何在 PAM 之后而不是在重新映射用户之前告诉 SSH 到 setuid
问题描述
我正在研究由 PAM 模块和 NSS 模块组成的半径身份验证解决方案。
流程是这样的:
- 用户
ben
登录(通过login
命令) - 用户输入用户名:
ben
- 使用该用户名查询我的 NSS 模块并返回默认的非特权用户,与libnss-ato 的
radius
行为相同 - 用户输入密码
- 我的 PAM 模块被调用并将查询 Radius 服务器,如果接受身份验证,PAM 模块将使用 Radius 供应商属性选择本地用户名来映射 Radius 用户,此映射被写入数据库,例如
ben
->admin
- 现在,我的 NSS 模块将读取该数据库并为 Radius 用户返回正确的本地用户名
- 使用该
login
命令,用户登录到正确的映射用户admin
现在,我的问题如下。OpenSSH 服务器将在 PAM 之前读取 NSS。
这意味着流程是这样的:
- 用户
ben
ssh 进入 - SSH查询NSS并映射
ben
到默认账户radius
- 向用户显示密码提示并输入密码
- 我的 PAM 模块被调用并且映射
ben
->admin
被缓存 - SSH 将生成一个会话,
radius
而不是admin
因为它使用在调用 PAM 之前从 NSS 获得的值
现在这个错误只在第一次登录时发生,因为在第二次登录时 NSS 将缓存数据并在第一次调用时返回正确的用户。
但这仍然是一个问题,首先因为我不希望每次第一次登录都落到错误的用户身上,其次如果ben
删除了管理员权限,由于我的 NSS 缓存,他的下一次登录仍然会通过 SSH 映射到管理员NSS 模块。
我无法在第一次 NSS 调用中查询映射,因为从 radius 查询映射需要成功登录。
我有一些线索,但我真的很想对这个问题有所了解。
我的线索是:
- have the
radius
user use a special root setuid shell, this shell would read the my NSS database and change user, then exec the real shell, the problem is that I need to know which radius user is logged in. I can write env var in my PAM module, but as the shell will be setuid, I need a security mechanism to ensure that var is trusted. Only thing I see is to have a crypto signature in the var, and have the setuid shell verify that with a private key in root 0600. - call
setuid
in the PAM module, but that's sound fishy
解决方案
I ended up changing the shell for the user to a setuid wrapper that drop privileges to the intended user.
Code is here: https://github.com/kuon/radius-auth-virtual
推荐阅读
- flutter - 使用 Flutter 安装 `flutter_twitter_login` 和 `TwitterKit` 时出现问题
- highcharts - 如何让我的最后一点在 highstock 中闪烁?
- matlab - MATLAB中的嵌套for循环错误或索引错误
- javascript - 如何将 onChange 事件添加到元素列表中,这将使用当前值更新 HTML?
- oracle - 在 docker 容器中安装 oracle 客户端
- c# - C# WPF 菜单未在标题中显示第一个“_”
- java - 鼠标点击后无法绘制塔
- reactjs - 使用 React ES6 被动监听子事件(不使用 jquery)
- java - 如何在@Query 注解中将方法参数用作纯文本
- python-3.x - 获取“AttributeError:'NoneType'对象没有属性'loc'”