我正在配置一个系统,其中所有 IT 资源都可以通过单个用户密码对访问,无论是访问服务器上的 shell、登录 Samba 域、WiFi、OpenVPN、Mantis 等(访问由组成员身份或用户对象字段管理的特定服务)。因为我们的网络中有个人数据,所以我们需要根据欧盟数据保护指令(或更确切地说是波兰版本)实施密码老化。
问题在于,LDAP 中的 Samba 和 POSIX 帐户使用不同的密码哈希和老化信息。虽然同步密码本身很容易( 中的ldap password sync = Yes
)smb.conf
,但将密码老化添加到组合中会破坏一切:Samba 不会更新 shadowLastChange。与 一起obey pam restrictions = Yes
创建了一个系统,其中 Windows 用户无法更改过期密码,但如果我不使用它,则不会自动创建主目录。另一种方法是使用 LDAP 扩展操作来更改密码,但模块smbk5pwd
也不会设置它。更糟糕的是,OpenLDAP 维护者不会更新它/接受补丁,因为这个字段被视为已弃用。
所以,我的问题是,最好的解决方案是什么?它们的优点和缺点是什么?
使用 LDAP
ppolicy
和内部 LDAP 密码老化?- 它与 NSS、PAM 模块、samba 和其他系统的配合情况如何?
- NSS 和 PAM 模块是否需要以特殊方式配置才能使用 ppolicy 而不是 shadow?
- 做GOsa²与 ppolicy 合作?
- 是否有其他可与
ppolicy
启用 LDAP 的管理工具一起使用?
编写一个更改密码的脚本来更新 LDAP 中的字段。(用户自己可能会在不更改密码的情况下更新该字段)
答案1
我编写了自己的 OpenLDAP 覆盖层,名为shadowlastchange
每当 EXOP 密码发生更改时更新shadowLastChange
属性。它在以下情况下激活slapd.conf
:
moduleload smbk5pwd
moduleload shadowlastchange
...
database bdb
...
overlay smbk5pwd
overlay shadowlastchange
我已配置smb.conf
通过 EXOP 更改密码:
ldap passwd sync = Only
然后,为每个帐户设置shadowMax
密码有效的天数。OpenLDAP 模块会处理其余的事情!
答案2
作为权宜之计,我为 Samba 创建了脚本,它将shadowLastChange
在密码更改时进行更新:
#!/bin/sh
# script to update shadowLastChange when samba updates passwords
# it's not needed when using 'passwd', it does update the field,
# even if pam_ldap is using LDAP Extented Operation to change password
LDAP_MODIFY="/usr/bin/ldapmodify"
LDAP_SEARCH="/usr/bin/ldapsearch"
LDAP_USER="uid=shadow-update,ou=Services,dc=example,dc=com"
LDAP_PASSWORD="change-me"
LDAP_HOST="localhost"
# get date
SLC=$((`date '+%s'` / 24 / 3600))
# get user login name
user=$1
# find user's DN
dn=$($LDAP_SEARCH -x -h $LDAP_HOST -LLL -b dc=example,dc=com "(uid=$user)" dn)
dn=${dn#dn:}
# check if DN is not base64 encoded
if [ "${dn:0:1}" = ":" ]; then
# update password change date
echo "dn:$dn
changetype: modify
replace: shadowLastChange
shadowLastChange: $SLC" | cat | $LDAP_MODIFY -x -h "$LDAP_HOST" \
-D "$LDAP_USER" -w "$LDAP_PASSWORD" > /dev/null 2>&1
else
# update password change date
echo "dn: $dn
changetype: modify
replace: shadowLastChange
shadowLastChange: $SLC" | cat | $LDAP_MODIFY -x -h "$LDAP_HOST" \
-D "$LDAP_USER" -w "$LDAP_PASSWORD" > /dev/null 2>&1
fi
err=$?
if [ ! $err -eq 0 ]; then
echo "error: can't update shadowLastChange: $err"
echo "`date`: shadow.sh: can't update shadowLastChange: $err"\
>> /var/log/shadow-update.log
exit;
fi
echo OK
在 Samba 配置中,它需要unix password sync
设置为yes
,passwd chat
设置为*OK*
并将passwd program
上面的脚本设置为"%u"
作为参数。
需要在 LDAP 中创建一个指定的帐户LDAP_USER
,并授予所有 Samba 用户的读取权限uid
和写入权限shadowLastChange
。
答案3
(正在进行中,稍后我会添加详细信息)
大家好!我让整个系统或多或少地在测试环境中运行起来了……:
- 密码策略(包括质量和时间方面)在 OpenLDAP 级别强制执行(得益于
ppolicy
,not24get
和passwdqc
) - 密码在 Samba 和 POSIX 之间双向同步(感谢)。注意:使用 Samba 和 ppolicy进行
smbk5pwd
质量检查并不明显:(password check script
来自pwqcheck -1
passwdqc
) 需要执行与 LDAP 相同的检查,否则用户将收到“权限被拒绝”而不是“密码太简单,请尝试其他密码”。 - PAM 和 Samba 都会警告用户密码即将过期。
- 用户目录是使用创建
pam_mkhomedir
- GOsa² 实现的 RFC2307bis(和相关模式)插入
uid
到组条目中,因此需要 NIS(大多数“UNIXy”内容)或 RFC2307bis 模式(大多数“为 AD 设计”的应用程序)的应用程序可以正常工作。
唯一的问题是禁用帐户需要使用 CLI 工具(或编写 GOsa 后修改脚本),否则帐户不会在 LDAP 级别被锁定,而只会在 PAM 和 Samba 中被锁定。密码过期仍会强制执行,所以这不是什么大问题。
答案4
我从一位 GOsa 开发人员那里得到了答案。目前 GOsa 不以任何方式支持策略覆盖。