环境:
CentOS7
Nginx 1.16.0
Nginx的访问控制实现中存在如下两种方式:
基于IP的访问控制 : http_access_module
基于用户的信任登录 : http_auth_basic_module
1. http_access_module
配置语法:
Syntax: allow address | CIDR | unix: | all;
Default: ——
Context: http, server, location, limit_except
address: IP地址
CIDR: 网段
UNIX: socket
all: 允许所有
Syntax: deny address | CIDR | unix: | all;
Default: ——
Context: http, server, location, limit_except
与allow相反,即不允许
实践:
对配置文件进行修改, 保存重启nginx。
当用浏览器访问/
访问/test.html
即本地无权访问/test.html
access的局限性: 如果访问并不是由客户端直接访问服务端, 而是通过代理进行访问, 那么仅仅识别ip是无法有效的进行限制的。
一种解决办法, 采用别的http头信息进行控制,如 x_forwarded_for,但不一定所有的代理都会存在该头信息,并且可能存在该信息被修改的情况:
另外: 可以结合GEO模块
还可以用http自定义变量传递
2.http_auth_basic_module
配置语法:
Syntax: auth_basic string | off;
Default: auth_basic off;
Context: http, server, location, limit_except
string 所填的字符串非off即为开启, 且会作为提示出现
Syntax: auth_basic_user_file file;
Default: ——
Context: http, server, location, limit_except
file 用来存储认证所用用户名密码的文件路径
实践:
首先生成存储用户名密码的文件
查看一下:
接下来编辑配置文件:
保存退出后检查语法, 重启nginx服务
浏览器访问/test.html, 有如下画面:
输入之前设置的账户密码后即可查看到页面
若不输入则返回401错误
同样, 这种验证方式也存在许多局限性, 操作繁琐,更改麻烦
当然也有几种解决方式:
- Nginx结合LUA实现高效验证
- Nginx和LDAP打通,利用nginx-auth-ldap模块