我正在尝试为一组具有以下特征的机器设置Chefpipe理的帐户:
我有这么多的工作。
但我想要做的最后一件事是通过本地locking密码(例如使用usermod -L )来禁用帐户login。 问题是,当本地密码被locking,PAM正在回落到Kerberos …并允许访问。
有没有办法configurationPAM,以便如果本地密码存在,但它被locking,它不会尝试Kerberos?
到目前为止,我能想到的最好的办法是通过用不可猜测的东西来打破本地密码来locking帐户。 但是,这有点粗糙,如果有人不“遵循程序”,打得不好
我同意迈克尔汉普顿的意见 – 你可以也应该使用Kerberos来做到这一点。 但是,如果你想通过改变本地机器上的东西来做到这一点,这是一个应该能够工作的解决scheme。
在你的sshd_config ,添加该行
DenyGroups blocked
创build一个名为“blocked”的组。 当locking用户的本地密码时,也可以将它们添加到“已阻止”组中。
警告! 这是一个不应该存在于一个理智的世界中的可怕丑陋的混乱。 然而,这对我们所居住的人来说可能是有用的。
这个问题主要是由于pam_unix.so在auth栈中检查帐户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,安装东西等 根据您的问题描述:
auth堆栈来优先考虑本地凭证而不是krb5凭证,但是其中一个必须成功。 听起来就像你已经覆盖。 account堆栈。 如前所述, pam_unix.so在这方面pam_unix.so我们。 passwd默认值可能是很好的更改本地密码。 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将失败。