前阵子给服务器做了一次安全体检,扫描结果不太好看——防火墙没开、数据库端口裸奔、也没做定时备份。花了一个下午把这些问题挨个补齐,顺手把过程和命令整理成这份笔记,方便以后新服务器照抄。
一、先摸清底数
动手之前先跑一遍面板自带的「安全」→「安全扫描」,它会列出风险项、等级和修复建议。重点看三类:
- 网络暴露类:防火墙是否开启、哪些端口对外可访问
- 服务配置类:SSH、MySQL、PHP 的安全基线
- 数据安全类:是否配置了自动备份
拿到清单后别急着「一键修复」,先做快照或备份,再逐项处理,避免误操作把正在跑的业务搞挂。
二、防火墙:把暴露面压到最小
很多新服务器默认防火墙是关的,等于所有端口都裸奔在公网。先在「安全」→「系统防火墙」里开启,然后只放行真正需要的端口:
80 # HTTP
443 # HTTPS
22 # SSH(建议改成非默认端口)
8888 # 面板端口(务必改成自定义端口)
其余端口一律不放行。像 3306(MySQL)、6379(Redis)、2375(Docker)这类,除非有明确的外部访问需求,否则永远不要让它们对外可达。
三、数据库:别让 3306 裸奔
安全扫描里最常见的一条风险就是「MySQL 端口 3306 可被任意服务器访问」。两个层面收紧:
1. 网络层——防火墙不对外放行 3306,只在确有需要时按来源 IP 白名单放行。
2. 服务层——如果数据库只给本机程序用,直接让 MySQL 只监听本机:
# 编辑 /etc/my.cnf,在 [mysqld] 段加一行
bind-address = 127.0.0.1
# 然后重启 MySQL
systemctl restart mysqld
同时检查业务账号的 host:能用 localhost 就不要用 %;能不用 root 跑业务,就单独建账号并做最小授权。
四、定时备份:给自己留条后路
数据没了才是最疼的。面板的「计划任务」可以很方便地做自动备份:
- 备份数据库:任务类型选「备份数据库」,设置每天或每周执行一次,保留最近 N 份
- 备份网站:任务类型选「备份网站」,把站点文件和数据库一起打包
- 异地容灾:把备份存储切到对象存储(阿里云 OSS / 腾讯云 COS 等),别只存在本机同一块盘上
配好后手动执行一次,确认备份文件能正常生成、能正常恢复,再让它定时跑。
五、SSH 加固
SSH 是黑客最爱爆破的入口,几个低成本改动能挡掉大部分攻击:
# 编辑 /etc/ssh/sshd_config
Port 2222 # 改掉默认 22
PermitRootLogin no # 禁止 root 直接登录,改用普通用户 + sudo
PasswordAuthentication no # 能用密钥登录就关掉密码登录
MaxAuthTries 3 # 限制单次连接尝试次数
LoginGraceTime 60 # 登录超时
ClientAliveInterval 300 # 空闲超时
改完 systemctl restart sshd 生效。更省心的是再装个 fail2ban,自动封禁暴力破解的 IP。
六、PHP 安全配置
生产环境记得关掉调试和版本泄露相关的开关,去「软件商店」→ 对应 PHP 版本 →「配置修改」:
display_errors = Off # 关闭错误回显,避免泄露路径
expose_php = Off # 隐藏 PHP 版本
allow_url_include = Off # 关闭远程文件包含
还可以在「禁用函数」里按需禁用 exec、system、shell_exec 等高危函数,WordPress 等常规站点一般用不到。
七、面板自身的小设置
面板本身也是攻击面,顺手做这几件事:
- 修改默认端口 + 开启安全入口
- 开启面板 SSL(自签即可)
- 设置登录告警,登录成功或失败都能收到通知
- 有条件的话绑定域名 + 限制访问 IP
八、收尾检查清单
- 防火墙已开启,只放行必要端口
- MySQL 不对公网开放,业务账号最小授权
- 数据库和网站都配了定时备份,且验证过可恢复
- SSH 改了端口、关了 root 直登、限制了尝试次数
- PHP 关闭了错误回显和版本泄露
- 面板端口已改、安全入口已开、登录告警已配
全部做完再跑一遍安全扫描,分数应该能上一个台阶。安全没有一劳永逸,建议每月抽几分钟复查一次扫描结果,有新风险及时处理。
Comments NOTHING