LNMP环境部署完成之后,真正的考验才刚刚开始——安全配置。很多人在这一步选择默认设置,结果服务器成了“肉鸡”。下面这八项措施,每一环都是实战中总结出来的,值得逐一落实。
1. 系统与软件持续更新
定期更新Debian系统以及Nginx、MySQL、PHP这三个核心组件,是堵住已知漏洞最直接的手段。执行sudo apt update && sudo apt upgrade就能把系统包更新到最新;LNMP组件建议通过官方源或可信的第三方源升级到稳定版,别图省事用不明来源的包。
2. 防火墙严格管控
用ufw来配置防火墙规则非常方便,核心思路是“默认拒绝入站,只放行必要端口”:
- 允许HTTP(80/tcp)、HTTPS(443/tcp)、MySQL(3306/tcp,建议写死特定IP)、SSH(远程管理端口);
- 设置默认策略:
sudo ufw default deny incoming,sudo ufw default allow outgoing; - 启用防火墙(
sudo ufw enable)并用sudo ufw status确认规则生效。
3. SSH服务安全强化
SSH是入侵者最常盯上的入口,至少有四件事必须做:
- 禁用root远程登录:编辑
/etc/ssh/sshd_config,将PermitRootLogin设为no; - 改用密钥认证:生成SSH密钥对(
ssh-keygen -t rsa),把公钥放到~/.ssh/authorized_keys,然后关闭密码认证(PasswordAuthentication no); - 更改默认端口:把
Port 22改成其他端口(比如2222),可以大大减少自动扫描的骚扰; - 重启服务:
sudo systemctl restart sshd。
4. Nginx配置安全优化
Nginx的安全配置往往被忽视,其实几个小改动就能大幅提升防护能力:
- 编译时移除非必要模块(比如
http_autoindex_module),减少攻击面; - 用
limit_req_zone模块限制请求速率,防止暴力破解。例如limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;; - 隐藏版本号:在
nginx.conf中加一句server_tokens off;,别人就不知道你用的是什么版本的Nginx; - 强制HTTPS:通过
return 301 https://$host$request_uri;把HTTP请求重定向到HTTPS,并配置Let's Encrypt证书。
5. MySQL数据库安全加固
数据库是系统的心脏,防护不能马虎:
- 安装MySQL后第一时间执行
sudo mysql_secure_installation,它会帮你移除匿名用户、禁止root远程登录、删除测试数据库; - 修改
bind-address为服务器IP(0.0.0.0仅当你需要多IP访问时才用),创建专用数据库用户并授予最小权限,例如GRANT SELECT, INSERT ON db.* TO 'user'@'特定IP';; - 定期用
mysqldump或Percona XtraBackup备份数据库,并且一定要测试恢复流程——备份不可恢复等于没备份。
6. PHP安全配置限制
PHP是Web应用的高危层,几个关键参数必须收紧:
- 禁用危险函数:在
/etc/php/7.x/fpm/php.ini(版本按实际调整)中设置disable_functions = system, exec, passthru, shell_exec; - 限制文件访问范围:用
open_basedir将PHP限制在网站目录,比如open_basedir = /var/www/html/:/tmp/; - 关闭错误显示:设置
display_errors = Off,错误日志写入/var/log/php_errors.log(同时设置error_log = /var/log/php_errors.log); - 限制进程资源:调整
pm.max_children参数(如50),避免PHP进程耗尽服务器资源。
7. 日志监控与入侵检测
安全配置做得再好,没有监控等于盲人摸象:
- 开启Nginx的access_log和error_log、MySQL的general_log和slow_query_log、PHP的error_log,保证所有活动都有记录;
- 安装
fail2ban来防范暴力破解,它能自动封禁多次登录失败的IP;配合logwatch每天发送日志摘要; - 定期人工审查
/var/log/nginx/、/var/log/mysql/、/var/log/php/下的日志,关注大量404请求、SQL错误等异常信号。
8. 其他关键安全措施
最后还有几项贯穿全局的原则,往往决定安全体系的成败:
- 最小权限原则:Nginx、MySQL、PHP-FPM分别以专用用户(
www-data、mysql)运行;网站目录权限设为750(所有者读写执行,组读执行,其他无权限); - 安全编码规范:开发时对用户输入做过滤(如
htmlspecialchars防XSS),使用预处理语句(PDO::prepare)防SQL注入; - 数据备份与恢复:定期备份网站数据(
/var/www/html/)和配置文件(/etc/nginx/、/etc/mysql/),并且一定要测试恢复流程; - 安全审计:定期用OpenVAS等工具做渗透测试,对发现的高危漏洞及时修复。
