我正在尝试为具有以下特征的一组机器设置 Chef 管理的帐户:
- 如果没有本地帐户,登录将被阻止。
- 如果有具有 SSH 密钥的本地帐户,则可以使用这些密钥进行身份验证。
- 如果有本地帐户具有本地密码,则该密码用于身份验证。
- 如果存在没有本地密码的本地帐户,则使用 Kerberos。
我已经有很多工作了。
但我最不想做的事情是通过本地锁定密码(例如使用usermod -L
)来禁用帐户登录。问题是,当本地密码被锁定时,PAM 会回退到 Kerberos ... 并允许访问。
有没有办法配置 PAM,以便如果本地密码存在但被锁定,它就不会尝试 Kerberos?
到目前为止,我能想到的最好的办法是使用一些不可猜测的东西来破坏本地密码,从而锁定帐户。但这有点粗鲁,而且如果有人不“按照程序”操作,效果就不好……
答案1
我同意 Michael Hampton 的评论 - 您可以而且应该使用 Kerberos 来执行此操作。但是,如果您确实想通过更改本地计算机上的内容来执行此操作,这里有一个应该可行的解决方案。
在您的sshd_config
,添加行
DenyGroups blocked
创建一个名为“blocked”的组,在锁定用户本地密码时,也将其添加到“blocked”组中。
警告!这是一个丑陋的拼凑物,在一个理智的世界里不应该存在。然而,它在我们生活的世界中可能有用。
答案2
这个问题主要是因为pam_unix.so
检查auth
堆栈中的帐户锁定而不是account
,这对于 PAM 新手来说有点违反直觉。会计决策应该可以在 中进行account
,而不是auth
,但基于密码字段的影子帐户锁定是执行的。这使得它成为必要的妥协。
在继续并决定如何实施修复之前,让我们先回顾一下 PAM 定义的管理组:
auth
-- 身份验证问题。将您的调整限制在基于用户提交身份验证的凭据的决策上,特别是因为如果程序实施自己的身份验证方案,它们可能会选择完全绕过此模块。(每个人都忘记的例子:如果启用了 SSH 密钥身份验证并成功,则sshd
跳过)auth
account
-- 大多数刚接触 PAM 的人都会忽略这一点。如果身份验证成功但无论如何都应该拒绝用户访问,应该在这里做出决定。(sshd
将不是如果 SSH 密钥认证成功则跳过此模块,与 不同auth
)passwd
-- 更改您在 中定义的服务相关密码auth
。session
-- 一般与身份验证是否成功关系不大的杂项任务。日志记录、安装内容等。
根据您的问题描述:
- 我们需要一个
auth
优先考虑本地凭证而不是 krb5 凭证的堆栈,但两者中必须有一个成功。听起来你已经解决了这个问题。 - 如果没有定义本地用户,我们需要一个
account
拒绝访问的堆栈。如前所述,pam_unix.so
在这方面我们失败了。 passwd
默认值可能适合更改本地密码。- 我们没有立即触碰的理由
session
。
根据您提出的自我回答,看起来您已经知道下一步该怎么做了。
答案3
我需要在工作时检查一下,但我思考我可以在“pam_krb5”条目后向堆栈添加一个“pam_exec”条目。这样可以运行一个使用“passwd -S”的脚本来检查用户的密码条目是否未被锁定。
或者我可以通过将用户置于“阻止”组并使用 pam_succeed_if 来实现,如下所示:
auth required pam_succeed_if.so quiet_success user notingroup blocked
答案4
对于一般用途,我不建议混合使用本地和 Kerberos 帐户。但是,此身份验证 pam 堆栈应该可以满足我们的目的。(您可能还有其他要pam_env.so
包含的部分。)
auth requisite pam_unix.so nullok
auth sufficient pam_krb5 ignore_root use_first_pass
auth required pam_deny.so
如果用户的本地密码不正确或被锁定,身份验证将失败。如果用户没有本地密码,身份验证将使用 kerberos(而不是 GSSAPI),如果失败,身份验证将失败。