nginx 安全加固教程
请求限制
TCP连接频率限制:limit_conn_module
语法: limit_conn_zone key zone=name:size; 解释:申请限制连接的区域 限制的键 申请的区域名:区域大小; 该语法在http下配置
语法:limit_conn zone_name number; 解释:限制连接 申请过的区域名字 并发数量限制 该语法在http、server、location下配置
# >>> vim /etc/nginx/conf.d/default.conf
# 对客户端IP地址进行连接限制
limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
server {
#...
location / {
root /usr/share/nginx/html;
# 限制客户端同一时刻只允许一个IP连接过来
limit_conn conn_zone 1;
index index.html index.htm;
}
}
HTTP请求频率限制: limit_req_module
语法: limit_req_zone key zone=name:size rate=rate; 解释:申请限制请求的区域 限制的键 申请的区域名:区域大小 限制每秒最大多少个请求; 该语法在http下配置
语法:limit_req zone_name [burst=number][nodelay];
解释:限制请求 申请过的区域名字 该语法在http、server、location下配置
# >>> vim /etc/nginx/conf.d/default.conf
# 对与同一个客户端IP地址,只允许1s发起一个请求
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
#...
location / {
root /usr/share/nginx/html;
limit_req zone=req_zone;
# 在超过指定速率以后,保证后面的3个包在后一秒执行,其他包直接返回503
# limit_req zone=req_zone burst=3 nodelay;
# limit_req zone=req_zone burst=3;
index index.html index.htm;
}
}
$binanry_remote_addr 会比 $remote_addr 小
访问控制
基于IP的访问控制
http_access_module
语法:
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
该语法在http、server、location、limit_except下配置(影响范围不一样)
示例
vim /etc/nginx/conf.d/access_mod.conf
server {
listen 80;
server_name localhost;
location / {
# 如果代理服务信息头里面没有这个ip则拒绝访问
if ( &http_x_forwarded_for !~* "116\.62\.103\.228") {
return 403;
}
root /var/www/html;
index index.html index.htm;
}
location ~ ^/admin.html { # URL模式匹配,admin.html开头的
root /var/www/html;
deny 222.128.189.17; # 拒绝某个IP不能访问
deny 222.128.111.0/24; # 拒绝某个IP网段
allow all; # 允许剩下所有IP可以访问
index index.html index.htm;
}
}
局限性
http_access_module局限性:
方法一:采用http头中HTTP_X_FORWARD_FOR信息
方法二:结合geo模块作
方法三:通过HTTP自定义变量传递
账号密码基本认证
http_auto_basic_module
语法: auth_basic string | off; # 开启关闭功能
默认:off
该语法在http、server、location、limit_except下配置
语法:auth_basic_user_file file; # 用户名密码文件
该语法在http、server、location、limit_except下配置
示例
创建账号密码文件
# 安装htpasswd命令工具: yum install httpd-tools
htpasswd -c /etc/nginx/auth_conf user1 # 创建user1用户
配置文件
vim /etc/nginx/conf.d/auth_mod.conf
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
location ~ ^/admin.html { # 模式匹配,admin.html开头的
root /var/www/html;
# 开启认证
auth_basic "Auth access test!input your password!";
# 账号密码文件
auth_basic_user_file /etc/nginx/auth_conf;
index index.html index.htm;
}
}
局限性
Nginx和LDAP打通,利用nginx-auth-ldap模块
waf防火墙
cd /opt/download/
git clone https://github.com/loveshell/ngx_lua_waf.git
mv /opt/download/ngx_lua_waf /etc/nginx/waf/
cd /etc/nginx/waf
vim config.lua # waf配置文件
CCDeny="on" # 打开访问频率限制
CCrate="600/60" # 单个ip每60秒访问600个
#>>> vim /etc/nginx/nginx.conf
http {
lua_package_path "/etc/nginx/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /etc/nginx/waf/init.lua;
access_by_lua_file /etc/nginx/waf/waf.lua;
}
# nginx -tc /etc/nginx/nginx.conf # 检查配置
# nginx -s reload -c /etc/nginx/nginx.conf