Ubuntu环境下LNMP(Linux+Nginx+MySQL+PHP)安全设置指南
保持系统及所有软件包为最新版本,及时修复已知安全漏洞:
sudo apt update && sudo apt upgrade -y
使用UFW(Uncomplicated Firewall)限制不必要的网络访问,仅开放必要端口(SSH、HTTP、HTTPS、MySQL等):
sudo apt install ufw -y
sudo ufw allow 22/tcp # SSH(后续可修改为非标准端口)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 3306/tcp # MySQL(若需远程访问)
sudo ufw enable # 启用防火墙
sudo ufw status # 验证规则
编辑/etc/ssh/sshd_config文件,进行以下关键设置:
Port 2222 # 修改默认端口
PermitRootLogin no # 禁止root远程登录
PubkeyAuthentication yes # 启用公钥认证
PasswordAuthentication no # 禁用密码认证(可选,需提前配置密钥)
保存后重启SSH服务:
sudo systemctl restart sshd
编辑/etc/nginx/nginx.conf,在http块中添加:
server_tokens off;
此设置会隐藏Nginx版本号,减少攻击者针对性利用漏洞的风险。
在server块中添加规则,仅允许必要的HTTP方法(GET、HEAD、POST),拒绝其他危险方法(如PUT、DELETE):
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444; # 直接关闭连接
}
防止CC攻击或资源耗尽,通过limit_req_zone限制单个IP的请求频率:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 10个请求/秒
server {
location / {
limit_req zone=one burst=20 nodelay; # 允许突发20个请求
}
}
}
使用Let’s Encrypt免费证书部署HTTPS,加密客户端与服务器之间的通信:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com # 替换为你的域名
证书会自动续期,无需手动操作。
在/etc/nginx/nginx.conf的events块中调整连接数,避免单个IP占用过多资源:
events {
worker_connections 1024; # 每个worker的最大连接数
use epoll; # 高性能事件模型
}
安装完成后,执行mysql_secure_installation脚本,完成以下关键操作:
避免使用root账户管理数据库,创建专用用户并授予最小必要权限:
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON yourdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
若需加密数据库传输,可配置MySQL使用SSL证书:
/etc/mysql/mysql.conf.d/mysqld.cnf,添加SSL配置:[mysqld]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
重启MySQL服务使配置生效:
sudo systemctl restart mysql
保持MySQL为最新版本,定期检查日志(如/var/log/mysql/error.log)排查异常:
sudo apt update && sudo apt upgrade mysql-server -y
生产环境中关闭详细错误信息,避免泄露敏感路径或代码:
编辑/etc/php/7.4/fpm/php.ini(根据PHP版本调整路径):
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
禁止执行可能被滥用的函数(如exec、system、eval等):
disable_functions = eval,exec,system,passthru,shell_exec,popen,curl_exec,base64_decode
防止恶意文件上传(如PHP木马),设置上传文件大小限制并禁止执行上传目录中的脚本:
upload_max_filesize = 2M # 最大上传文件大小
post_max_size = 8M # 最大POST数据大小
file_uploads = On # 允许文件上传
在Nginx配置中添加规则,拒绝上传目录中的PHP执行:
location ~* ^/uploads/.*\.(php|php5|phtml)$ {
deny all;
}
增强会话安全性,防止会话劫持:
session.cookie_httponly = On # 禁止JavaScript访问cookie
session.cookie_secure = On # 仅通过HTTPS传输cookie
session.gc_maxlifetime = 1440 # 会话有效期(分钟)
提升PHP性能的同时,减少源代码暴露风险:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
通过AppArmor限制PHP-FPM进程的访问范围,防止越权操作:
sudo aa-status # 查看AppArmor状态
sudo aa-enforce /etc/apparmor.d/usr.sbin.php-fpm # 启用PHP-FPM的AppArmor配置
tar或rsync备份Nginx配置、网站数据、数据库,存储到异地或云存储;fail2ban防止暴力破解,监控/var/log/auth.log(SSH)、/var/log/nginx/error.log(Nginx)、/var/log/mysql/error.log(MySQL)等日志文件;www-data:www-data用户组,目录权限755,文件权限644)。通过以上步骤,可显著提升Ubuntu环境下LNMP架构的安全性,防范常见的网络攻击(如SQL注入、XSS、暴力破解等)。安全是持续过程,需定期审查配置并及时更新补丁。