系统在处理 SSH 连接时经历了哪些步骤?
- 我们尝试通过ssh登录
sshd
启动 pam 和 pam 模块来验证我们的身份- 根据 pam 配置,我们需要提供用户名和密码(pam 检查
passwd
和shadow
文件) - pam 检查
hosts.allow/deny
、/etc/shells
、 和其他内容 - 如果一切顺利我们就登录了
- ???
- 外壳已启动
所以我的问题是什么机制负责检查在passwd
文件中将哪个 shell 分配给用户(在步骤 6 中)?是 pam 本身、某些特定的 pam 模块sshd
还是其他什么?我知道我可以passwd
通过编写 pam 模块来替换该文件(用于检查用户名和密码),但是如何替换passwd
shell 条目的文件?
答案1
据我所知,PAM 无法确定用户的 shell,这由应用程序决定。 PAM 的会话模块执行通用操作并检查,每次使用该特定服务登录时都必须执行这些操作和检查。如果应用程序随后想要启动 shell,则可以随意执行,并且通常会在用户数据库中查找 shell。
假设你的问题是关于开放SSH,这正是它的作用:一旦用户通过身份验证,并且 PAM 会话内容已完成(如果配置为使用 PAM1),ssh 服务器会在用户数据库中查找 shell(直接,而不是通过 PAM 库)。
用户数据库不限于/usr/passwd
和朋友。在Linux上(我假设您在提到后正在使用Linux ),用户数据库的组成部分由中的设置shadow
决定passwd
/etc/nsswitch.conf
。在多计算机设置中,本地数据库的常见添加内容是NIS和LDAP。如果您想使用的 shell 不是 中的 shell /etc/passwd
,则可能需要配置以下内容(尽管这会有点奇怪,如果您告诉我们您要实现的目标,也许人们可以提供更好的建议)。
如果您想让用户没有完全的 shell 访问权限,自然的解决方案是更改/etc/passwd
为放置受限的 shell — 也许RSSH仅允许少数文件复制类型的应用程序,例如 scp、rsync 和 cvs。您还可以在用户的目录中使用强制命令~/.ssh/authorized_keys
文件。
如果您想查看 ssh 服务器正在执行的操作,请以 启动守护进程ssh -ddd
。您还可以使用 获取客户端的视图ssh -vvv
,尽管这里您最感兴趣的是服务器的视图。
1
OpenSSH 仅在配置了 PAM 支持且UsePAM
指令设置为yes
in时才使用 PAM sshd_config
。即使它使用 PAM,它也提供除 PAM 之外的其他身份验证方法;特别是公钥身份验证不通过 PAM。