私たちは、LDAP用の389 Directory Serverを使用する小規模ネットワークを持っています。私たちはLDAPユーザーを作成し、これらのユーザーはネットワーク上のさまざまなコンピューターにログインし、時にはこれらのユーザーを削除します。ただし、LDAPユーザーを削除した後も、ユーザーがアクセスするすべてのシステムにアーティファクトが残ります。残りのすべてがわかりませんが、ホームディレクトリ、sssdキャッシュエントリ、およびAccountsServiceキャッシュエントリは識別されました。ファイルシステムの残りの部分に加えて、削除されたユーザーがgdmログイン画面に表示され、削除されたユーザーと同じuidまたはユーザー名で新しいLDAPユーザーが作成されると問題が発生します(エラー表示)。名前を指定または作成できません)ホームディレクトリを入力し、gdmはログイン画面に戻ります。 LDAPユーザーを削除した後に各ローカルシステムをクリーンアップする方法は?
これが私が今まで持っていることです:すべてのプロセスを終了し、そのホームディレクトリを削除しますsss_cache -E
、、、systemctl restart sssd
。systemctl restart accounts-daemon
私が逃したことがあるか、より良い方法がありますか?
完全なクリーンアッププロセスやスクリプトがあっても、すべてのシステムで手動で実行しますか? LDAP削除を自動的にクリーンアップする良い方法はありますか?削除後、コールバックを使用して389 Directory Serverポストジョブプラグインを作成しようとしましたが、389 Directory Serverからプラグインをロードできませんでした。 ldapmodifyを使用してプラグインを追加しようとすると失敗しますldap_add: Server is unwilling to perform (53) additional info: Invalid plugin path myplugin.so - failed to open library
。このエラーを初めて見たときにSELinuxが実行をブロックしていることを示すsystemdログエントリが見つかりましたが、推奨処置を実行した後にsystemdまたはdirsrvログに有用なものが表示されないため、失敗の理由はわかりません。 。
答え1
私の解決策は、ユーザーが削除されたときにスクリプトを手動で実行し、削除時にホストが切断された場合に備えて、cronジョブに各ホストで定期的にスクリプトを実行させることでした。私のスクリプト:
#!/bin/bash
purge() { # usage: purge <USER_NAME> <USER_ID>
local USER_NAME=$1
local USER_ID=$2
if loginctl | awk '{print $2}' | grep -q $USER_ID
then
loginctl kill-user $USER_ID
fi
/usr/sbin/sss_cache -u $USER_NAME
rm -rf /home/$USER_NAME
rm -f /var/lib/AccountsService/users/$USER_NAME
USERS_PURGED=true
{
sleep 10
if loginctl | awk '{print $2}' | grep -q $USER_ID
then
loginctl terminate-user $USER_ID
fi
pkill -u $USER_ID
echo "Purged user $USER_NAME" | systemd-cat -t ldap-cleanup
} &
}
# Require root
if [ "$UID" != 0 ]
then
>&2 echo "Please run this script as root."
exit 1
fi
# Get LDAP users
LDAP_RESULT=$(ldapsearch -x -LLL uid=* uid uidNumber)
if [[ $? != 0 ]]
then
>&2 echo "LDAP query failed"
exit 1
fi
declare -A LDAP_USERS
LDAP_USER_NAMES=($(echo "$LDAP_RESULT" | sed -n 's/uid: //p'))
LDAP_UIDS=($(echo "$LDAP_RESULT" | sed -n 's/uidNumber: //p'))
if [[ ${#LDAP_USER_NAMES[@]} != ${#LDAP_UIDS[@]} ]]
then
# This shouldn't happen
>&2 echo "LDAP user name and UID arrays are different lengths!"
exit 1
fi
for i in ${!LDAP_USER_NAMES[@]}
do
LDAP_USERS["${LDAP_USER_NAMES[$i]}"]="${LDAP_UIDS[$i]}"
done
# Check local users against LDAP users
HOME_DIRS=$(ls -n /home | tail -n +2 )
LOCAL_USER_NAMES=($(echo "$HOME_DIRS" | awk '{print $9}'))
LOCAL_UIDS=($(echo "$HOME_DIRS" | awk '{print $3}'))
for i in ${!LOCAL_USER_NAMES[@]}
do
USER_NAME=${LOCAL_USER_NAMES[$i]}
USER_ID=${LOCAL_UIDS[$i]}
if [[ ! ${LDAP_USERS[$USER_NAME]+x} ]]
then
if ! grep -q "^${USER_NAME}:" /etc/passwd
then
# Defunct LDAP user (user not in /etc/passwd nor LDAP)
purge $USER_NAME $USER_ID
fi
elif [[ $USER_ID != ${LDAP_USERS[$USER_NAME]} ]]
then
if ! grep -q "^${USER_NAME}:" /etc/passwd
then
# Recreated LDAP user (different UID)
purge $USER_NAME $USER_ID
else
>&2 echo "User ${USER_NAME} has a different UID in LDAP: local UID: $USER_ID, LDAP: ${LDAP_USERS[$USER_NAME]}"
fi
fi
done
if [ "$USERS_PURGED" = true ]
then
# This should clean up the gdm user selection screen
systemctl restart sssd
systemctl restart accounts-daemon
fi
私はそれが素晴らしいと言うことではありませんが、それは私のニーズには十分です。すべてのユーザーのホームディレクトリが/ homeにあるとします。