1.限制国家访问

官方文档
https://nginx.org/en/docs/http/ngx_http_geoip_module.html

1.1 准备IP数据库

https://www.miyuru.lk/geoiplegacy
因为我们限制的是国家,选择Maxmind - Country中的IPv6/IPv4就可以了,下载下来的是一个gz格式的文件,使用命令解压即可:

gzip -d maxmind.dat.gz

注:这个网站大概率需要科学上网

1.2 重新编译Nginx

在编译nginx的时候需要加上以下参数: --with-http_realip_module --with-http_geoip_module

题外话:
Nginx在1.9.11版本中增加了动态模块加载支持,可使用命令查询:

./configure --help | grep dynamic
--with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module
--with-http_image_filter_module=dynamic
                                   enable dynamic ngx_http_image_filter_module
--with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module
--with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module
--with-stream=dynamic              enable dynamic TCP proxy module
--add-dynamic-module=PATH          enable dynamic external module

默认用来存放动态加载模块共享对象的二进制文件的路径为/usr/local/nginx/modules
若需要调用在全局配置文件中增加:
load_module "modules/ngx_http_geoip_module.so";

1.3 修改配置文件

http全局中增加以下内容:
geoip_country /path/maxmind.dat;

path路径根据实际情况而定
server中增加以下内容:

if ($geoip_country_code !~ ^(CN|US)$){
            return 406;
}

意为除中国和美国的地址无法访问站点

1.3Plus 优化配置文件

在设置了geoip后,局域网IP访问站点时同样会遭到拒绝,此时可增加geoip_proxy CIDR;参数保证局域网的访问。
优化后的Nginx配置:

http {
    ...
    geoip_country /path/maxmind.dat;
    geoip_proxy 10.0.0.0/8;
    geoip_proxy 172.16.0.0/12;
    geoip_proxy 192.168.0.0/16;
    map $geoip_country_code $allowed_country {
        default no;
        CN yes;
        US yes;
    }
    server {
        ...
        if ($allowed_country = no) {
            return 406;
        }
    }
}

2. 设置HTST

HSTS(HTTP Strict Transport Security)即HTTP 严格传输安全, 这是一种网站用来声明他们只能使用安全连接(HTTPS)访问的方法。 如果一个网站声明了 HSTS 策略,浏览器必须拒绝所有的 HTTP 连接并阻止用户接受不安全的 SSL 证书。

2.1 参数解析

max-age:单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。
includeSubDomains:可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。
preload:可选参数,一个浏览器内置的使用HTTPS的域名列表。

2.2 修改配置文件

http {
    server {
    ...
    add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
    }
}

3. SSL安全

3.1 TLS协议限制

建议仅采用TLSv1.2 TLSv1.3

3.2 SSL加密算法指定

当前有很多弱加密算法如MD5、RC4等,容易被黑客利用实施中间人等攻击,建议使用高强度加密算法
openssl所包含的加密算法可使用命令查询:

openssl ciphers -v

3.3 修改配置文件

http {
    server {
        ...
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5:!RC4:!DHE:!3DES;
        ssl_prefer_server_ciphers on;                     #此参数将指定服务器加密算法选择先于客户端加密算法
    }
}

4. 拒绝不安全的HTTP请求方法

http {
    server {
        ...
        if ($request_method !~* GET|POST) {
            return 405;
        }
    }
}

5. 设置仅允许域名方式访问

http {
    server {
        ...
        if ($host !~* 'example.com'){
            return 417;
        }
    }
}

6. 设置cookie为httponly

http {
    server {
        location ... {
            proxy_cookie_path "Path=/; HttpOnly; Secure";           #用于反向代理
            add_header Set-Cookie "Path=/; HttpOnly; Secure";    #用于正向访问
        }
    }
}
上一篇 下一篇