启用Kerberos时,在本地locking用户的帐户

我正在尝试为一组具有以下特征的机器设置Chefpipe理的帐户:

  • 如果没有本地帐户,则login被阻止。
  • 如果有一个本地帐户与SSH密钥,使用那些进行身份validation是可能的。
  • 如果存在具有本地密码的本地帐户,则使用该密码进行validation。
  • 如果有本地帐户没有本地密码,则使用Kerberos。

我有这么多的工作。

但我想要做的最后一件事是通过本地locking密码(例如使用usermod -L )来禁用帐户login。 问题是,当本地密码被locking,PAM正在回落到Kerberos …并允许访问。

有没有办法configurationPAM,以便如果本地密码存在,但它被locking,它不会尝试Kerberos?

到目前为止,我能想到的最好的办法是通过用不可猜测的东西来打破本地密码来locking帐户。 但是,这有点粗糙,如果有人不“遵循程序”,打得不好

我同意迈克尔汉普顿的意见 – 你可以也应该使用Kerberos来做到这一点。 但是,如果你想通过改变本地机器上的东西来做到这一点,这是一个应该能够工作的解决scheme。

在你的sshd_config ,添加该行

 DenyGroups blocked 

创build一个名为“blocked”的组。 当locking用户的本地密码时,也可以将它们添加到“已阻止”组中。

警告! 这是一个不应该存在于一个理智的世界中的可怕丑陋的混乱。 然而,这对我们所居住的人来说可能是有用的。

这个问题主要是由于pam_unix.soauth栈中检查帐户locking而不是account ,这对于PAM新手来说有点不直观。 会计决策应该account ,而不是auth ,但基于密码的字段会执行基于阴影的帐户locking。 这是一个必要的妥协。

在继续并决定如何实施您的修复程序之前,让我们回顾由PAM定义的pipe理组:

  • auth – 身份validation问题。 根据用户提交的身份validation信息来限制您的调整,特别是因为如果程序实现了自己的身份validationscheme,程序可能会select完全绕过此模块。 (每个人都忘记的例子:如果SSH密钥身份validation已启用且成功, sshd跳过authvalidation)
  • account – 大多数人对PAM的忽视。 如果authentication成功,但是用户应该被拒绝访问,那么这个决定应该在这里进行。 (如果SSH密钥authentication成功, sshd 不会跳过这个模块,不像auth
  • passwd – 更改与您在auth定义的服务相关的密码。
  • session – 通常与身份validation是否成功无关的其他任务。 logging,安装东西等

根据您的问题描述:

  1. 我们需要一个auth堆栈来优先考虑本地凭证而不是krb5凭证,但是其中一个必须成功。 听起来就像你已经覆盖。
  2. 如果没有定义本地用户,我们需要一个拒绝访问的account堆栈。 如前所述, pam_unix.so在这方面pam_unix.so我们。
  3. passwd默认值可能是很好的更改本地密码。
  4. 我们没有直接的理由触及session

根据你提出的自我回答,看起来你有从这里把它从哪里拿走的想法。

我需要在工作中检查这个,但我我可以在“pam_krb5”条目之后添加一个“pam_exec”条目到堆栈。 这可以运行一个使用“passwd -S”的脚本来检查用户的密码input没有被locking。

或者我可以通过将用户设置为“阻止”组并使用pam_succeed_if来完成此操作:

 auth required pam_succeed_if.so quiet_success user notingroup blocked 

对于一般用途,我不build议混合本地和Kerberos帐户。 但是,这个authentication栈应该适用于我们的目的。 (你可能有其他的东西,比如pam_env.so ,你会包括的。)

 auth requisite pam_unix.so nullok auth sufficient pam_krb5 ignore_root use_first_pass auth required pam_deny.so 

如果用户的本地密码不正确或被locking,authentication将失败。 如果用户没有本地密码,authentication使用kerberos(而不是GSSAPI),如果authentication失败,authentication将失败。