以下是针对 Nginx 和 MySQL 的专项安全加固配置指南,涵盖协议安全、权限控制、日志审计等关键环节:
一、Nginx 加固配置
- 禁用高风险HTTP方法
nginx.conf 或对应站点配置文件
server {
# 仅允许必要的HTTP方法(GET/POST/HEAD)
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444; # 返回空响应,拒绝请求
}
}
- 配置安全响应头
server {
add_header X-Content-Type-Options "nosniff" always; # 禁止MIME类型嗅探
add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"; # 限制资源加载源
add_header X-XSS-Protection "1; mode=block"; # 启用XSS过滤器
add_header Referrer-Policy "no-referrer-when-downgrade"; # 控制Referer泄露
}
- SSL/TLS 强化
server {
ssl_protocols TLSv1.2 TLSv1.3; # 禁用SSLv3/TLSv1.0/v1.1
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on; # 优先使用服务端加密套件
ssl_session_timeout 1d; # SSL会话缓存有效期
ssl_session_cache shared:SSL:50m;
ssl_stapling on; # 启用OCSP Stapling
ssl_stapling_verify on;
# 启用HSTS(强制HTTPS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
- 访问控制与日志
# 限制客户端请求大小和超时
client_max_body_size 10m; # 限制上传文件大小
client_body_timeout 10s;
client_header_timeout 10s;
# 限制并发连接数(根据服务器性能调整)
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 100;
# 记录完整访问日志(追踪异常请求)
access_log /var/log/nginx/access.log combined buffer=32k;
- 隐藏敏感信息
server {
server_tokens off; # 隐藏Nginx版本号
location / {
autoindex off; # 禁止目录列表
}
# 限制敏感文件访问(如.git/.env)
location ~ /\.(env|git|svn|ht) {
deny all;
return 404;
}
}
二、MySQL 加固配置
- 权限最小化
-- 创建专用应用账户(禁止远程root登录)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
-- 删除测试数据库和匿名账户
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.user WHERE User='';
- 配置文件安全
# /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
user = mysql # 以非root用户运行
skip_symbolic_links = ON # 禁用符号链接防止提权
local_infile = OFF # 禁用本地文件加载
skip_name_resolve = ON # 禁用DNS反向解析
secure_file_priv = /var/lib/mysql # 限制文件导出路径
# 日志审计
log_error = /var/log/mysql/error.log
general_log = ON
general_log_file = /var/log/mysql/query.log
- 密码策略
-- 启用密码复杂度插件(MySQL 5.7+)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
SET GLOBAL validate_password_policy = MEDIUM; # 要求包含数字、大小写、特殊字符
SET GLOBAL validate_password_length = 10;
-- 设置密码有效期(需启用密码过期插件)
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
- SSL 加密通信
-- 检查SSL支持
SHOW VARIABLES LIKE '%ssl%';
-- 强制用户使用SSL连接
ALTER USER 'app_user'@'localhost' REQUIRE SSL;
-- 生成证书(如果未配置):
openssl req -x509 -newkey rsa:2048 -nodes -keyout server-key.pem -out server-cert.pem
- 防SQL注入与连接控制
my.cnf 中配置
[mysqld]
max_connections = 500 # 限制最大连接数
wait_timeout = 600 # 空闲连接超时断开
interactive_timeout = 600
# 启用查询缓存限制(防止大查询拖垮服务)
query_cache_size = 64M
query_cache_limit = 2M
三、验证与维护
Nginx 验证工具:
SSL 配置检查:ssllabs.com/ssltest
安全头检查:curl -I https://your-domain.com
MySQL 安全检查:
SELECT user, host, ssl_type FROM mysql.user; -- 确认SSL启用状态
SHOW VARIABLES LIKE 'validate_password%'; -- 检查密码策略
定期维护:
每月更新SSL证书(Let’s Encrypt证书需续签)。
每日检查备份文件完整性(如 md5sum backup.sql)。
每周清理日志文件(使用 logrotate 工具)。
注意事项
回滚测试:修改关键配置前备份原文件(如 cp /etc/nginx/nginx.conf{,.bak})。
灰度发布:先在测试环境验证配置兼容性。
性能监控:加固后使用 top/htop 观察CPU和内存占用,避免过度限制影响业务。
如需针对特定场景(如高并发业务)优化安全配置,可进一步细化调整参数。