前几天给服务器做安全体检,宝塔面板一口气扫出 66 项风险。花了一晚上逐项处理,这篇记录完整过程——包括修了什么、哪些没法修,以及一个把网站搞挂 502 的坑。
一、先分级,别一把梭
扫描结果分两档:低危 21 项(多为审计规则缺失)+ 中危 45 项。我的处理原则是:
- 必须修:权限配置、密码策略、SSH 加固、SUID 清理、PHP 错误泄露——都是低风险高收益;
- 谨慎评估:防火墙、内核模块、GRUB 参数——改错会导致服务器起不来;
- 接受风险:软件包版本(CentOS 7 已 EOL,源全挂了,想升也升不了)。
二、修复清单(约 46 项)
1. SSH 与账号
| 项目 | 配置 |
|---|---|
| 登录宽限期 | LoginGraceTime 60 |
| 空闲超时 | ClientAliveInterval 600 |
| 禁止用户环境 | PermitUserEnvironment no |
| 登录警告横幅 | Banner /etc/issue.net |
| 密码复杂度 | minclass = 3(三类以上字符) |
| 密码历史 | remember=3 |
| 密码最小天数 | PASS_MIN_DAYS 7 |
| su 限制 | auth required pam_wheel.so use_uid |
注意 SSH 配置文件如果末尾有 Match 块,新增指令必须插在它之前,否则会被归进 Match 条件里不生效。
2. 内核参数(sysctl)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.all.forwarding = 0
改完 sysctl -p 生效。
3. 禁用危险内核模块
# /etc/modprobe.d/CIS.conf
install rds /bin/true
install tipc /bin/true
install jffs2 /bin/true
install udf /bin/true
install dccp /bin/true
install sctp /bin/true
4. 审计日志(auditd)
补上 43 条审计规则:时间变更、挂载、账号文件(passwd/shadow)、主机名、sudoers、登录失败、内核模块加载、文件删除、权限变更等。写到 /etc/audit/rules.d/audit.rules 后 service auditd restart。
小坑:规则行以 -a 开头,用 grep -qxF "$rule" 去重时会被当成参数,要写成 grep -qxF -- "$rule"。
5. 其他系统项
- SUID/SGID 清理:
chmod u-s去掉 chage、gpasswd、mount、umount 等 8 个文件的 SUID;chmod g-s去掉 wall、write 等 3 个 /boot/grub2/grub.cfg权限收紧到 600/etc/profile加export TMOUT=300(无操作自动退出)- 登录标语 /etc/issue 清理掉系统信息变量(m、r)
- chrony 以 chrony 用户运行;postfix 只监听 127.0.0.1;yum 全局开启 gpgcheck
- 禁 Ping:
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP,并写进 rc.local 持久化
6. PHP 与数据
- 7 个 PHP 版本(5.6/7.3/7.4/8.0/8.1/8.2/8.3)全部
display_errors = Off,避免报错泄露路径 - 确认 MySQL 3306 仅监听 127.0.0.1
- 数据库每日自动备份到
/www/backup/auto/,保留 7 天——这条最重要
三、踩坑记录:一个把站点搞挂 502 的改动
扫描建议给网站开启「防跨站 open_basedir」。我按标准做法在两个站点根目录建了 .user.ini:
[PATH=/www/wwwroot/blog.aexing.top/]
open_basedir=/www/wwwroot/blog.aexing.top/:/tmp/:/proc/
结果 instantly 502。查 php-fpm 日志:
WARNING: [pool www] child 3832 exited on signal 11 (SIGSEGV) after 11.7 seconds from start
PHP 子进程直接段错误。原因是 PHP 8.3 + OPcache 与 .user.ini 的 open_basedir 存在已知兼容性冲突——按目录动态改 open_basedir 会让 OPcache 缓存的脚本路径校验崩掉。
处理:立即删除 .user.ini 并重启 php-fpm,站点秒恢复 200。教训:改任何 PHP 或 nginx 配置前,先想好回滚命令;改完立刻 curl 验证主站和文章页,别等用户反馈。
四、修不了的部分
- 软件包版本漏洞(ntp、linux-firmware、less、bind、dhcp):CentOS 7 已停止维护,所有 yum 源失效(
yum repolist返回 0)。面板「一键修复」同样依赖 yum,也会失败。实际风险不高(ntpd 没跑、服务器没 WiFi 硬件),彻底解决只能迁移新系统; - Nginx CVE:需在面板软件商店升级到 1.30+,命令行升级风险太高不安全;
- 开启系统防火墙:远程操作极易把自己锁在外面,必须先在面板放行 SSH/面板/80/443 端口再开。
五、给同样折腾的朋友几个建议
- 先备份配置文件(
cp x x.bak.日期),所有改动都可回滚; - 分批执行,每批做完立刻验证网站(curl 首页 + 文章页);
- sysctl / modprobe 这类改动很安全,放心做;PHP/nginx 配置类改动要格外小心;
- 防火墙、GRUB、内核参数这三类,改之前想清楚最坏情况;
- 数据库备份是最值钱的保险,先有备份再谈加固。
本文记录个人服务器(CentOS 7.9 + 宝塔面板)的安全加固过程。不同环境配置项位置可能不同,操作前请备份。安全无小事,动手前先想回滚。
Comments NOTHING