CentOS服务器的安全防护核心就两件事:一是把不同用户彻底隔离开,别让一个人的失误拖垮整台机器;二是把所有sudo提权操作全部记录下来,出了事能追溯到具体是谁、什么时候、干了什么。这篇文章直接给你一套从用户组隔离到sudo日志审计的完整落地方案,不绕弯子,照着做就行。
为什么用户隔离和sudo审计是CentOS安全的第一道防线
很多运维人员装完CentOS就直接用root登录干活,或者给所有用户都开sudo权限。这种做法在生产环境里就是埋雷。一旦某个低权限账户被攻破,攻击者就能横向移动,甚至直接提权到root。而sudo审计的缺失意味着你根本不知道谁在什么时候执行了什么危险命令,等发现问题时已经晚了。用户组隔离本质上是最小权限原则的落地,sudo审计则是事后追溯和实时告警的基础。两者缺一不可。
CentOS用户组隔离的核心思路
Linux的权限体系是"用户-组-其他"三级模型。CentOS默认会创建一些系统组,比如wheel、docker、apache等,但大多数人从来没有主动规划过用户分组策略。正确的做法是:按职能划分用户组,每个组只给刚好够用的权限,绝不多给一分。
第一步:规划用户组结构
在动手之前,先想清楚你的服务器上有哪些角色。一般来说,可以这样分:
# 运维管理组(拥有sudo权限) groupadd ops_admin # 开发人员组(只能访问自己的项目目录) groupadd developers # 应用服务组(运行特定服务的专用账户) groupadd app_service # 只读审计组(只能查看日志,不能修改) groupadd log_auditors
每个组的权限边界要在创建时就想好,后面再改就麻烦了。
第二步:创建用户并归入对应组
创建用户时直接指定主组和附加组,这一步很多人会忽略附加组的设置。
# 创建运维用户,主组为ops_admin,附加组为log_auditors useradd -m -g ops_admin -G log_auditors zhangsan # 创建开发用户,主组为developers useradd -m -g developers lisi # 设置密码 passwd zhangsan passwd lisi
注意,普通用户不要直接加到wheel组,wheel组在CentOS里默认就是sudo权限组。你应该自建一个ops_admin组,然后通过sudoers配置来授权。
第三步:用文件权限和ACL做细粒度隔离
光靠用户组还不够,还需要在文件系统层面做限制。CentOS支持标准的chmod/chown,也支持更精细的ACL(访问控制列表)。
# 项目目录只允许developers组读写执行 chown -R root:developers /opt/projects/ chmod -R 770 /opt/projects/ # 用ACL给特定用户额外权限 setfacl -m u:lisi:rwx /opt/projects/app1/ setfacl -m u:wangwu:r-x /opt/projects/app1/ # 查看ACL设置 getfacl /opt/projects/app1/
ACL的好处是不用改主组就能给单个用户加权限,特别适合多人协作但权限不同的场景。另外,/home目录下每个用户的家目录权限建议设为700或者750,防止其他用户偷看。
第四步:限制用户登录和Shell访问
有些账户只需要跑服务,不需要登录Shell。比如数据库专用账户、Web服务账户,应该直接禁止Shell登录。
# 禁止某用户登录Shell usermod -s /sbin/nologin app_mysql # 或者用更严格的 /bin/false usermod -s /bin/false app_ftp # 查看用户当前Shell grep app_mysql /etc/passwd
同时,在/etc/ssh/sshd_config里可以进一步限制哪些用户能通过SSH登录:
# 只允许ops_admin组的用户SSH登录 AllowGroups ops_admin # 或者直接指定用户 AllowUsers zhangsan wangwu
改完之后记得重启sshd服务:systemctl restart sshd。
第五步:用chroot或namespace做更强隔离(进阶)
如果你的服务器上跑着不信任的代码或者多租户环境,光靠文件权限还不够。CentOS 7以上可以用systemd的PrivateTmp、ProtectHome等特性,CentOS 8/Stream则可以结合container或namespace来做进程级隔离。虽然这不是纯用户组隔离的范畴,但在高安全要求场景下值得考虑。
sudo命令日志审计的完整配置
用户隔离做好了,接下来就是sudo审计。CentOS的sudo本身就有日志功能,但默认配置可能不够用,需要手动优化。
第一步:确认sudoers配置开启了日志
编辑sudoers文件,永远用visudo命令,别直接vim改。
visudo
在文件里找到或添加以下内容:
# 开启sudo日志,记录到指定文件 Defaults logfile="/var/log/sudo.log" # 记录输入的命令(不只是命令名,包括参数) Defaults log_input Defaults log_output # 如果用户输错密码也要记录 Defaults loglinelen = 0
log_input和log_output这两个参数非常关键。log_input会记录用户在sudo提示符下输入的完整命令,log_output则记录命令的标准输出和标准错误。这两个加起来,基本上用户干了什么一目了然。
第二步:精细控制谁能用sudo、能执行什么
不要直接给用户ALL权限,要按需分配。在sudoers文件末尾添加:
# ops_admin组的用户可以执行所有命令 %ops_admin ALL=(ALL) ALL # developers组只能重启特定服务,不能干别的 %developers ALL=(root) /usr/bin/systemctl restart httpd, /usr/bin/systemctl restart nginx # 禁止某些危险命令 %developers ALL=!/usr/bin/passwd, !/usr/bin/useradd, !/usr/bin/rm -rf /
这里的%表示组,ALL=(ALL) ALL表示可以以任何用户身份执行任何命令。后面那种限定具体命令的写法才是生产环境该有的样子。感叹号!表示禁止。
第三步:配置sudo日志的轮转和保护
sudo日志如果不做轮转,时间长了会占满磁盘。而且日志文件本身也需要保护,不能让普通用户随便删。
# 创建logrotate配置
cat > /etc/logrotate.d/sudo << 'EOF'
/var/log/sudo.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0600 root root
}
EOF
create 0600 root root表示新生成的日志文件只有root能读写,普通用户连看都看不了。这一点很重要,否则攻击者提权后第一件事就是删日志。
第四步:把sudo日志接入集中审计系统
单机日志只能本地看,要做真正的安全审计,最好把日志转发到集中的日志服务器或者SIEM系统。CentOS自带的rsyslog就能做这件事。
# 在 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 下添加 # 将sudo日志通过UDP发送到远程日志服务器 local2.* @192.168.1.100:514
注意,sudo的日志级别是local2,所以用local2.*来匹配。如果你用的是syslog-ng,配置方式类似,指定source为sudo日志文件,destination为远程服务器即可。
第五步:设置实时告警
光记录不告警等于白记。可以写一个简单的脚本配合inotifywait或者直接用auditd来监控sudo日志的变化。
# 安装inotify-tools
yum install -y inotify-tools
# 简单的监控脚本
cat > /usr/local/bin/sudo_alert.sh << 'EOF'
#!/bin/bash
LOGFILE="/var/log/sudo.log"
ALERT_EMAIL="admin@example.com"
inotifywait -m -e modify "$LOGFILE" | while read path action file; do
tail -n 5 "$LOGFILE" | mail -s "sudo alert on $(hostname)" "$ALERT_EMAIL"
done
EOF
chmod +x /usr/local/bin/sudo_alert.sh
更专业的做法是用auditd来监控:
# 添加audit规则监控sudo日志文件 auditctl -w /var/log/sudo.log -p wa -k sudo_log_monitor # 永久生效,写入规则文件 echo '-w /var/log/sudo.log -p wa -k sudo_log_monitor' >> /etc/audit/rules.d/audit.rules
用户隔离和sudo审计的联动策略
单独做用户隔离或者单独做sudo审计,效果都会打折扣。真正的安全体系是两者联动。比如:
1、只有ops_admin组的用户才有sudo权限,其他组的用户连提权的机会都没有,从源头减少风险。
2、sudo日志只允许root和log_auditors组查看,防止攻击者清除痕迹。
3、定期(比如每周)用脚本分析sudo日志,统计每个用户的sudo使用频率和命令类型,异常行为直接告警。
# 简单的sudo使用统计脚本 cat > /usr/local/bin/sudo_stats.sh << 'EOF' #!/bin/bash echo "=== sudo使用统计 $(date) ===" echo "按用户统计:" grep -oP 'USER=\K[^:]+' /var/log/sudo.log | sort | uniq -c | sort -rn echo "" echo "高频命令TOP10:" grep -oP 'COMMAND=\K.+' /var/log/sudo.log | sort | uniq -c | sort -rn | head -10 EOF chmod +x /usr/local/bin/sudo_stats.sh
常见误区和避坑指南
误区一:觉得加了sudo就等于安全。sudo只是提权工具,不是安全工具。不限制能执行什么命令,sudo就是一把没鞘的刀。
误区二:日志只放本地。本地日志在服务器被入侵后毫无意义,必须有远程备份或者集中收集。
误区三:用户组设置完就不管了。人员变动、项目调整都需要重新审视权限,建议每季度做一次权限审计。
误区四:忽略了/etc/sudoers.d/目录。不要把所有配置都塞进主sudoers文件,用/etc/sudoers.d/下的独立文件按组或按角色管理,清晰且不容易出错。
误区五:没测试就上线。每次改完sudoers配置,一定要用另一个终端测试,确认新用户能正常sudo,旧权限被正确收回。visudo本身会做语法检查,但逻辑错误它检查不了。
总结
CentOS的安全不是装个防火墙就完事了。用户组隔离解决的是"谁能碰什么"的问题,sudo日志审计解决的是"碰了之后能不能查"的问题。两者结合,才能构建起一套既能防又能追的安全体系。上面给的配置和脚本都是可以直接用的,但每台服务器的情况不同,落地时要根据实际业务做调整。安全是持续的过程,不是一次性的配置。
