Nginx: 配置项之access模块、auth_basic模块、auth_request模块

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 返回结果如下

    html 复制代码
    Success

    或者

    html 复制代码
    Failed, give the Page of Auth Server Success
  • curl curl http://192.168.184.20:8080/auth.html -I 返回

    html 复制代码
    HTTP/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

    或者

    html 复制代码
    HTTP/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; 
	}
}
  • 注意,替换真实鉴权的接口
  • 整个过程实现了一个鉴权服务器
相关推荐
yaosheng_VALVE10 分钟前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
扣得君1 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9851 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
death bell3 小时前
Docker基础概念
运维·docker·容器
ʚɞ4963 小时前
应用程序部署(IIS的相关使用,sql server的相关使用)
运维·服务器
少陽君3 小时前
服务器显卡和桌面pc显卡有什么不同
运维·服务器
daizikui3 小时前
Linux文件目录命令
linux·运维·服务器