AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 525432
Accepted
nphull
nphull
Asked: 2019-06-18 06:24:28 +0800 CST2019-06-18 06:24:28 +0800 CST 2019-06-18 06:24:28 +0800 CST

在 RHEL 7 上删除 LDAP 用户后如何清理?

  • 772

我们有一个使用 389 Directory Server for LDAP 的小型网络。我们创建 LDAP 用户,这些用户登录到网络中的各种机器,然后有时我们会删除这些用户。但是,删除 LDAP 用户后,工件仍保留在用户访问的每个系统上。我什至不知道留下的所有内容,但我已经确定了以下内容:主目录、sssd 缓存条目和 AccountsService 缓存条目。除了文件系统上的剩余部分,这会导致已删除的用户出现在 gdm 登录屏幕上,如果使用与已删除用户相同的 uid 或用户名创建新的 LDAP 用户,则会导致问题(显示错误的名称或无法创建主目录和 gdm 返回登录屏幕)。删除 LDAP 用户后如何清理每个本地系统?

这就是我到目前为止所拥有的:杀死他们所有的进程,删除他们的主目录sss_cache -E,,,。我还缺少什么或者有更好的方法吗?systemctl restart sssdsystemctl restart accounts-daemon

即使您有完整的清理程序或脚本,您是否在每个系统上手动运行它?有没有一种自动清理 LDAP 删除的好方法?我尝试使用删除后回调制作 389 Directory Server Post-Operation 插件,但无法让 389 Directory Server 加载插件。当我尝试使用 ldapmodify 添加插件时,它失败了:ldap_add: Server is unwilling to perform (53) additional info: Invalid plugin path myplugin.so - failed to open library. 第一次看到这个错误时,我发现 systemd 日志条目显示 SELinux 正在阻止执行,但是在采取推荐的操作之后,我现在在 systemd 和 dirsrv 日志中看不到任何有用的信息,所以我不知道它为什么会失败。

rhel ldap
  • 1 1 个回答
  • 1418 Views

1 个回答

  • Voted
  1. Best Answer
    nphull
    2019-09-04T09:05:00+08:002019-09-04T09:05:00+08:00

    我的解决方案是在用户删除时手动运行脚本,并让 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 中。

    • 1

相关问题

  • 为什么 Linux 会杀死我的进程?

  • linux redhat 7 ( 或 centos 7 ) + firewalld 屏蔽防火墙

  • systemctl 命令在 RHEL 6 中不起作用

  • 如何在 RHEL 7 上离线安装 docker?

  • 在 Gnome3 中禁用窗口的自动最大化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve