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

怎样限制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

这里有几个要点:

通过包装脚本做二次校验

这种方式更灵活,也更容易集成审计和二次确认。思路是:禁止直接调用 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。

环境与流程控制

除了技术层面的授权,流程上的管控同样重要:

快速最小示例

假设需求更具体:仅允许 op 组成员删除名称以 app- 开头的系统用户,同时禁止使用 --force--remove-home

步骤很简单:

  1. 编辑 sudoers:
    %op ALL=(root) /usr/sbin/deluser --system --quiet 'app-*'
  2. 验证:
    sudo -l -U op   # 查看 op 的可用权限
    sudo deluser --force app-foo   # 被拒绝(含 --force)
    sudo deluser app-bar           # 成功(匹配白名单且无非授权选项)
  3. 审计:
    grep deluser /var/log/auth.log

注意事项

删除用户前,务必确认其是否仍在登录或还有进程在运行。如果未使用 --forcedeluser 会拒绝删除,这其实是一种保护机制。而强制删除(--force)风险极高,应当被严格限制。

更重要的是,删除操作不可逆。务必要在删除前备份重要数据,并在变更窗口内执行,避免影响业务连续性。

本文转载于:https://www.yisu.com/ask/5545394.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。