启用 Kerberos 时在本地锁定用户帐户

启用 Kerberos 时在本地锁定用户帐户

我正在尝试为具有以下特征的一组机器设置 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-- 一般与身份验证是否成功关系不大的杂项任务。日志记录、安装内容等。

根据您的问题描述:

  1. 我们需要一个auth优先考虑本地凭证而不是 krb5 凭证的堆栈,但两者中必须有一个成功。听起来你已经解决了这个问题。
  2. 如果没有定义本地用户,我们需要一个account拒绝访问的堆栈。如前所述,pam_unix.so在这方面我们失败了。
  3. passwd默认值可能适合更改本地密码。
  4. 我们没有立即触碰的理由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),如果失败,身份验证将失败。

相关内容