温馨提示×

ubuntu deluser删除用户后如何文档化

小樊
42
2025-11-15 13:30:52
栏目: 智能运维

Ubuntu 删除用户后的文档化与清理清单

一 文档化目标与范围

  • 目标:形成一份可审计的“用户离职/下线”记录,覆盖执行人时间命令与参数影响评估备份位置验证结果回退方案
  • 范围:围绕账户、权限、认证、计划任务、邮件、家目录与临时文件、应用残留、日志留痕等维度进行记录与清理。

二 建议的文档模板

  • 基本信息
    • 用户名
    • 操作人:<姓名/工号>
    • 执行时间
    • 变更单/工单号:<编号>
  • 执行动作
    • 删除命令:<如:sudo deluser --remove-home ;sudo deluser --group ;sudo userdel -r >
    • 清理动作:<列出具体 rm/crontab/visudo 等命令>
  • 备份信息
    • 家目录备份路径:<如:/backup/home__YYYYMMDD.tar.gz>
    • 邮件备份路径:<如:/backup/mail__YYYYMMDD.tar.gz>
    • 其他应用数据备份:<如:/backup/app__YYYYMMDD.tar.gz>
  • 影响评估
    • 所属/附属组:<列出组名与是否删除>
    • sudo 权限:<是否移除/保留说明>
    • 应用/服务影响:<列出受影响系统或业务>
  • 验证与留痕
    • 验证命令与结果:<id、getent、crontab -l -u、ls、mailq 等输出摘要>
    • 日志留存:<auth.log、syslog 相关片段位置>
  • 回退方案
    • 可回退项:<如备份归档、可恢复的 UID/GID 映射>
    • 回退步骤:<简要命令序列>
  • 审批与复核
    • 审批人:<姓名/工号>
    • 复核人:<姓名/工号>

三 清理与验证要点清单

  • 账户与组
    • 删除用户:优先使用deluser --remove-home ;若已删除主目录,可用**userdel -r **补齐。
    • 删除私有组:若该组仅此用户使用,执行delgroup ;避免误删系统组(如sudoadm等)。
  • 认证与授权
    • 移除 sudo:从sudo组移除(如deluser sudogpasswd -d sudo);如曾在**/etc/sudoers有显式条目,使用visudo**删除对应行。
  • 计划任务
    • 删除用户级 crontab:crontab -u -r;检查系统级目录**/etc/cron.d/**等是否存在以该用户为属主或引用的脚本并清理。
  • 邮件与临时文件
    • 邮件 spool:删除**/var/spool/mail//var/mail/**(若存在)。
    • 临时与缓存:清理**/tmp//var/tmp/**;按需清理用户缓存目录(如应用层缓存)。
  • 家目录与 SSH 密钥
    • 若未使用**–remove-home**,手动删除**/home/**;如曾备份,先归档再清理。
    • 删除 SSH 公钥指纹:从**~/.ssh/authorized_keys**(各主机)及**/etc/ssh/authorized_keys.d/**中移除该用户公钥。
  • 应用残留与系统配置
    • 检查应用专属目录(如**/var/lib///srv**、/opt下以用户属主的文件),按业务规范备份后清理。
    • 检查**/etc/passwd**、/etc/shadow/etc/group/etc/gshadow是否仍有残留条目(仅删除用户相关行,避免破坏系统组)。
  • 日志留痕
    • 保留审计线索:在**/var/log/auth.log**、/var/log/syslog中搜索****相关记录,导出归档,不要就地删除系统日志。
  • 验证
    • 身份与组:id (应返回无此用户);getent passwd 、**getent group **为空。
    • 计划任务:crontab -u -l应提示无任务。
    • 邮件队列:mailqpostqueue -p确认无该用户相关队列。
    • 家目录与 SSH:确认**/home/~/.ssh/authorized_keys**已移除或不再生效。

四 自动化脚本与留痕示例

  • 示例脚本(执行前请先在测试环境验证,并完善备份与审批流程)
#!/usr/bin/env bash
set -Eeuo pipefail

USERNAME="${1:-}"
[[ -z "$USERNAME" ]] && { echo "Usage: $0 <username>"; exit 1; }

