温馨提示×

Nginx在Ubuntu上如何安全配置

小樊
101
2025-10-25 12:59:27
栏目: 智能运维

Nginx在Ubuntu上的安全配置指南

一、基础系统安全准备

在配置Nginx前,需先强化Ubuntu系统的基础安全,降低整体风险:

  • 更新系统与软件包:运行sudo apt update && sudo apt upgrade -y,确保系统和Nginx等软件为最新版本,修补已知漏洞。
  • 禁用SSH root登录:编辑/etc/ssh/sshd_config,将PermitRootLogin yes改为no,并重启SSH服务(sudo systemctl restart sshd),避免直接使用root账户登录。
  • 启用防火墙(UFW):使用sudo ufw allow 22/tcp(SSH)、sudo ufw allow 80/tcp(HTTP)、sudo ufw allow 443/tcp(HTTPS)开放必要端口,然后执行sudo ufw enable启用防火墙,通过sudo ufw status验证状态。

二、Nginx核心安全配置

1. 隐藏版本与敏感信息

  • 关闭版本号:编辑/etc/nginx/nginx.conf,在http块中添加server_tokens off;,防止攻击者通过响应头识别Nginx版本。
  • 移除多余HTTP头:在server块中添加more_clear_headers Server;,进一步隐藏服务器信息(需安装headers-more-nginx-module模块,若未安装可通过源码编译添加)。

2. 限制访问权限

  • IP白名单:针对管理后台(如/admin/),配置仅允许特定IP访问:
    location /admin/ {
        allow 192.168.1.0/24;  # 允许内部网络
        allow 10.0.0.0/8;      # 允许私有网络
        deny all;              # 拒绝其他所有IP
    }
    
  • 地理限制:使用geo模块限制国家/地区访问(需提前配置IP数据库):
    http {
        geo $country {
            default 0;         # 默认拒绝
            192.168.1.0/24 1;  # 允许国内IP段
        }
        server {
            if ($country = 0) {
                return 403;    # 非允许地区返回403
            }
        }
    }
    
  • 请求频率限制:在http块中定义共享内存区域,限制单个IP的请求频率:
    http {
        limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;  # 每秒10个请求
        server {
            location / {
                limit_req zone=mylimit burst=20 nodelay;  # 允许突发20个请求,无延迟
            }
        }
    }
    

3. 强化HTTP协议与加密

  • 禁用不安全HTTP方法:仅允许GET、HEAD、POST方法,阻止PUT、DELETE等危险方法:
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;  # 直接关闭连接
    }
    
  • 配置HSTS:强制浏览器使用HTTPS,添加以下头部(需已启用HTTPS):
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
    
  • 优化SSL配置:使用Let’s Encrypt获取免费证书(sudo apt install certbot python3-certbot-nginx),并配置强加密套件:
    server {
        listen 443 ssl http2;
        server_name example.com;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;  # 仅使用TLS 1.2及以上
        ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';  # 强加密套件
        ssl_prefer_server_ciphers on;
    }
    

4. 防止常见攻击

  • 防目录遍历:关闭目录列表功能,规范路径访问:
    location / {
        autoindex off;  # 关闭目录列表
        try_files $uri $uri/ =404;  # 规范化路径,避免../遍历
    }
    
  • 限制请求体大小:防止大文件上传耗尽服务器资源:
    client_max_body_size 10M;  # 限制请求体为10MB
    
  • 限制并发连接:在http块中定义共享内存区域,限制每个IP的并发连接数:
    http {
        limit_conn_zone $binary_remote_addr zone=ops:10m;  # 共享内存区域
        server {
            location / {
                limit_conn ops 5;  # 每个IP最多5个并发连接
            }
        }
    }
    

三、集成第三方安全工具

  • 安装Fail2Ban:用于防范暴力破解,配置Nginx防护:
    sudo apt install fail2ban
    
    编辑/etc/fail2ban/jail.d/nginx.conf
    [nginx-http-auth]
    enabled = true
    port = http,https
    logpath = /var/log/nginx/error.log
    maxretry = 5
    bantime = 3600
    findtime = 600
    
    重启Fail2Ban:sudo systemctl restart fail2ban
  • 启用ModSecurity:开源WAF(Web应用防火墙),检测OWASP Top 10威胁(如SQL注入、XSS),需源码编译Nginx并添加模块(参考ModSecurity官方文档)。

四、日常维护与监控

  • 定期更新:开启自动安全更新,安装unattended-upgrades
    sudo apt install unattended-upgrades
    sudo dpkg-reconfigure --priority=low unattended-upgrades
    
  • 备份配置:定期备份Nginx配置和日志:
    sudo tar -czvf nginx-backup-$(date +%F).tar.gz /etc/nginx /var/log/nginx
    
    设置定时任务(每天凌晨2点备份):
    echo "0 2 * * * tar -czvf /backup/nginx-$(date +\%F).tar.gz /etc/nginx /var/log/nginx" | sudo tee -a /etc/crontab
    
  • 日志审查:定期检查Nginx访问日志(/var/log/nginx/access.log)和错误日志(/var/log/nginx/error.log),使用grepawk等工具分析异常请求(如大量404、403错误)。

0