如何告诉 SSH 在 PAM 之后而不是在重新映射用户之前设置 uid
How to tell SSH to setuid after PAM and not before to remap users
我正在研究由PAM模块和NSS模块组成的radius认证方案。
流程是这样的:
- 用户
ben
登录(通过login
命令)
- 用户输入用户名:
ben
- 我的 NSS 模块使用该用户名查询,return 是默认的非特权用户
radius
,与 libnss-ato 的行为相同
- 用户输入密码
- 我的 PAM 模块被调用并将查询 Radius 服务器,如果身份验证被接受,PAM 模块将使用 Radius 供应商属性来选择本地用户名以将 Radius 用户映射到,此映射被写入数据库,例如
ben
-> admin
- 现在,我的 NSS 模块将读取该数据库和 return Radius 用户的正确本地用户名
- 使用
login
命令,用户以正确的映射用户登录 admin
现在,我的问题如下。 OpenSSH 服务器将在 PAM 之前读取 NSS。
这意味着流程是这样的:
- 用户
ben
ssh in
- SSH查询NSS并将
ben
映射到默认账号radius
- 用户会看到密码提示并输入密码
- 我的 PAM 模块被调用并且映射
ben
-> admin
被缓存
- SSH 将以
radius
而不是 admin
的形式生成会话,因为它使用在调用 PAM 之前从 NSS 获得的值
现在这个错误只在第一次登录时发生,因为在第二次登录时 NSS 将有缓存数据并且 return 在第一次调用时纠正用户。
但这仍然是一个问题,首先因为我不想每次第一次登录都落到错误的用户名下,其次如果ben
被管理员权限删除,他的下一次登录仍然会被映射由于我的 NSS 模块的 NSS 缓存,可以通过 SSH 进行管理。
我无法在第一次 NSS 调用时查询映射,因为从 radius 查询映射需要成功登录。
我有一些线索,但我真的很想对这个问题有一些见解。
我的线索是:
- 让
radius
用户使用特殊的 root setuid shell,这个 shell 会读取我的 NSS 数据库并更改用户,然后执行真正的 shell,问题是我需要知道哪个 radius 用户登录了。我可以在我的 PAM 模块中编写 env var,但是由于 shell 将是 setuid,我需要一个安全机制来确保 var 是可信的。我唯一看到的是在 var 中有一个加密签名,并让 setuid shell 使用根 0600 中的私钥验证这一点。
- 在 PAM 模块中调用
setuid
,但这听起来很可疑
我最终将用户的 shell 更改为一个 setuid 包装器,该包装器将权限分配给预期用户。
我正在研究由PAM模块和NSS模块组成的radius认证方案。
流程是这样的:
- 用户
ben
登录(通过login
命令) - 用户输入用户名:
ben
- 我的 NSS 模块使用该用户名查询,return 是默认的非特权用户
radius
,与 libnss-ato 的行为相同
- 用户输入密码
- 我的 PAM 模块被调用并将查询 Radius 服务器,如果身份验证被接受,PAM 模块将使用 Radius 供应商属性来选择本地用户名以将 Radius 用户映射到,此映射被写入数据库,例如
ben
->admin
- 现在,我的 NSS 模块将读取该数据库和 return Radius 用户的正确本地用户名
- 使用
login
命令,用户以正确的映射用户登录admin
现在,我的问题如下。 OpenSSH 服务器将在 PAM 之前读取 NSS。
这意味着流程是这样的:
- 用户
ben
ssh in - SSH查询NSS并将
ben
映射到默认账号radius
- 用户会看到密码提示并输入密码
- 我的 PAM 模块被调用并且映射
ben
->admin
被缓存 - SSH 将以
radius
而不是admin
的形式生成会话,因为它使用在调用 PAM 之前从 NSS 获得的值
现在这个错误只在第一次登录时发生,因为在第二次登录时 NSS 将有缓存数据并且 return 在第一次调用时纠正用户。
但这仍然是一个问题,首先因为我不想每次第一次登录都落到错误的用户名下,其次如果ben
被管理员权限删除,他的下一次登录仍然会被映射由于我的 NSS 模块的 NSS 缓存,可以通过 SSH 进行管理。
我无法在第一次 NSS 调用时查询映射,因为从 radius 查询映射需要成功登录。
我有一些线索,但我真的很想对这个问题有一些见解。
我的线索是:
- 让
radius
用户使用特殊的 root setuid shell,这个 shell 会读取我的 NSS 数据库并更改用户,然后执行真正的 shell,问题是我需要知道哪个 radius 用户登录了。我可以在我的 PAM 模块中编写 env var,但是由于 shell 将是 setuid,我需要一个安全机制来确保 var 是可信的。我唯一看到的是在 var 中有一个加密签名,并让 setuid shell 使用根 0600 中的私钥验证这一点。 - 在 PAM 模块中调用
setuid
,但这听起来很可疑
我最终将用户的 shell 更改为一个 setuid 包装器,该包装器将权限分配给预期用户。