我正在configuration一个系统,其中所有IT资源都可以通过一个用户口令对访问,无论是访问服务器上的shell,login到Samba域,WiFi,OpenVPN,Mantis等(访问特定的服务pipe理按组成员身份或用户对象字段)。 由于我们在我们的networking中有个人数据,所以我们需要按照欧盟数据保护指令(或其波兰版本)执行密码老化。
问题是LDAP中的Samba和POSIX帐户使用不同的密码哈希和老化信息。 虽然同步密码本身很简单( smb.conf的ldap password sync = Yes ),但是将密码老化添加到混合中会破坏以下内容:Samba不更新shadowLastChange。 与obey pam restrictions = Yes一起obey pam restrictions = Yes创build一个Windows用户不能更改老化密码的系统,但是如果我不使用它,主目录将不会自动创build。 另一种方法是使用LDAP扩展操作来更改密码,但是smbk5pwd模块也没有设置它。 更糟糕的是,OpenLDAP的维护者不会更新/接受补丁,因为这个字段被认为是不赞成的。
所以,我的问题是,最好的解决scheme是什么? 他们有什么缺点?
使用LDAP ppolicy和内部LDAP密码老化?
ppolicy LDAP? 共同修改更新LDAP中字段的更改密码脚本。 (留下用户自己更新密码而不更改密码的可能性)
我写了一个名为shadowLastChange自己的OpenLDAP overlay来更新shadowLastChange属性,只要发生EXOP密码更改。 它在slapd.conf激活:
moduleload smbk5pwd moduleload shadowlastchange ... database bdb ... overlay smbk5pwd overlay shadowlastchange
我已经configurationsmb.conf通过EXOP更改密码:
ldap passwd sync = Only
然后,对于每个帐户,将shadowMax设置为密码有效的天数。 其余的OpenLDAP模块负责处理!
作为一个创新脚本,我为Samba创build了脚本,它将更新密码更改的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
在Sambaconfiguration中,需要将unix password sync设置为yes , passwd chat设置为*OK*并将passwd program以"%u"作为parameter passing给上面的脚本。
在LDAP_USER指定的帐户需要在LDAP中创build,并赋予权限读取所有Samba用户的uid和写入shadowLastChange 。
我有一个GOsa开发者的回答。 目前,GOsa不支持ppolicy覆盖。
(工作正在进行中,稍后我会添加详细信息)
大家好消息! 我在一个testing环境中或多或less地完成了所有工作……:
ppolicy , not24get和passwdqc ) smbk5pwd )。 注意:使用Samba和ppolicy进行质量检查并不明显: password check script (来自passwdqc pwqcheck -1 )需要执行与LDAP相同的检查,否则用户将获得“权限被拒绝”而不是“密码过于简单,尝试不同” 。 pam_mkhomedir创build的 uid到组条目,所以期望NIS(大部分是“UNIXy”)或RFC2307bis模式(大部分是为ADdevise的)的应用程序工作得很好。 唯一的问题是,禁用帐户需要使用CLI工具(或者编写GOsa postmodify脚本),否则该帐户将不会被locking在LDAP级别,仅用于PAM和Samba。 密码到期仍然会执行,所以这不是一个大问题。