在 Linux 系统管理中,deluser 命令虽然好用,但也属于典型的高危操作——毕竟它直接操作的是用户账户,一旦误删就可能引发权限混乱甚至业务中断。所以问题来了:能否在不彻底禁止该命令的前提下,精准限制它的使用范围?换句话说,怎么让人“能删但删不了不该删的”?

前置要点
deluser 在 Debian/Ubuntu 上执行时需 root 或 sudo 权限,默认不会删除用户的家目录和邮件目录,只有显式指定 --remove-home 等选项才会清除。此外,如果用户仍有登录会话或进程在运行,deluser 会拒绝删除,除非使用 --force 强制。因此,限制的核心在于:控制谁能执行、能删除哪些用户、能带哪些选项。这才是降低风险的关键。
推荐做法
使用 sudoers 精确授权
这一思路的核心是“最小权限原则”:只授予必要权限,禁止危险选项,并限制可操作的用户名范围。
常见做法是通过 /etc/sudoers 或 /etc/sudoers.d/ 下的自定义文件来配置。举个例子:
# 仅允许 op 组在 test 子系统中删除“test-”前缀的账户,且禁止危险选项
%op ALL=(root) /usr/sbin/deluser --system --quiet 'test-*'
# 仅允许 alice 删除用户 bob(精确匹配),且不允许任何额外选项
alice ALL=(root) /usr/sbin/deluser bob
# 允许 devops 删除除 root、admin、ubuntu 之外的任意用户(黑名单方式)
%devops ALL=(root) /usr/sbin/deluser --system --quiet \
'!/usr/sbin/deluser --system --quiet root' \
'!/usr/sbin/deluser --system --quiet admin' \
'!/usr/sbin/deluser --system --quiet ubuntu' \
ALL
这里有几个要点:
- 实际路径需替换为
which deluser的输出(常见为/usr/sbin/deluser)。 - 通过精确用户名或通配符来限制目标用户;通过命令前缀的方式禁止
--force、--remove-home等危险开关。 - 从安全角度出发,优先使用“白名单”(允许列表)来最小化风险。
通过包装脚本做二次校验
这种方式更灵活,也更容易集成审计和二次确认。思路是:禁止直接调用 deluser,统一走受控脚本,脚本内部处理所有校验逻辑。
下面是一个脚本示例(/usr/local/bin/safe-deluser):
#!/usr/bin/env bash
set -euo pipefail
LOG="/var/log/safe-deluser.log"
ALLOWED_USERS=(alice bob)
BANNED_USERS=(root admin ubuntu)
if [[ " ${ALLOWED_USERS[*]} " != *" $SUDO_USER "* ]]; then
echo "ERROR: $SUDO_USER not allowed" | tee -a "$LOG"
exit 1
fi
if [[ " ${BANNED_USERS[*]} " == *" $1 "* ]]; then
echo "ERROR: deleting $1 is forbidden" | tee -a "$LOG"
exit 1
fi
# 禁止危险选项
for arg in "$@"; do
case "$arg" in
--force|--remove-home|--purge-home|--remove-all-files)
echo "ERROR: dangerous option $arg is not allowed" | tee -a "$LOG"
exit 1
;;
esac
done
echo "$(date -u) $SUDO_USER deleting $*" >> "$LOG"
exec /usr/sbin/deluser --system --quiet "$@"
授权方式也很直接:
%op ALL=(root) /usr/local/bin/safe-deluser *
这种方式的好处是:权限控制和业务逻辑解耦,审计日志直接集成在脚本中,未来修改规则只需改动脚本本身,无需调整 sudoers。
环境与流程控制
除了技术层面的授权,流程上的管控同样重要:
- 禁止 root 直接登录,所有操作统一通过 sudo 执行;将要执行删除操作的账号加入受控组(如
op),再在组内细化授权。 - 开启审计与日志:确保 sudo 日志与系统审计(如 auditd)记录了关键操作,便于事后追溯。
- 操作前强制备份与复核:删除前备份目标用户数据,执行时二次确认,降低误删风险。
快速最小示例
假设需求更具体:仅允许 op 组成员删除名称以 app- 开头的系统用户,同时禁止使用 --force 和 --remove-home。
步骤很简单:
- 编辑 sudoers:
%op ALL=(root) /usr/sbin/deluser --system --quiet 'app-*' - 验证:
sudo -l -U op # 查看 op 的可用权限 sudo deluser --force app-foo # 被拒绝(含 --force) sudo deluser app-bar # 成功(匹配白名单且无非授权选项) - 审计:
grep deluser /var/log/auth.log
注意事项
删除用户前,务必确认其是否仍在登录或还有进程在运行。如果未使用 --force,deluser 会拒绝删除,这其实是一种保护机制。而强制删除(--force)风险极高,应当被严格限制。
更重要的是,删除操作不可逆。务必要在删除前备份重要数据,并在变更窗口内执行,避免影响业务连续性。