OpenLDAP,Samba和密码老化

我正在configuration一个系统,其中所有IT资源都可以通过一个用户口令对访问,无论是访问服务器上的shell,login到Samba,WiFi,OpenVPN,Mantis等(访问特定的服务pipe理按组成员身份或用户对象字段)。 由于我们在我们的networking中有个人数据,所以我们需要按照欧盟数据保护指令(或其波兰版本)执行密码老化。

问题是LDAP中的Samba和POSIX帐户使用不同的密码哈希和老化信息。 虽然同步密码本身很简单( smb.confldap password sync = Yes ),但是将密码老化添加到混合中会破坏以下内容:Samba不更新shadowLastChange。 与obey pam restrictions = Yes一起obey pam restrictions = Yes创build一个Windows用户不能更改老化密码的系统,但是如果我不使用它,主目录将不会自动创build。 另一种方法是使用LDAP扩展操作来更改密码,但是smbk5pwd模块也没有设置它。 更糟糕的是,OpenLDAP的维护者不会更新/接受补丁,因为这个字段被认为是不赞成的。

所以,我的问题是,最好的解决scheme是什么? 他们有什么缺点?

  1. 使用LDAP ppolicy和内部LDAP密码老化?

    1. 它与NSS,PAM模块,samba,其他系统有什么关系?
    2. NSS和PAM模块是否需要特殊configuration才能使用ppolicy而不是shadow?
    3. GOsa²与ppolicy 一起工作吗?
    4. 是否有其他的pipe理工具,可以使用ppolicy LDAP?
  2. 共同修改更新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设置为yespasswd chat设置为*OK*并将passwd program"%u"作为parameter passing给上面的脚本。

LDAP_USER指定的帐户需要在LDAP中创build,并赋予权限读取所有Samba用户的uid和写入shadowLastChange

我有一个GOsa开发者的回答。 目前,GOsa不支持ppolicy覆盖。

(工作正在进行中,稍后我会添加详细信息)

大家好消息! 我在一个testing环境中或多或less地完成了所有工作……:

  1. 密码策略(包括质量和时间)在OpenLDAP级别上执行(感谢ppolicynot24getpasswdqc
  2. 密码在Samba和POSIX之间以两种方式同步(感谢smbk5pwd )。 注意:使用Samba和ppolicy进行质量检查并不明显: password check script (来自passwdqc pwqcheck -1 )需要执行与LDAP相同的检查,否则用户将获得“权限被拒绝”而不是“密码过于简单,尝试不同” 。
  3. PAM和Samba都警告用户密码很快就会过期。
  4. 用户目录使用pam_mkhomedir创build的
  5. GOsa²RFC2307bis(和相关模式)的实现插入uid到组条目,所以期望NIS(大部分是“UNIXy”)或RFC2307bis模式(大部分是为ADdevise的)的应用程序工作得很好。

唯一的问题是,禁用帐户需要使用CLI工具(或者编写GOsa postmodify脚本),否则该帐户将不会被locking在LDAP级别,仅用于PAM和Samba。 密码到期仍然会执行,所以这不是一个大问题。