我不明白 ssh 或任何其他服务如何在没有 pam 的情况下工作。 pam 定义了所有规则,如果我理解正确的话,会调用其他模块来设置资源或限制等。
有人可以解释一下如果我们设置 SSH 的行为方式吗UsePam=No
?哪些模块负责身份验证、会话创建等?
答案1
如果您设置UsePam no
,那么sshd
它本身将尽可能地完成 PAM 模块的工作。
由于sshd
以 root 身份运行,因此它可以使用函数从(或从 NIS、LDAP 或系统 C 库支持的任何其他存储位置)getspnam(3)
获取用户的密码哈希和其他信息,通过查看来选择密码哈希算法散列的开头,然后使用结果/etc/shadow
中的盐对用户输入的密码进行散列。然后将结果与 检索到的完整密码散列进行比较。如果匹配,则密码认证成功。getspnam(3)
crypt(3)
getspnam(3)
帐户验证步骤也非常简单:密码过期信息包含在结果中getspnam(3)
,并再次检查用户的 shell 是否存在并在 中列出/etc/shells
。
会话创建包括许多步骤,其详细信息取决于运行服务的 Linux 或 Unix 类型。但通常,对于 shell 会话,sshd
处理此特定连接的子进程会将会话信息记录到 和utmp
文件wtmp
,设置伪 TTY,然后fork()
另一个子进程将采用用户的 UID 和组成员身份,切换到用户的主目录并调用setsid()
成为会话领导者。然后这个进程会进入exec()
用户的shell。
当 shell 终止时,sshd
持有伪 TTY 主端的子进程将执行任何必要的清理操作,例如在文件中记录会话结束wtmp
。
这大致就是 PAM 发明之前 Unix 会话的处理方式。