RHEL 7でLDAPユーザーを削除してクリーンアップする方法は?

RHEL 7でLDAPユーザーを削除してクリーンアップする方法は?

私たちは、LDAP用の389 Directory Serverを使用する小規模ネットワークを持っています。私たちはLDAPユーザーを作成し、これらのユーザーはネットワーク上のさまざまなコンピューターにログインし、時にはこれらのユーザーを削除します。ただし、LDAPユーザーを削除した後も、ユーザーがアクセスするすべてのシステムにアーティファクトが残ります。残りのすべてがわかりませんが、ホームディレクトリ、sssdキャッシュエントリ、およびAccountsServiceキャッシュエントリは識別されました。ファイルシステムの残りの部分に加えて、削除されたユーザーがgdmログイン画面に表示され、削除されたユーザーと同じuidまたはユーザー名で新しいLDAPユーザーが作成されると問題が発生します(エラー表示)。名前を指定または作成できません)ホームディレクトリを入力し、gdmはログイン画面に戻ります。 LDAPユーザーを削除した後に各ローカルシステムをクリーンアップする方法は?

これが私が今まで持っていることです:すべてのプロセスを終了し、そのホームディレクトリを削除しますsss_cache -E、、、systemctl restart sssdsystemctl 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にあるとします。

関連情報