OpenLDAP、Samba 和密码老化

OpenLDAP、Samba 和密码老化

我正在配置一个系统,其中所有 IT 资源都可以通过单个用户密码对访问,无论是访问服务器上的 shell、登录 Samba 域、WiFi、OpenVPN、Mantis 等(访问由组成员身份或用户对象字段管理的特定服务)。因为我们的网络中有个人数据,所以我们需要根据欧盟数据保护指令(或更确切地说是波兰版本)实施密码老化。

问题在于,LDAP 中的 Samba 和 POSIX 帐户使用不同的密码哈希和老化信息。虽然同步密码本身很容易( 中的ldap password sync = Yessmb.conf,但将密码老化添加到组合中会破坏一切:Samba 不会更新 shadowLastChange。与 一起obey pam restrictions = Yes创建了一个系统,其中 Windows 用户无法更改过期密码,但如果我不使用它,则不会自动创建主目录。另一种方法是使用 LDAP 扩展操作来更改密码,但模块smbk5pwd也不会设置它。更糟糕的是,OpenLDAP 维护者不会更新它/接受补丁,因为这个字段被视为已弃用。

所以,我的问题是,最好的解决方案是什么?它们的优点和缺点是什么?

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

    1. 它与 NSS、PAM 模块、samba 和其他系统的配合情况如何?
    2. NSS 和 PAM 模块是否需要以特殊方式配置才能使用 ppolicy 而不是 shadow?
    3. GOsa²与 ppolicy 合作?
    4. 是否有其他可与ppolicy启用 LDAP 的管理工具一起使用?
  2. 编写一个更改密码的脚本来更新 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设置为yespasswd chat设置为*OK*并将passwd program上面的脚本设置为"%u"作为参数。

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

答案3

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

大家好!我让整个系统或多或少地在测试环境中运行起来了……:

  1. 密码策略(包括质量和时间方面)在 OpenLDAP 级别强制执行(得益于ppolicynot24getpasswdqc
  2. 密码在 Samba 和 POSIX 之间双向同步(感谢)。注意:使用 Samba 和 ppolicy进行smbk5pwd质量检查并不明显:(password check script来自pwqcheck -1passwdqc) 需要执行与 LDAP 相同的检查,否则用户将收到“权限被拒绝”而不是“密码太简单,请尝试其他密码”。
  3. PAM 和 Samba 都会警告用户密码即将过期。
  4. 用户目录使用创建pam_mkhomedir
  5. GOsa² 实现的 RFC2307bis(和相关模式)插入uid到组条目中,因此需要 NIS(大多数“UNIXy”内容)或 RFC2307bis 模式(大多数“为 AD 设计”的应用程序)的应用程序可以正常工作。

唯一的问题是禁用帐户需要使用 CLI 工具(或编写 GOsa 后修改脚本),否则帐户不会在 LDAP 级别被锁定,而只会在 PAM 和 Samba 中被锁定。密码过期仍会强制执行,所以这不是什么大问题。

答案4

我从一位 GOsa 开发人员那里得到了答案。目前 GOsa 不以任何方式支持策略覆盖。

相关内容