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"; #用于正向访问
}
}
}