Nginx 教程

纯干货教学,从零开始学习 Nginx

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:基本安全配置

  1. 隐藏 Nginx 版本信息
  2. 配置基于 IP 的访问控制
  3. 添加安全 HTTP 头
  4. 测试配置是否生效

练习2:SSL 安全配置

  1. 配置 TLS 1.2/1.3
  2. 启用 OCSP 装订
  3. 配置 HSTS
  4. 使用 SSL Labs 测试

练习3:防止攻击

  1. 配置请求限流
  2. 配置并发连接限制
  3. 安装并配置 Fail2ban
  4. 测试防护效果

常见问题解答

Q: 如何检查 Nginx 配置的安全性?

A: 可以使用以下工具:

  • SSL Labs(测试 SSL 配置)
  • Nmap(扫描开放端口和漏洞)
  • OWASP ZAP(进行安全测试)
  • nginx-audit(Nginx 配置审计工具)

Q: 如何防止 Nginx 被黑客攻击?

A: 采取以下措施:

  • 定期更新 Nginx
  • 配置访问控制
  • 启用 SSL/TLS
  • 设置安全 HTTP 头
  • 限制并发连接和请求速率
  • 配置防火墙
  • 监控日志

Q: 如何处理 Nginx 安全漏洞?

A: 立即更新 Nginx 到最新版本,或应用官方补丁。同时,根据漏洞的性质,临时采取相应的缓解措施。