LDAP用户离职后完全禁用其多认证混合服务访问的最佳实践及相关问题问询
首先得说,继承老集群搞权限管理确实头大,你已经考虑到shell和pwdAccountLockedTime这两点,已经比很多人起步稳了,咱们逐个解决你的问题:
关于Concern-1:SSH日志里的“接受认证→立刻断开”是否需要担心?
完全不用太紧张!当你把用户shell设为/bin/false时,SSH确实会先完成认证(所以日志里有Accepted),但会话启动后shell立刻退出,用户没有任何机会执行命令、发送有效数据包或者进行任何操作——整个会话生命周期就几毫秒,连交互的机会都没有。
不过如果看着这些日志闹心,或者想从源头避免“先接受再拒绝”的流程,你可以调整sshd_config:
- 用
Match User <离职用户名>块,加上ForceCommand /bin/false或者直接DenyUsers(但批量管理的话不太方便) - 配置PAM的
pam_ldap模块,在认证阶段就检查账户状态,直接拒绝,而不是等到会话启动后再断开
关于Exception-1B:nslcd覆盖loginShell的解决方案
除了修改nslcd.conf去掉shell override,还有几个更灵活的方案,适合老集群的批量管理:
1. 用LDAP标准禁用属性替代shell控制
放弃依赖loginShell,改用LDAP自带的账户锁定属性,确保nslcd和PAM都检查这些属性:
- 已经在用的
pwdAccountLockedTime: 000001010000Z(这是RFC标准的账户锁定属性,大部分LDAP客户端都支持) - 如果是OpenLDAP,可以用
nsAccountLock: TRUE标记账户锁定 - 还可以设置
shadowExpire为一个过去的日期(比如1,对应1970年1月1日),让系统认为账户已过期
然后配置nslcd.conf确保这些属性被同步到本地,同时在PAM配置(比如/etc/pam.d/sshd)里加入对这些属性的检查,比如pam_ldap.so check_account_expired check_lock_time
2. 在nslcd里动态覆盖shell(针对禁用用户)
如果不想改全局的shell override,可以在nslcd.conf里加条件判断:
filter passwd (|(!(pwdAccountLockedTime=*))(pwdAccountLockedTime=000001010000Z)) map passwd loginShell "/bin/false" if (pwdAccountLockedTime=000001010000Z)
这样只要用户的pwdAccountLockedTime是锁定值,nslcd就会把shell映射为/bin/false,覆盖原来的override设置
3. 用PAM直接拦截禁用用户
不管nslcd怎么处理shell,在PAM层面直接拒绝锁定用户的认证请求。比如在/etc/pam.d/common-auth里加入:
auth required pam_ldap.so check_lock_time
这样认证阶段就会检查pwdAccountLockedTime,直接拒绝锁定用户,连SSH认证都不会通过
更精简的统一解决方案
其实最好的方式是统一用LDAP属性标记禁用用户,让所有服务都检查这些属性,而不是分散处理shell、web服务、SSH等:
- 统一标记规则:所有离职用户都设置
pwdAccountLockedTime: 000001010000Z,同时可选设置shadowExpire: 1和nsAccountLock: TRUE(兼容不同服务的LDAP客户端) - SSH层面:确保
sshd_config用UsePAM yes,PAM配置检查LDAP账户状态,同时可以关闭基于LDAP的SSH密钥认证(如果用户密钥存在LDAP里的话),或者清空用户的sshPublicKey属性 - Web服务层面:修改web应用的LDAP认证逻辑,查询
pwdAccountLockedTime或nsAccountLock属性,只要标记为锁定就拒绝登录 - 批量管理:把离职用户加入一个
disabled-usersLDAP组,然后所有服务配置拒绝该组的访问(比如SSH的DenyGroups disabled-users,PAM的pam_listfile.so检查组)
有没有遗漏的风险点?
你已经覆盖了主要场景,但还有几个细节要注意:
- 定时任务(Cron):离职用户的cron任务可能还会运行,因为cron默认不检查账户锁定状态。可以配置
/etc/pam.d/cron加入pam_ldap.so check_lock_time,或者直接删除用户的cron任务 - Sudo权限:如果离职用户有sudo权限,即使账户锁定,有些配置下sudo可能仍允许操作?确保sudo配置也检查LDAP账户状态,或者把用户从sudo组移除
- 本地缓存:如果服务器用了nscd之类的缓存服务,要手动刷新缓存,避免禁用状态没有及时同步
- 其他非LDAP依赖服务:比如有些服务可能把用户信息同步到本地数据库,要确保这些服务也同步禁用状态
备注:内容来源于stack exchange,提问作者AGI-Chandler

