我拥有一个庞大的用户群 (>>1000),应该能够共同使用一些共享服务。
用户群正在缓慢但持续地变化。
特别是我们对特权分离不感兴趣(所有用户都是平等的),因此从特权角度来看,他们可以共享一个帐户。但是,出于安全原因,我们不能使用共享凭据。幸运的是,所有用户都可以通过 LDAP 获得自己的用户名/密码。
因此我们实现了一个登录服务器(Debian 上的 ssh),人们通过 PAM 和 OpenLDAP 进行身份验证。
现在 LDAP 服务器没有提供太多信息,只有用户名和身份验证能力。特别是,它缺少objectClass: posixAccount
和附带的属性
uidNumber
gidNumber
loginShell
homeDirectory
我对 LDAP 服务器的访问非常有限(特别是我无法要求添加这些或任何其他属性),基本上它只允许我对用户进行身份验证。
现在的好消息是,我不太在意所有用户的这些属性是否具有相同的值。
所以我最终实现了一个使用translucent
覆盖来添加缺失属性的代理 LDAP 服务器。覆盖数据是通过一个脚本生成的,该脚本从上游 LDAP 数据创建一个精简的 LDIF 文件,然后使用该文件填充半透明数据库。
这可以正常工作,但是从可维护性的角度来看我不喜欢它:因为用户群在变化,我需要定期手动更新数据库(它很少变化 - 每隔几个月 - 所以工作量不大但也很容易忘记)。
因为覆盖数据太简单了(所有对象都有相同的属性/值),我认为一定有更好的方法。理想情况下,我希望有一个覆盖,可以将这些属性添加到全部对象(匹配给定的搜索词)。
为了使事情稍微复杂一些,我们还针对另一个提供posixAccount
数据的 LDAP 服务器对另一个用户群进行身份验证;这个组的用户当然不应该受到另一个组所需的所有覆盖魔法的影响;我认为这排除了在 PAM 方面所做的任何魔法。
答案1
原始建议:
我建议使用nss-pam-ldapd 包并使用nslcd 映射当 ldap 没有提供任何值时,为用户帐户提供默认值。
根据 nslcd.conf 的文档,uid/gid 也可以得出:
密码和组映射中的 uidNumber 和 gidNumber 属性可以映射到 objectSid,后跟域 SID,以从 SID 派生数字用户和组 ID(例如,objectSid:S-1-5-21-3623811015-3361044348-30300820)。
选项 #2a:
所以根据您提到的内容,您似乎需要保留目录的镜像。
您能否简单地更新您现有的脚本,使其非破坏性地工作(即仅添加它在本地找不到的帐户/属性)并让它每天通过 cron 运行一次?
选项 #2b
对此的一个变体是,如果您可以设置本机单向 LDAP 复制(从上游目录到本地目录),然后使用由日志中的事件触发的覆盖或脚本(依次执行本地 ldapmodify)来提供缺失的属性?