LOGFILE="/var/log/user-decommission-$(date +%F).log"
BACKUP_BASE="/backup"
HOME_BACKUP="$BACKUP_BASE/home_${USERNAME}_$(date +%F).tar.gz"
MAIL_BACKUP="$BACKUP_BASE/mail_${USERNAME}_$(date +%F).tar.gz"

exec > >(tee -a "$LOGFILE") 2>&1

echo "=== 开始用户下线 [$USERNAME] 时间: $(date) 操作者: $SUDO_USER ==="

# 0) 备份
echo "[备份] 家目录 -> $HOME_BACKUP"
[[ -d "/home/$USERNAME" ]] && sudo tar czf "$HOME_BACKUP" -C /home "$USERNAME" || echo "[备份] 家目录不存在,跳过"

echo "[备份] 邮件 spool -> $MAIL_BACKUP"
{ sudo tar czf "$MAIL_BACKUP" -C /var/spool/mail "$USERNAME" 2>/dev/null || true; } && \
  echo "[备份] 邮件备份完成" || echo "[备份] 邮件 spool 不存在或无权限,跳过"

# 1) 移除 sudo 权限
if getent group sudo | grep -q "\b$USERNAME\b"; then
  echo "[权限] 从 sudo 组移除 $USERNAME"
  sudo deluser "$USERNAME" sudo || true
fi

# 2) 删除用户(若未使用 --remove-home)
if id "$USERNAME" &>/dev/null; then
  echo "[账户] 删除用户 $USERNAME"
  sudo deluser --remove-home "$USERNAME" || sudo userdel -r "$USERNAME" || true
fi

# 3) 删除私有组(仅当组为空时)
if getent group "$USERNAME" >/dev/null; then
  echo "[组] 尝试删除私有组 $USERNAME"
  sudo delgroup "$USERNAME" 2>/dev/null || echo "[组] $USERNAME 组非空或非私有,跳过"
fi

# 4) 清理计划任务
echo "[任务] 清理 crontab"
sudo crontab -u "$USERNAME" -r 2>/dev/null || true

# 5) 清理 SSH 公钥(各主机 authorized_keys)
echo "[SSH] 清理 authorized_keys 引用"
sudo find /home /root -path "*/.ssh/authorized_keys" -type f -exec grep -l "$USERNAME" {} \; 2>/dev/null | \
  while read keyfile; do
    echo " - 清理 $keyfile 中的 $USERNAME 引用"
    sudo sed -i "/$USERNAME/d" "$keyfile"
  done || true

# 6) 清理临时文件
echo "[临时] 清理 /tmp /var/tmp 中 $USERNAME 相关"
sudo find /tmp /var/tmp -mindepth 1 -maxdepth 1 -name "*${USERNAME}*" -print -delete 2>/dev/null || true

# 7) 验证
echo "[验证] 身份查询"
! id "$USERNAME" &>/dev/null && echo " - id $USERNAME: 不存在(通过)" || echo " - id $USERNAME: 仍存在(需人工核查)"

echo "[验证] crontab"
sudo crontab -u "$USERNAME" -l &>/dev/null && echo " - crontab 仍存在(需人工核查)" || echo " - crontab 已清空(通过)"

echo "[验证] 邮件队列"
if command -v mailq &>/dev/null; then
  mailq | grep -q "$USERNAME" && echo " - 邮件队列仍存在引用(需人工核查)" || echo " - 邮件队列无引用(通过)"
fi

echo "=== 完成 时间: $(date) 归档: $HOME_BACKUP, $MAIL_BACKUP 日志: $LOGFILE ==="
  • 使用说明
    • 将脚本输出同时写入**/var/log/**归档,便于审计与追溯。
    • 在变更单中引用脚本的日志文件路径备份文件路径,并附上关键验证命令的输出摘要

五 注意事项

  • 权限最小化:全程使用sudo并记录操作人时间,避免直接以 root 交互式操作。
  • 先备份再清理:家目录、邮件、应用数据务必先归档再删除,归档文件集中存放并受访问控制。
  • 谨慎处理系统组:不要删除sudoadmdocker等关键系统组;仅移除用户自身的私有组
  • 审计合规:保留auth.log等关键日志的只读归档,不要就地修改或清空系统日志。
  • 变更管控:通过变更单/工单审批,执行后进行复核与验证,并在文档模板中记录回退方案(如备份恢复路径与步骤)。

0