被入侵之后我才明白安全的重要性
去年有个朋友找我诉苦,他的网站被人植入了挖矿木马,CPU 占用率持续 100%,服务商发来警告邮件,他才发现不对劲。登录服务器一查,SSH 日志里有上万条暴力破解记录,网站目录里多了好几个陌生的 PHP 后门文件。最麻烦的是,他根本不知道木马是什么时候进来的,只能全部重装。这件事给我的触动很大:个人站长没有专职运维,服务器安全完全靠自觉,而绝大多数人恰恰是"出了问题才想起安全"。这篇文章把我自己的服务器安全实践整理成一份清单,一共 10 项,全部做完大概需要半天时间,但能挡住 95% 的常见攻击。
一、SSH 加固:暴力破解的第一道防线
服务器对外开放 22 端口,就等于把大门钥匙挂在了门口。第一步修改 /etc/ssh/sshd_config,按下面的配置逐项修改:
Port 2222 # 改掉默认端口,扫描器就找不到你了
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 禁用密码登录,只允许密钥
PubkeyAuthentication yes
MaxAuthTries 3 # 限制认证尝试次数
ClientAliveInterval 300 # 客户端无响应 5 分钟后断开
ClientAliveCountMax 2改配置之前,一定要先把你的公钥加到 ~/.ssh/authorized_keys 里,并且测试过密钥能登录,再改 PasswordAuthentication no,否则改完发现自己也进不去了,只能找服务商的控制台救急。修改完成后 systemctl restart sshd 生效。启用密钥登录后,用 ssh -p 2222 user@ip 验证一下。顺手再把 /etc/ssh/sshd_config 里的 UseDNS no 加上,可以加快 SSH 登录速度,避免每次登录都做反向 DNS 解析。
二、Fail2ban:自动封禁暴力破解 IP
即使改了端口和密钥,也不能保证万无一失。Fail2ban 会监控日志,发现某个 IP 短时间内连续认证失败,就自动把它加入防火墙黑名单。安装配置如下:
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑 /etc/fail2ban/jail.local,找到 [sshd] 部分(注意我们改了端口,要告诉 fail2ban):
[sshd]
enabled = true
port = 2222
maxretry = 5
bantime = 3600
findtime = 600含义是:10 分钟内失败 5 次,封禁 1 小时。封禁时间可以按需调整,我自己的服务器设置的是 bantime = 86400,也就是一天,攻击者基本不会为一个个人网站等一天再来。配置好后 systemctl restart fail2ban,用 fail2ban-client status sshd 可以查看当前封禁的 IP 列表。
三、防火墙:只开放必要的端口
服务器只需要对外提供网站服务,那就只开放 80、443 和新的 SSH 端口,其余全部拒绝。Ubuntu 上用 UFW 最简单:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp
sudo ufw enable
sudo ufw status verbose # 查看规则注意顺序:先设默认拒绝,再放行必要端口,最后 enable。如果在远程操作,一定要确认 2222 端口规则已经加进去了再 enable,否则 SSH 连接会被立刻切断。如果使用云服务商,控制台里的安全组也要同步配置,两边都放行才有效,这个细节坑过很多人。
四、系统更新:别让漏洞等你
很多入侵事件利用的都是早已修复的旧漏洞,比如某个 CMS 的已知漏洞、某个组件的 0-day 变种。定期更新系统是最便宜的安全投入。开启自动安全更新:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades # 选择 Yes内核和主要软件的大版本升级建议手动执行,先备份再升级,避免升级后服务起不来。每月至少做一次 sudo apt update && sudo apt upgrade。另外提醒一句:不要贪图方便用一键安装脚本装软件,尤其是来路不明的"宝塔一键优化脚本"之类的,里面藏后门的案例并不少见,尽量用官方源和官方文档。
五、最小化服务:关掉用不上的东西
服务器上跑的每一个服务都是潜在的攻击面。用 systemctl list-units --type=service --state=running 看看当前运行的服务,把不认识的、用不上的统统停掉并禁用开机自启:
sudo systemctl stop 服务名
sudo systemctl disable 服务名常见可以关掉的有:cups(打印服务)、avahi-daemon(mDNS 广播)、ModemManager 等。另外检查一下有没有意外的监听端口:ss -tlnp,看到不认识的端口在监听,要查清楚是什么进程。曾经有人在服务器上装了 vsftpd 却从没用过,结果被扫描器发现,成了入侵的跳板,这种案例数不胜数。
六、Web 层安全:Nginx 与 PHP 的硬配置
网站程序是最常被攻击的目标,Web 层的加固同样重要。Nginx 层面:隐藏版本号、禁止访问隐藏文件:
server_tokens off; # 隐藏 Nginx 版本号,防止针对性攻击
location ~ /\. {
deny all; # 禁止访问 .git .env 等隐藏文件
}
# 限制上传目录执行 PHP
location ~* /(uploads|images)/.*\.php$ {
deny all;
}.git 目录泄露源码、.env 文件泄露数据库密码,这些低级失误导致的入侵案例非常多。PHP 层面,在 php.ini 里关闭危险函数,限制上传大小:
disable_functions = exec, system, shell_exec, passthru, popen, proc_open
upload_max_filesize = 20M
post_max_size = 20M
expose_php = Off # 隐藏 PHP 版本号如果你的网站程序用不到 exec、system 这些函数(绝大多数个人站点用不到),直接禁掉,等于堵死了很多 PHP 一句话木马的后路。
七、文件权限:网站目录别用 777
网站目录权限过宽是后门滋生的温床。遵循最小权限原则:文件 644,目录 755,属主为运行用户:
sudo chown -R www-data:www-data /var/www/html
find /var/www/html -type f -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;只有确实需要写入的目录(比如上传目录、缓存目录)才放宽到 775,而且写入权限只给到运行 PHP 的用户。还要定期检查网站目录里有没有陌生的 PHP 文件,用 find /var/www/html -name "*.php" -mtime -7 看最近 7 天新增的文件,重点关注名字奇怪的文件,比如 1.php、shell.php、x.php 这类。
八、数据库安全:别用 root 裸奔
MySQL 默认安装后 root 账户只有本地访问权限,但很多人为了让程序连接方便,把 root 暴露给了远程 IP,这是大忌。正确做法:为每个站点创建独立账号,只授权该站点数据库,密码用强密码:
CREATE USER 'myblog'@'localhost' IDENTIFIED BY '长且复杂的密码';
GRANT ALL PRIVILEGES ON myblog.* TO 'myblog'@'localhost';
FLUSH PRIVILEGES;如果确实需要远程管理数据库(不建议),也要限制来源 IP,并且走 SSH 隧道而不是直接暴露 3306 端口。另外 MySQL 8 默认的 root 认证插件是 caching_sha2_password,注意程序兼容性,别因为这个导致网站连不上数据库。
九、定期审计:日志与入侵检测
安全不是配完就完事,要养成看日志的习惯。每天花两分钟看三个地方:SSH 登录日志(grep "Failed" /var/log/auth.log)、Nginx 错误日志、网站访问日志里的可疑请求(比如大量 404、包含 /etc/passwd、包含 eval 或 base64 的 URL)。还可以装一个轻量的入侵检测工具:
sudo apt install -y aide
sudo aideinit # 初始化文件指纹数据库
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
sudo aide --check # 对比文件指纹,发现被篡改的文件AIDE 会为系统关键文件建立指纹库,之后定期对比,一旦发现 /bin、/usr/bin 下的文件被篡改,立刻就能察觉。对个人站长来说,这是性价比很高的"保险"。
十、备份:最后一道防线
安全措施做得再全面,也有被攻破的可能。备份是唯一能让你"重来一次"的保障。原则只有一条:3-2-1 原则,即 3 份数据、2 种存储介质、1 份异地。具体到个人站长:网站文件 + 数据库每天打包,保留 7 天;每周把备份同步到另一台服务器或对象存储;每月做一次恢复演练,确保备份真的能用。别问为什么备份要异地,等你的服务器硬盘坏掉、服务商跑路的时候,就知道异地备份有多重要了。
写在最后
安全是一个持续的过程,不是一次性工程。这 10 项措施里,SSH 加固、防火墙、Fail2ban 这三项建议今天立刻做,它们能挡住绝大多数自动化攻击;其余几项可以按优先级慢慢补上。记住一个朴素的道理:黑客攻击个人网站,大部分时候不是针对你,而是扫描全网的结果。只要你的服务器比隔壁那台"裸奔"的机器难打一点,攻击者就会转移目标。把自己的网站打理得干干净净,既是保护自己的劳动成果,也是互联网上一份负责任的担当。