nginx认证模块

2018-07-17 10:16:06

ngx_http_access_module

该模块会根据客户端地址来限制访问。

Syntax:	allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

允许访问,unix: 代表允许所有的 unix domain sockets 访问。

Syntax:	deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

拒绝访问

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

匹配顺序从上到下,直到第一个匹配到。


ngx_http_auth_basic_module

该模块实现用户访问认证,基于 HTTP Basic Authentication 协议,只有匹配到正确的用户名和密码才能访问。

Syntax:	auth_basic string | off;
Default: auth_basic off;
Context: http, server, location, limit_except

off 代表关闭认证,指定字符串代表开启认证。当没有认证时服务器会在响应头里带上如下信息。

WWW-Authenticate: Basic realm="string"


Syntax:	auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except

指定认证文件,格式如下:

# comment
name1:password1
name2:password2:comment
name3:password3

密码可以通过 htpasswd 或者 openssl passwd 加密。


接下来我们生成存放密码的文件,账号为 freecls,密码为 1234。

[root@192 ~]# echo freecls:`openssl passwd 1234` > /tmp/auth.txt
[root@192 ~]# cat /tmp/auth.txt 
freecls:K2eoZIEWDsIBc

在nginx.conf里需要认证的地方加上配置。

auth_basic "test";
auth_basic_user_file /tmp/auth.txt;

此时如果浏览器第一次访问,则会收到类似于如下的响应头。

HTTP/1.1 401 Unauthorized
Server: nginx/1.14.0
Date: Tue, 17 Jul 2018 01:35:26 GMT
Content-Type: text/html
Content-Length: 195
Connection: keep-alive
WWW-Authenticate: Basic realm="test"

此时浏览器将会弹出框要我们输入用户名和密码进行认证。当我们输入提交时,浏览器就会在每次请求时在请求头上带上用户名和密码的加密信息如下,此时认证完成。

Authorization: Basic ZnJlZWNsczoxMjM0


ngx_http_auth_request_module

该模块实现了通过子请求返回的状态码来认证客户端是否合法。返回状态码 2xx 代表允许,401 或 403代表拒绝,其他代表出错。该模块默认不编译进 nginx,需要在编译的时候带上 --with-http_auth_request_module。

Syntax:	auth_request uri | off;
Default: auth_request off;
Context: http, server, location

uri 为指定内部跳转的uri。

Syntax:	auth_request_set $variable value;
Default: —
Context: http, server, location

在认证完成之后设置变量。

location /private/ {
    auth_request /auth;
    ...
}

location = /auth {
    proxy_pass ...
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}


上面介绍的认证模块可以组合使用,同时也可以配合上篇文章的 ngx_http_core_module 模块里的 satisfy 指令使用如。

location / {
    satisfy any;

    allow 192.168.1.0/32;
    deny  all;

    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}

上面指令代表 地址认证或用户名密码认证通过即允许访问。


 备注

1.测试环境centos7 64位,nginx版本为 1.14.0。
2.读者也可以参考官方文档 nginx documentation
3..原文地址http://www.freecls.com/a/2712/b8


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。