介绍
Nginx的访问控制分为:
基于IP的访问控制
http_access_module
。基于用户的信任登录
http_auth_basic_module
。
一、基于IP的访问控制
配置语法:
1 | Syntax: allow address|CIDR|unix:|all; |
address
表示ip地址。
CIDR
表示网段。例:
192.168.1.0-24
。unix
主要在linux,unix上面用到的socket方式的访问。
all
允许所有的。
与之对应的不允许访问的配置语法:
1 | Syntax: deny address|CIDR|unix:|all; |
二、基于IP的访问控制演示
查询自己本机的出口ip
1
2https://www.ip138.com/ // 公网查看本机ip
ipconfig/ifconfig // 内网环境查看本机ip新建admin.html
1
2
3
4
5
6
7
8
9<html>
<head>
<meta charset="utf-8">
<title>admin</title>
</head>
<body style="background-color:red;">
<h1>Admin</h1>
</body>
</html>修改配置文件
1
2
3
4
5
6
7[root@node1 conf.d]# mv default.conf access_mod.conf
location ~ ^/admin.html {
root /opt/app/code;
deny 192.168.x.xxx;
allow all;
index index.html index.htm;
}重载nginx服务
1
2
3
4[root@node1 conf.d]# nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@node1 conf.d]# nginx -s reload -c /etc/nginx/nginx.conf访问测试
1
2403 Forbidden
nginx/1.16.1测试只允许信任的ip访问
1
2
3
4
5
6location ~ ^/admin.html {
root /opt/app/code;
allow 192.168.x.0/24; // 配置ip段方式
deny all;
index index.html index.htm;
}
三、基于IP的访问控制局限性
Nginx基于ip的访问控制的原理是基于客户端的ip,但是对于nginx来说,他不知道哪个是真正的客户端。如果我们的访问不是客户端与服务端直接连接,而是通过了一层代理(nginx,7层负载均衡,CDN),因为http_access_module
是基于remote_addr
来进行识别客户端的ip。如上图,IP1是客户端,IP3是服务端,而IP1通过IP2去访问IP3的时候,remote_addr
就识别的是IP2。也就是说我们想对客户端IP1进行访问限制是没有起到作用,反而是对中间的代理IP2进行了限制。所以说他的准确率是不高的。
如何解决这个问题呢?
方法一
采用别的HTTP头信息控制访问,如:
http_x_forwarded_for
。从上图可以看出:
1
2
3http_x_forwarded_for=IP1,IP2
http_x_forwarded_for=ClientIP,Proxy(1)IP,Proxy(1)IP,...方法二
结合geo模块做。
方法三
通过HTTP自定义变量传递。
四、基于用户的信任登录
配置语法:
1 | Syntax: auth_basic string|off; |
string
这个字符串即表示了开启,又会在前端显示出了字符串的信息,也可以作为前端的登录提示。
1 | Syntax: auth_basic_user_file file; |
file
文件配置路径,用来作为认证存储用户名和密码信息的文件。密码文件格式:
1
2
3
4# comment
name1:password1
name2:password2:comment
name3:password3需要先安装htpasswd,可以直接安装httpd-tools这个包:
1
[root@node1 conf.d]# yum install httpd-tools -y
首次需要先生成密码文件:
1
2
3
4
5
6[root@node1 nginx]# htpasswd -c ./auth_conf duan
New password:
Re-type new password:
Adding password for user duan
[root@node1 nginx]# more ./auth_conf
duan:$apr1$yBkwo1kS$vPr2sM.EfrcNcuzqSHfz9/
五、基于用户的信任登录演示
修改配置文件
1
2
3
4
5
6location ~ ^/admin.html {
root /opt/app/code;
auth_basic "Auth access test!input your passward!";
auth_basic_user_file /etc/nginx/auth_conf;
index index.html index.htm;
}重载nginx服务
1
2
3
4[root@node1 conf.d]# nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@node1 conf.d]# nginx -s reload -c /etc/nginx/nginx.conf访问测试
1
http://192.168.x.xxx/admin.html // 需要输入用户名密码
六、基于用户的信任登录局限性
- 用户信息依赖文件方式
- 操作管理机械,效率低下
解决方式:
- Nginx结合LUA实现高效验证
- Nginx和LDAP打通,利用
nginx-auth-ldap
模块