我正在开发一个带有中央用户数据库系统的项目。该系统的要求之一是所有应用程序应该只有一组用户。FreeRADIUS 和 Samba 是我的两个应用程序,它们都使用 LDAP 作为后端。由于包含许多其他应用程序的整个系统的用户必须相同,因此我必须从中央数据库读取用户列表,并在 Samba 和 FreeRADIUS 的 LDAP 目录中重新创建它们。问题是用户是从另一个实体发送给我的,我可以使用他们的哈希密码将他们保存在数据库中。我无法访问他们的明文密码。我想知道我是否可以使用我首选的哈希机制在 LDAP 中直接为新用户输入哈希密码。如果不行,有人能告诉我我必须使用什么策略吗?
我在 UBUNTU 12.04 上运行服务器,所有其他应用程序都是最新版本。我的数据库系统是 PostgreSQL 9.2。
谢谢
答案1
由于您使用的是 OpenLDAP,如果您有兼容哈希格式(和这里),您可以输入哈希值直接地进入userPassword
属性。请注意,某些 LDAP 客户端可能会猜测修改userPassword
并应用哈希(类似于某些 LDAP 服务器在写入时自动修改或哈希此属性的方式)。/ldapadd
将ldapmodify
正确更新密码而无需重新解释它(只要您没有服务器密码策略 ppolicy_hash_cleartext
实际上,这可能会使事情变得复杂)。
您需要确定您拥有的格式,并在哈希或哈希+盐格式前加上类型类型作为前缀,例如{SHA}xxxxxx
或{SSHA}xxxxxx
(其中xxxxxx分别是base64编码的哈希或哈希+盐)。
如果它是墓穴格式,您可以使用{crypt}
前缀,但对于 OpenLDAP,您需要使用 进行配置--enable-crypt
,因为其使用已被弃用。OpenLDAP 将使用 C 库crypt()
函数,因此可以特定于平台的变体在其输出中。在 Linux 上有一个简单的解决方法,crypt()
它位于自己的libcrypt
库中,您可以在编译或运行时“调整”。(另请注意,crypt()
它不是可重入的,因此slapd
使用互斥体来保护对它的调用。)另请参阅password-crypt-salt-format
从另一个方向解决问题:让 OpenLDAP 以各种加密格式存储密码。
由于您正在使用 Samba,您还应该研究smbk5pwd覆盖(自述更有用)。请注意,这需要更改密码才能使用正确的密码修改操作而不是直接修改userPassword
。
使用 OpenLDAP,您还可以选择委派外部系统密码验证通过 SASL(也需要非默认构建配置),这在迁移期间可能就足够了,直到所有用户都重置密码。另一个选项(通常令人惊讶)是 OpenLDAP 还支持多种的每个用户都有一个密码,在身份验证期间依次尝试每个密码。虽然有点脆弱(它要求属性的所有作者都userPassword
这样做正确的事情),它可以帮助迁移,尤其是在合并多个系统时。