限制 deluser 使用范围的可行方案
前置要点
推荐做法
# 仅允许 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)。#!/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 *
快速最小示例
%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
注意事项