Nginx 安全配置
掌握 Nginx 服务器安全配置的最佳实践
Nginx 安全基础
Nginx 作为面向互联网的服务器,安全配置至关重要。以下是一些基本的安全措施:
隐藏 Nginx 版本信息
http {
# 隐藏 Nginx 版本号
server_tokens off;
# 其他配置...
}
使用非 root 用户运行
# 主配置文件顶部
user nginx; # 使用 nginx 用户运行
worker_processes auto;
限制并发连接
http {
# 配置连接限制区域
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 80;
server_name example.com;
# 限制每个 IP 的并发连接数
location / {
limit_conn conn_limit_per_ip 10;
# 其他配置...
}
}
}
访问控制
基于 IP 的访问控制
server {
listen 80;
server_name example.com;
# 允许特定 IP 访问管理后台
location /admin {
allow 192.168.1.1;
allow 10.0.0.0/24;
deny all;
# 其他配置...
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
# 禁止访问特定目录
location ~* /(logs|backup|temp) {
deny all;
}
}
基于密码的访问控制
server {
listen 80;
server_name example.com;
# 密码保护目录
location /secure {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# 其他配置...
}
}
安全 HTTP 头
server {
listen 80;
server_name example.com;
# 安全 HTTP 头
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;
add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()" always;
# 其他配置...
}
HTTP 严格传输安全 (HSTS)
server {
listen 443 ssl;
server_name example.com;
# HSTS 配置
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 其他 SSL 配置...
}
防止常见攻击
防止 DDoS 攻击
http {
# 配置请求限制区域
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
server {
listen 80;
server_name example.com;
# 限制请求速率
location / {
limit_req zone=req_limit_per_ip burst=20 nodelay;
# 其他配置...
}
# 限制请求体大小
client_max_body_size 1m;
}
}
防止 SQL 注入和 XSS 攻击
server {
listen 80;
server_name example.com;
# 内容安全策略
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;
# 防止 XSS
add_header X-XSS-Protection "1; mode=block" always;
# 其他配置...
}
SSL/TLS 安全配置
server {
listen 443 ssl http2;
server_name example.com;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# OCSP 装订
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 其他配置...
}
文件和目录安全
限制文件访问
server {
listen 80;
server_name example.com;
root /var/www/html;
# 限制执行权限
location ~* \.(php|pl|py|jsp|asp|sh)$ {
try_files $uri =404;
}
# 限制访问配置文件
location ~* \.(conf|ini|log)$ {
deny all;
}
# 限制访问备份文件
location ~* \.(bak|old|backup)$ {
deny all;
}
}
文件权限设置
# 设置网站文件权限
sudo chown -R nginx:nginx /var/www/html
sudo chmod -R 755 /var/www/html
sudo find /var/www/html -type f -exec chmod 644 {} \;
# 设置配置文件权限
sudo chown -R root:root /etc/nginx
sudo chmod -R 644 /etc/nginx/conf.d/
# 设置日志文件权限
sudo chown -R nginx:nginx /var/log/nginx
sudo chmod -R 640 /var/log/nginx/
安全日志和监控
配置安全日志
http {
# 访问日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
access_log /var/log/nginx/access.log main;
# 错误日志(详细)
error_log /var/log/nginx/error.log error;
# 其他配置...
}
使用 Fail2ban 防止暴力破解
# 安装 fail2ban
sudo apt install fail2ban # Ubuntu/Debian
sudo yum install fail2ban # CentOS/RHEL
# 配置 fail2ban
sudo nano /etc/fail2ban/jail.local
# 添加以下内容
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
# 重启 fail2ban
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
系统级安全
防火墙配置
# 使用 ufw(Ubuntu/Debian)
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 使用 firewalld(CentOS/RHEL)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
定期更新
# 定期更新系统包
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL
# 定期更新 Nginx
sudo apt update && sudo apt install nginx -y # Ubuntu/Debian
sudo yum update nginx -y # CentOS/RHEL
安全审计和测试
使用 Nmap 扫描
# 安装 nmap
sudo apt install nmap # Ubuntu/Debian
sudo yum install nmap # CentOS/RHEL
# 扫描开放端口
sudo nmap -sV -p 1-65535 localhost
# 扫描漏洞
sudo nmap --script vuln localhost
使用 SSL Labs 测试
访问 SSL Labs 测试 SSL 配置安全性。
使用 OWASP ZAP 进行安全测试
# 安装 OWASP ZAP
sudo apt install zaproxy # Ubuntu/Debian
# 运行 ZAP
sudo zaproxy
实践练习
练习1:基本安全配置
- 隐藏 Nginx 版本信息
- 配置基于 IP 的访问控制
- 添加安全 HTTP 头
- 测试配置是否生效
练习2:SSL 安全配置
- 配置 TLS 1.2/1.3
- 启用 OCSP 装订
- 配置 HSTS
- 使用 SSL Labs 测试
练习3:防止攻击
- 配置请求限流
- 配置并发连接限制
- 安装并配置 Fail2ban
- 测试防护效果
常见问题解答
Q: 如何检查 Nginx 配置的安全性?
A: 可以使用以下工具:
- SSL Labs(测试 SSL 配置)
- Nmap(扫描开放端口和漏洞)
- OWASP ZAP(进行安全测试)
- nginx-audit(Nginx 配置审计工具)
Q: 如何防止 Nginx 被黑客攻击?
A: 采取以下措施:
- 定期更新 Nginx
- 配置访问控制
- 启用 SSL/TLS
- 设置安全 HTTP 头
- 限制并发连接和请求速率
- 配置防火墙
- 监控日志
Q: 如何处理 Nginx 安全漏洞?
A: 立即更新 Nginx 到最新版本,或应用官方补丁。同时,根据漏洞的性质,临时采取相应的缓解措施。