web-dev-qa-db-ja.com

OpenLDAP、Samba、およびパスワードのエージング

サーバー上のシェルへのアクセス、Sambaドメインへのロギング、WiFi、OpenVPN、Mantisなど(特定のサービスへのアクセスが管理されている)など、すべてのITリソースが単一のユーザーとパスワードのペアで利用できるシステムを構成しています。グループメンバーシップまたはユーザーオブジェクトフィールドによる)。ネットワークには個人データがあるため、EUデータ保護条例(またはポーランド語版)に従って、パスワードエージングを実装する必要があります。

問題は、LDAPのSambaアカウントとPOSIXアカウントが異なるパスワードハッシュとエージング情報を使用することです。パスワード自体を同期するのは簡単です(ldap password sync = Yes in smb.conf)、パスワードエージングをミックスに追加すると問題が発生します:SambaはshadowLastChangeを更新しません。一緒に obey pam restrictions = Yesは、Windowsユーザーが古いパスワードを変更できないシステムを作成しますが、それを使用しないと、ホームディレクトリが自動的に作成されません。別の方法は、パスワードの変更にLDAP拡張操作を使用することですが、smbk5pwdモジュールもそれを設定しません。さらに悪いことに、このフィールドは非推奨と見なされるため、OpenLDAPメンテナはそれを更新/パッチを受け入れません。

だから、私の質問は、最良の解決策は何ですか?それらの長所と短所は何ですか?

  1. LDAP ppolicyと内部LDAPパスワードエージングを使用しますか?

    1. NSS、PAMモジュール、samba、その他のシステムでどの程度うまく機能しますか?
    2. NSSおよびPAMモジュールは、シャドウではなくppolicyを使用するために特別な方法で構成する必要がありますか?
    3. GOsa² ppolicyで動作しますか?
    4. ppolicy対応のLDAPで動作できる他の管理ツールはありますか?
  2. LDAPのフィールドを更新するパスワード変更スクリプトを一緒にハックします。 (ユーザー自身がパスワードを変更せずにフィールドを更新する可能性を残します)

13
Hubert Kario

(作業中です。後で詳細を追加します)

みなさん、朗報です!テスト環境で、多かれ少なかれすべてが機能するようになりました...:

  1. パスワードポリシー(品質と時間の両方)はOpenLDAPレベルで適用されます(ppolicynot24get および passwdqc)に感謝します
  2. パスワードは、SambaとPOSIXの間で両方の方法で同期されます(smbk5pwdのおかげで)。注:Sambaとppolicyを使用した品質チェックは明白ではありません。password check scriptpwqcheck -1 from passwdqc )は、LDAPが実行するのと同じチェックを実行する必要があります。ユーザーは、「パスワードが簡単すぎます。別の方法を試してください」ではなく、アクセスが拒否されました。
  3. PAMとSambaはどちらも、パスワードがまもなく期限切れになることをユーザーに警告します。
  4. ユーザーディレクトリpam_mkhomedirを使用して作成されます
  5. RFC2307bis(および関連するスキーマ)のGOsa²実装は、グループエントリにuidを挿入するため、NIS(ほとんどの「UNIXy」のもの)またはRFC2307bisスキーマ(ほとんどの「AD用に設計された」アプリケーション)のいずれかを期待するアプリケーションは問題なく動作します。

唯一の問題は、アカウントを無効にするにはCLIツールを使用する(またはGOsa postmodifyスクリプトを作成する)必要があることです。そうしないと、PAMとSambaの場合のみ、アカウントがLDAPレベルでロックされません。パスワードの有効期限は引き続き適用されるため、大きな問題にはなりません。

1
Hubert Kario

一時的なギャップとして、パスワードの変更時にshadowLastChangeを更新するSambaのスクリプトを作成しました。

#!/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 syncyesに設定し、passwd chat*OK*に設定し、passwd programを上記のスクリプトに"%u"をパラメーターとして設定する必要があります。

LDAP_USERで指定されたアカウントは、LDAPで作成し、すべてのSambaユーザーのuidで読み取る権限と、shadowLastChangeを書き込む権限を付与する必要があります。

1
Hubert Kario

EXOPパスワードの変更が発生するたびにshadowlastchange属性を更新するために、 shadowLastChange という独自のOpenLDAPオーバーレイを作成しました。 slapd.confでアクティブ化されます。

moduleload smbk5pwd
moduleload shadowlastchange
...

database bdb
...
overlay smbk5pwd
overlay shadowlastchange

EXOPを介してパスワードを変更するようにsmb.confを構成しました。

ldap passwd sync = Only

次に、アカウントごとに、shadowMaxをパスワードが有効な日数に設定します。 OpenLDAPモジュールが残りを処理します!

1
200_success

GOsa開発者の1人から回答があります。現時点では、GOsaはppolicyオーバーレイをサポートしていません。

0
Hubert Kario