系统在处理 SSH 连接时会经过哪些步骤?

pbm*_*pbm 9 shell ssh pam

系统在处理 SSH 连接时会经过哪些步骤?

  1. 我们尝试通过 ssh 登录
  2. sshd 启动 pam 和 pam 模块来验证我们
  3. 根据 pam 配置,我们需要提供用户名和密码(pam 检查passwdshadow文件)
  4. PAM检查hosts.allow/deny/etc/shells和其他的东西
  5. 如果一切顺利,我们就登录了
  6. ???
  7. 外壳已启动

所以我的问题是什么机制负责检查在他们的passwd文件中分配给用户的 shell (在步骤 6 中)?是 pam 本身,还是某个特定的 pam 模块sshd,还是其他东西?我知道我可以passwd通过编写 pam 模块来替换文件(用于检查用户名和密码),但是如何替换passwdshell 条目的文件?

Gil*_*il' 8

据我所知,PAM 不决定用户的外壳,这留给应用程序。PAM 的会话模块执行通用操作并检查使用该特定服务的每次登录时必须执行的操作。如果应用程序然后想要启动一个 shell,它可以自由地这样做,并且通常会在用户数据库中查找 shell。

假设您的问题是关于OpenSSH 的,这正是它所做的:一旦用户通过身份验证,并且 PAM 会话内容已经完成(如果配置为使用 PAM¹),ssh 服务器将在用户数据库中查找 shell(直接,而不是通过 PAM 库)。

用户数据库不限于/usr/passwd和朋友。在Linux(我假设你正在使用,因为你提到shadow),是什么构成了用户数据库是由确定passwd的设置/etc/nsswitch.conf。在多计算机设置中,对本地数据库的常见添加是NISLDAP。如果您想使用不在/etc/passwd.

如果您想让用户没有完全的 shell 访问权限,自然的解决方案是更改/etc/passwd为放置一个受限制的 shell — 也许rssh只允许少数文件复制类型的应用程序,例如 scp、rsync 和 cvs。您还可以在用户~/.ssh/authorized_keys文件中使用强制命令。

如果您想查看 ssh 服务器正在做什么的跟踪,请将守护程序作为ssh -ddd. 您也可以使用 获取客户端的视图ssh -vvv,尽管这里服务器的视图是您最感兴趣的。

¹ OpenSSH 仅在配置了 PAM 支持并且UsePAM指令设置为yesin时才使用 PAM sshd_config。即使当它使用 PAM 时,它也提供除 PAM 之外的其他身份验证方法;特别是公钥认证不通过 PAM。