在这个答案,有人建议采用 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 的DenyGroups
或AllowGroups
功能来实现此目的)。
答案2
如果您不需要保留现有的密码哈希,您可以简单地从 LDAP 条目中删除 userPassword 字段。当然,如果您重新启用该帐户,用户将需要设置新密码。
答案3
处理此问题的正确方法有两个:
确保所有服务都进行身份验证和单独的授权检查
- SSH 可以绕过登录 shell 和 LDAP 密码授权(通过指定要执行的命令并使用基于密钥的身份验证),这样的配置是合理的!
- 流行的 SSH 服务器可以使用 PAM 进行授权检查,即使它们自己处理身份验证而没有 PAM/LDAP(
usePAM
→ 除了可能使用“auth”之外,还使用 PAM 中的“account”类别)
确保授权检查,例如设置中的
shadowExpired
属性(shadowAccount
对象类),然后使帐户过期
我认为没有必要以一种能够恢复密码的方式破坏密码,同时又破坏登录 shell 而无法恢复密码。
将整个 LDAP 用户条目移动到 LDAP 服务器上的另一个子树中也应该可以禁用该帐户。—缺点是无法看到用户和组名称例如在剩余的主目录中。如果您的用户管理工具无法找到使用 uid/gid 号码的条目,它可能会决定过早地重新使用 uid/gid 号码。