技术文章

当前位置:首页>帮助手册>技术文章

o2server nginx安全防护配置

时间:2025-05-21   

基本安全设置

使用logrorate进行nginx日志归档

安装 logrotate

sudo apt install logrotate

创建或编辑 logrotate 配置文件

logrotate 的配置文件通常位于 /etc/logrotate.d/ 目录下。为 Nginx 创建一个专用的配置文件,例如 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily                    # 每天轮转
    rotate 7                # 保留 7 份归档日志
    compress                # 压缩归档日志
    delaycompress           # 延迟压缩(归档后下一轮再压缩)
    missingok               # 如果日志文件不存在,不报错
    notifempty              # 如果日志为空,不轮转
    create 0640 www-data adm  # 创建新日志文件,设置权限和所有者
    sharedscripts           # 脚本只执行一次
    postrotate              # 轮转后执行的脚本
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`  # 向 Nginx 发送 USR1 信号,重新打开日志文件
        fi
    endscript
}

https设置

在 /etc/nginx中启用ssl设置

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:...';
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

请求限制和速率限制

限制连接数与请求速率

定义区域

limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

使用限制

location / {
    limit_req zone=req_limit_per_ip burst=20 nodelay;
}

限制单 IP 并发连接数

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;

使用 安装Fail2Ban 配合 Nginx 限制渗透ip

当访问的ip在短时间内发生大量的404访问,可以通过fail2ban操作防火墙直接deny ip 访问

安装Fail2Ban

sudo apt update
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

nginx 日志格式准备

Fail2Ban 通过日志匹配识别恶意请求,首先确保 Nginx 的访问日志中包含状态码和客户端 IP。

在 /etc/nginx/nginx.conf 或虚拟主机配置中设置

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent"';
access_log /var/log/nginx/access.log main;

创建 Fail2Ban 过滤器

路径:/etc/fail2ban/filter.d/nginx-404.conf

[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).+" 404
ignoreregex =

匹配状态码 404 的请求 <HOST> 会自动匹配 IP 地址

配置 Fail2Ban 监狱(Jail)

/etc/fail2ban/jail.d/nginx-404.conf

[nginx-404]
enabled  = truefilter   = nginx-404
action   = ufw # 或 iptables、iptables-multiport、nftables 等,取决于你的防火墙logpath  = /var/log/nginx/access.log
bantime  = 900          # 封禁时间(秒),如 15 分钟findtime = 60          # 观察窗口时间(秒)maxretry = 20           # 在 findtime 秒内最多允许 20 次 404,超过则封禁

可根据实际需求调整: bantime:被封锁的时间(如 900 秒 = 15 分钟) findtime:在这个时间窗口内监控行为(如 5 分钟) maxretry:最大允许的 404 次数

配置fail2ban action 脚本

/etc/fail2ban/action.d/ufw.conf

[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = ufw deny from <ip> to any
actionunban = ufw delete deny from <ip> to any
[Init]
insertpos = 1
blocktype = reject
destination = any
application =

开启 ModSecurity WAF

ModSecurity v3 是当前推荐在 Nginx 中使用的版本

安装 ModSecurity v3 及其依赖

sudo apt update
sudo apt install -y git g++ autoconf automake libtool libxml2 libxml2-dev 
                    libpcre++-dev libyajl-dev pkg-config libcurl4-openssl-dev 
                    libgeoip-dev doxygen zlib1g-dev

下载并构建 ModSecurity v3 Core Library

git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecuritycd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make
sudo make install

编译 Nginx ModSecurity 连接模块

sudo apt install -y libnginx-mod-http-modsecurity nginx

配置 Nginx 加载模块并启用 ModSecurity

在 Nginx 配置中添加

load_module modules/ngx_http_modsecurity_module.so;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

准备 ModSecurity 配置规则

cd /etc/nginx/modsec/
git clone https://github.com/coreruleset/coreruleset.gitmv coreruleset crscp crs/crs-setup.conf.example crs/crs-setup.conf
Include /usr/local/modsecurity/lib/modsecurity.conf-recommended
Include /etc/nginx/modsec/crs/crs-setup.conf
Include /etc/nginx/modsec/crs/rules/*.conf

DetectionOnly 为 On

重启 Nginx 验证

sudo nginx -t
sudo systemctl restart nginx

访问网站时查看 /var/log/modsec_audit.log 或 /var/log/nginx/error.log 是否有拦截日志。

根据 IP 归属地(国家、地区)限制访问

安装 GeoIP 依赖

sudo apt install nginx-module-geoip geoip-database

下载并更新 GeoLite2 数据库(需注册账号)

注册获取下载链接:

https://dev.maxmind.com/geoip/geolite2/

配置 Nginx 使用 GeoIP

修改 /etc/nginx/nginx.conf:

http {
    geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
        auto_reload 5m;        $geoip2_data_country_code default=CN source=$remote_addr;
    }

    map $geoip2_data_country_code $allowed_country {
        default no;
        CN yes;
        US yes;   # 可允许多个国家
    }

    server {
        listen 80;        if ($allowed_country = no) {            return 403;
        }

        location / {            # 正常服务配置
        }
    }
}




上一篇:O2OA(翱途)支持高斯_openGauss,瀚高_HighGo,磐维_panweidb等各种国产postgres分支数据库接入

下一篇:没有了!