Domain

OpenLDAP、Samba 和密碼老化

  • December 20, 2011

我正在配置一個系統,其中所有 IT 資源都可通過單個使用者密碼對獲得,無論是訪問伺服器上的 shell、登錄 Samba 域、WiFi、OpenVPN、Mantis 等(訪問受管理的特定服務)按組成員身份或使用者對象欄位)。因為我們的網路中有個人數據,所以我們需要根據歐盟數據保護指令(或者更確切地說是它的波蘭版本)實施密碼老化。

問題在於 LDAP 中的 Samba 和 POSIX 帳戶使用不同的密碼散列和老化資訊。雖然同步密碼本身很容易(ldap password sync = Yesin smb.conf),但將密碼老化添加到混合中會破壞一些事情:Samba 不會更新 shadowLastChange。一起obey pam restrictions = Yes創建了一個windows使用者無法更改舊密碼的系統,但如果我不使用它,則不會自動創建主目錄。另一種方法是使用 LDAP 擴展操作來更改密碼,但smbk5pwd模組也沒有設置它。更糟糕的是,OpenLDAP 維護者不會更新它/接受更新檔,因為該欄位被認為已棄用。

所以,我的問題是,最好的解決方案是什麼?它們的優點和缺點是什麼?

  1. 使用 LDAPppolicy和內部 LDAP 密碼老化?

  2. 它與 NSS、PAM 模組、samba 和其他系統的工作情況如何?

  3. NSS 和 PAM 模組是否需要以特殊方式配置才能使用 ppolicy,而不是 shadow?

  4. GOsa²是否適用於 ppolicy?

  5. 是否有其他管理工具可以與ppolicy啟用的 LDAP 一起使用?

  6. 修改一個更改密碼腳本,用於更新 LDAP 中的欄位。(留下使用者自己更新欄位而不更改密碼的可能性)

我編寫了自己的 OpenLDAP 覆蓋,呼叫它來在 EXOP 密碼更改時shadowlastchange更新屬性。shadowLastChange它在以下位置啟動slapd.conf

moduleload smbk5pwd
moduleload shadowlastchange
...

database bdb
...
overlay smbk5pwd
overlay shadowlastchange

我已配置smb.conf通過 EXOP 更改密碼:

ldap passwd sync = Only

然後,對於每個帳戶,設置shadowMax密碼的有效天數。OpenLDAP 模組負責其餘的工作!

作為權宜之計,我為 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_USER需要在 LDAP 中創建一個在 中指定的帳戶,並授予uid所有 Samba 使用者的讀取權限和寫入權限shadowLastChange

引用自:https://serverfault.com/questions/185925