应为监控用户配置最小化sudo权限闭环:仅授权绝对路径的必要命令、限制执行身份、重置环境变量、启用独立日志审计,并通过别名统一管理多用户。

为监控系统用户(如 zabbix、prometheus 或自定义的 monuser)配置专用受限 sudo 权限,核心是“只给刚好够用的命令”,不开放 shell、不限制密码策略、不暴露敏感路径。这不是加个组就完事,而是从命令白名单、执行身份、环境隔离到日志审计的完整闭环。
确认监控用户基础状态
先确保该用户存在且具备基本登录能力:
- 检查用户是否已创建:id monuser
- 确认 shell 不是
/usr/sbin/nologin或/bin/false(否则无法交互执行命令):grep monuser /etc/passwd,应显示类似monuser:x:1005:1005::/home/monuser:/bin/bash - 若需免密执行(常见于脚本调用),暂不启用 NOPASSWD —— 先验证功能,再按需加固
用 visudo 配置最小化命令白名单
必须使用 sudo visudo 编辑,禁止直接改 /etc/sudoers。在文件末尾添加规则,例如:
- 仅允许查看服务状态和日志:monuser ALL=(root) /usr/bin/systemctl is-active *, /usr/bin/systemctl is-failed *, /usr/bin/journalctl -u *, /usr/bin/tail -n *
- 路径必须绝对、参数尽量具体:
/usr/bin/journalctl -u nginx安全;/usr/bin/journalctl *危险(可绕过读取任意日志) - 显式禁止高危操作:monuser ALL=(root) !/bin/bash, !/usr/bin/python*, !/usr/bin/sh, !/usr/bin/su
- 避免通配符滥用:用
/usr/bin/systemctl status nginx,不用/usr/bin/systemctl status *(防提权绕过)
按角色分组 + 别名统一管理(推荐用于多监控用户)
若不止一个监控账户(如 zabbix、telegraf、monuser),用别名更安全易维护:
- 定义命令别名:Cmnd_Alias MON_CMD = /usr/bin/systemctl is-active *, /usr/bin/journalctl -u *, /usr/bin/df, /usr/bin/free -h
- 定义用户别名:User_Alias MON_USERS = zabbix, telegraf, monuser
- 绑定授权:MON_USERS ALL=(root) MON_CMD
- 后续新增监控用户只需 usermod -aG mon_group newuser 并加入
MON_USERS别名,无需动主规则
加固执行上下文与审计追踪
权限生效后,还需防止逃逸、留痕、误用:
- 重置环境变量(防 PATH 劫持):Defaults:monuser env_reset,再保留必要项:env_keep += "LANG LC_ALL PATH"
- 限定目标用户:若只需查 nginx 状态,不要以 root 运行,改用 monuser ALL=(www-data) /usr/bin/systemctl is-active nginx
- 启用独立日志:Defaults logfile="/var/log/sudo-mon.log",并确保 rsyslog 或 journald 收集该路径
- 验证是否生效:sudo -l -U monuser 应只列出你明确授权的命令,且无
(ALL : ALL) ALL











