服务器安全体检实录:66 项漏洞扫描与修复全记录

Aexing 发布于 12 天前 45 次阅读


前几天给服务器做安全体检,宝塔面板一口气扫出 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 端口再开。

五、给同样折腾的朋友几个建议

  1. 先备份配置文件(cp x x.bak.日期),所有改动都可回滚;
  2. 分批执行,每批做完立刻验证网站(curl 首页 + 文章页);
  3. sysctl / modprobe 这类改动很安全,放心做;PHP/nginx 配置类改动要格外小心;
  4. 防火墙、GRUB、内核参数这三类,改之前想清楚最坏情况;
  5. 数据库备份是最值钱的保险,先有备份再谈加固。

本文记录个人服务器(CentOS 7.9 + 宝塔面板)的安全加固过程。不同环境配置项位置可能不同,操作前请备份。安全无小事,动手前先想回滚。