access模块
- 用于限定特定IP或者是网段进行访问的,从而实现Nginx的一个访问权限控制
- 这个模块,它仅能够针对IP或者网段的一个访问
1 )指令集
1.1 allow
- 语法结构: allow address | CIDR | UNIX | all
- all 是放行所有
- address 可以是 ip 地址,比如: 1.1.1.1; 还可以是网段 192.168.1.0/24 (子网掩码是24位的)
- CIDR 和 UNIX 用的不多
- 默认值: 无
- 上下文: http、server、location、limit_except
- 示例
- allow 192.168.0.10; 只允许一个ip
1.2 deny
- 语法结构: deny address | CIDR | UNIX | all
- 这和 allow 完全一样
- 默认值: 无
- 上下文: http、server、location、limit_except
- 也和 allow 完全一样
- 示例
- deny 192.168.0.0/24;
2 )组合示例
conf
location / {
deny 192.168.1.1; # 注意这个在下面一个allow的范围之内,要先写上
allow 192.168.1.0/24; # 这个范围比上面 deny 的ip范围要大
allow 10.1.1.0/16;
allow 2001:0db8::/32; # ipv6的写法
deny all; # 除了上面的放行,其余一律拒绝
}
- 被拒绝的服务会显示 403
auth_basic模块
- 它是限制特定用户访问的模块,对特定的URL来说,它必须通过提供的一个用户名或者密码来进行访问
- 这在一些应用场景中是有用的,我们可能内部有一些系统针对不同的部门提供特定访问的时候
- 我们可能针对某一个员工的用户名来进行访问
- 这样一个模块,其实在这样一个应用场景中是很有效的
1 )基本功能
- 基于HTTP Basic Authentication 协议进行用户名密码认证
- 默认已编译进Nginx,通过
--without-http_auth_basic_module
禁用
2 ) 指令
2.1 auth_basic
- 语法:auth_basic string | off;
- 这里的 string 是提示框的信息
- 默认值:auth_basic off;
- 上下文:http、server、location、limit_except
2.2 auth_basic_user_file
- 语法:auth_basic_user_file file;
- 验证用户名和密码的文件,放在哪里
- 下面会有如何生成这个密码文件
- 默认值:-
- 上下文:http、server、location、limit_except
3 )生成密码文件工具
- 可执行程序: htpasswd
- 所属软件包:httpd-tools
- 生成新的密码文件:htpasswd -bc encrypt_pass jack 123456
- -c 是第一次添加时,后续不需要
- encrypt_pass 是文件名
- 添加新用户密码:htpasswd -b encrypt_pass mike 123456
- 再次执行,后面的用户名和密码会覆盖前面的
4 )配置示例
-
查看是否安装
which htpasswd
, 没有的话,下载后本地安装 -
先安装依赖:$
yum install apr apr-util
-
$
rpm -ivh httpd-tools-2.4.6-90.el7.centos.x86_64.rpm
这个是本地已有的包 -
安装成功后,查看里面有哪些文件 $
rpm -ql httpd-tools
conf/usr/bin/ab /usr/bin/htdbm /usr/bin/htdigest /usr/bin/htpasswd /usr/bin/httxt2dbm /usr/bin/logresolve /usr/share/doc/httpd-tools-2.4.6 /usr/share/doc/httpd-tools-2.4.6/LICENSE /usr/share/doc/httpd-tools-2.4.6/NOTICE /usr/share/man/man1/ab.1.gz /usr/share/man/man1/htdbm.1.gz /usr/share/man/man1/htdigest.1.gz /usr/share/man/man1/htpasswd.1.gz /usr/share/man/man1/httxt2dbm.1.gz /usr/share/man/man1/logresolve.1.gz
- 可以看到,其中包含:/usr/bin/htpasswd
-
现在我们来生成文件
-
$
cd /opt/nginx/
-
$
mkdir auth
-
$
cd auth
-
$
htpasswd -b -c encrypt_pass wang 123456
Adding password for user jack
-
$
cat encrypt_pass
查看文件,生成一串秘钥,前面是 wang:$这里跟着一串秘钥 -
$
htpasswd -b encrypt_pass lee 654321
- 这是第二次生成,并且是一个新用户
- 这时候会出现两个用户,不会覆盖
-
现在开始进行配置
conf
{
location /bbs/ {
auth_basic "test user pass";
auth_basic_user_file /opt/nginx/auth/encrypt_pass; # 注意,这里最好是绝对路径,防止出错
root html;
index index.html;
}
}
- 要保证有 /opt/nginx/html/bbs/index.html 文件
- 按照上述的配置,访问 / 不会有任何提示
- 访问 /bbs 路径后会有如下提示
- 输入用户密码后,就可以访问该页面
- 再次刷新,也不会需要要求输入密码,浏览器已经帮你记住了
auth_request
- 它也是一个访问控制的模块,在实际的生产环境的应用还是比较多的
- 比如,基于安全的考虑,通常会有一些鉴权的服务器
- 当你需要访问特定的应用模块的时候,首先需要去跟这些鉴权服务器发起请求
- 鉴权服务器再对你鉴权通过以后,才能正常的去访问我们的业务系统
1 )功能和原理
- 当它基于一个特定URI发起请求的时候,它会生成一个子请求
- 这个子请求会是鉴权模块实现的一个能力
- 这个鉴权模块,如果说对这个请求做完处理之后,会返回一个正常的HTTP的响应码
- 它会根据 HTTP 响应码去做一定的访问控制, 比如,非 2xx 都认为是鉴权失败的
- 参考如下图:
2 )启用和禁用
- 默认并没有编译进 Nginx, 通过
--with-http_auth_request_module
启用
3 )指令
3.1 auth_request
- 语法:auth_request uri | off;
- 默认值:auth_request off;
- 上下文:http、server、location
3.2 auth_request_set
- 语法:auth_request_set $variable value;
- 默认值:-
- 上下文:http、server、location
4 ) 配置示例
conf
location /private/ {
auth_request /auth; # 类似于重定向
}
location /auth {
proxy_pass http:/127.0.0.1:8080/verify; # 反向代理,这是一个鉴权服务,返回 2xx 则鉴权成功,才会再去访问 /private
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
- 要请求 /private 的时候,会先发起对 /auth 的请求
5 ) 环境准备
-
这里在服务器上调试一下, 准备一台服务器,Nginx 默认没有编译该模块, nginx -V 可查看到是否有该模块
-
找到 nginx 的二进制文件删除 $
rm -rf nginx
-
找到 configure 文件重新配置, 如下
conf./configure --prefix=/opt/nginx --conf-path=/opt/nginx/conf/nginx.conf --user=nginx --group=nginx --pid-path=/opt/nginx/pid/nginx.pid --error-log-path=/opt/nginx/logs/error.log --with-pcre=/opt/source/pcre-8.43 --with-zlib=/opt/source/zlib-1.2.11 --with-http_ssl_module --with-http image_filter_module --with-http stub_status_module --http-log-path=/opt/nginx/logs/access.log --with-http_perl_module --with-http_auth_request_module
- 最后一个是要加入的,前面的那么多,从 nginx -V 命令输出中可以拷贝
-
检查完,没有问题,可以用 $
make
重新编译, -
之后,进行安装 $
make install
6 )配置测试
6.1 普通测试
conf
server {
listen 8080;
charset utf-8;
location /auth.html {
return 200 "Success" # 这里模拟鉴权成功
# return 403 "Failed, give the Page of Auth Server Success\n"; # 这里模拟错误的鉴权
}
}
-
curl http://192.168.184.20:8080/auth.html 返回结果如下
htmlSuccess
或者
htmlFailed, give the Page of Auth Server Success
-
curl curl http://192.168.184.20:8080/auth.html -I 返回
htmlHTTP/1.1 200 OK Server:nginx/1.12.2 Date: Sat, 19 Oct 2019 14:51:24 GMT Content-Type: text/html; charset=utf-8 Content-Length:44 Connection: keep-alive
或者
htmlHTTP/1.1 403 Forbidden Server:nginx/1.12.2 Date: Sat, 19 Oct 2019 14:51:24 GMT Content-Type: text/html; charset=utf-8 Content-Length:44 Connection: keep-alive
-
初步测试,正常
6.2 正式测试
conf
server {
listen 8080;
charset utf-8;
root html;
location /OA/ {
auth_request /auth;
index index.html # 要保证有此文件, 只要鉴权成功,就会返回这个文件内容
}
location /auth {
# 这里是模拟的鉴权接口,成功会返回 200, 失败返回 403
# 如果鉴权失败,则会返回下面这个接口返回的错误信息
proxy_pass http://192.168.184.20:8080/auth.html;
}
}
- 注意,替换真实鉴权的接口
- 整个过程实现了一个鉴权服务器