定期核对/etc/group需比对预期清单、检出异常变更、记录可审计痕迹,核心是建立可信基线、识别真实变动、区分人工操作与入侵;优先监控root、sudo、docker等高权限或业务关键组,用getent group提取成员并标准化格式,自动比对增删差异并分级响应,集成定时任务+历史快照+日志留存实现可追溯审计。

定期核对 /etc/group 中的用户组成员,核心是“比对预期清单 + 检出异常变更 + 记录可审计痕迹”,不能仅靠肉眼翻看,也不能盲目覆盖重写。关键在于建立可信基线、识别真实变动、区分人工操作与潜在入侵。
明确要监控的组和预期成员
不是所有组都需要盯防,优先锁定高权限或业务关键组:
-
系统管理类:如
root、sudo、wheel、adm—— 这些组成员直接关联提权能力 -
服务专属类:如
docker、mysql、www-data—— 成员错误可能导致服务无法访问资源 -
自定义业务组:如
developers、backup、deploy—— 应与团队组织结构或权限策略一致
把每组的“应有成员”写成结构化清单(例如 CSV 或 YAML),作为后续比对的基线。避免硬编码在脚本里,便于版本控制和多人协作。
用 shell 脚本提取并标准化组成员数据
直接解析 /etc/group 时要注意字段分隔与空值处理。推荐用 getent group 替代直接读文件,它兼容 LDAP/NIS 等后端,结果更可靠:
-
getent group sudo | cut -d: -f4提取当前sudo组所有成员(逗号分隔) - 用
tr ',' '\n' | sort | uniq拆分为单行、排序去重,生成标准格式列表 - 对空组(字段为
sudo:x:27:)要单独判断,避免漏报“成员为空”这一有效状态
自动比对差异并分级响应
将实时提取的成员列表与基线清单逐组对比,不只关注“多了谁”,也要关注“少了谁”:
-
新增成员:可能是运维添加,也可能是攻击者提权后加入;需触发告警并记录操作者(如通过
lastlog -u username或审计日志ausearch -m USER_CHAUTHTOK -i) - 缺失成员:可能误删,也可能配置漂移;建议先写入日志,非紧急不自动恢复
- 完全一致:静默跳过,或仅记录心跳时间戳用于监控可用性
示例逻辑片段(含 dry-run 支持):
if [[ "$DRY_RUN" == "1" ]]; then echo "[DRY] Would add user 'attacker' to group 'sudo'"; else usermod -aG sudo attacker; fi集成到定时任务并保留历史快照
仅检查不够,必须留痕才具备回溯能力:
- 每天凌晨运行脚本,输出结果保存到
/var/log/group-audit/$(date +\%F).log - 每次运行前,用
cp /etc/group /var/log/group-audit/etc-group-$(date +\%F-\%H).bak备份原始文件 - 配合
logrotate限制日志保留 90 天,避免磁盘占满 - 可选:将关键组快照推送到 Git 仓库(脱敏后),实现变更可追溯、可 diff

















