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日志审计解决的是"碰了之后能不能查"的问题。两者结合,才能构建起一套既能防又能追的安全体系。上面给的配置和脚本都是可以直接用的,但每台服务器的情况不同,落地时要根据实际业务做调整。安全是持续的过程,不是一次性的配置。