在 LDAP 中锁定用户帐户(不使用 ppolicy)

在 LDAP 中锁定用户帐户(不使用 ppolicy)

这个答案,有人建议采用 UNIX 方式!在密码字段前添加 。我认为这不是一个干净的解决方案。它不会使登录变得不可能,而只是将密码更改为密码字段的文字内容(其中第一个字符是!)。

例如,假设密码字段现在如下所示:

!{CRYPT}$6$rounds=1000000$xxx$yyy

这里,xxx代表盐值,yyy代表哈希值。该字符串现在将成为用户的密码。从许多实际用途来看,这意味着用户无法再登录,因为她不知道自己的盐值。但从理论上讲,通过猜测盐值,仍然可以登录。更糟糕的是,如果攻击者获得了 LDAP 数据库,他现在可以轻松登录到这个“锁定”的帐户,因为散列显然不再使用。

怎样才能做到这一点?

答案1

将密码字段更改为以下内容:

{CRYPT}!$6$rounds=1000000$xxx$yyy

或者以下内容:

{CRYPT}$6$rounds=1000000$xxx$!yyy

根据我的测试,这使得密码验证变得不可能。

但是,它不涵盖其他身份验证方式,例如使用 SSH 密钥。为了涵盖这些方式,至少应将 shell 设置为/bin/false。我强烈建议将此与其他措施相结合。在评论中,建议禁用~/.ssh/authorized_keys。一种可能更安全的方法是将用户的主要组更改为不允许通过 SSH 进入机器的组(可以使用 SSHD 的DenyGroupsAllowGroups功能来实现此目的)。

答案2

如果您不需要保留现有的密码哈希,您可以简单地从 LDAP 条目中删除 userPassword 字段。当然,如果您重新启用该帐户,用户将需要设置新密码。

答案3

处理此问题的正确方法有两个:

  1. 确保所有服务都进行身份验证和单独的授权检查

    • SSH 可以绕过登录 shell 和 LDAP 密码授权(通过指定要执行的命令并使用基于密钥的身份验证),这样的配置是合理的!
    • 流行的 SSH 服务器可以使用 PAM 进行授权检查,即使它们自己处理身份验证而没有 PAM/LDAP(usePAM→ 除了可能使用“auth”之外,还使用 ​​PAM 中的“account”类别)
  2. 确保授权检查,例如设置中的shadowExpired属性(shadowAccount对象类),然后使帐户过期

我认为没有必要以一种能够恢复密码的方式破坏密码,同时又破坏登录 shell 而无法恢复密码。

将整个 LDAP 用户条目移动到 LDAP 服务器上的另一个子树中也应该可以禁用该帐户。—缺点是无法看到用户和组名称例如在剩余的主目录中。如果您的用户管理工具无法找到使用 uid/gid 号码的条目,它可能会决定过早地重新使用 uid/gid 号码。

相关内容