访问控制分类

Nginx访问控制共有两种模式:

基于IP的访问控制 ngx_http_access_module
基于用户登录认证 ngx_http_auth_basic_module

基于IP的访问控制

      ngx_http_access_module模块允许限制对某些客户端地址的访问。

配置格式

语法:allow address | CIDR | unix: | all;
默认:-
上下文:http,server,location,limit_except

语法:deny address | CIDR | unix: | all;
默认:-
上下文:http,server,location,limit_except

      允许指定的网络或地址访问。 如果unix:被设置,则允许所有UNIX域套接字的访问。
      拒绝指定的网络或地址访问。 如果unix:被设置,则拒绝所有UNIX域套接字的访问。

示例

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

      顺序检查规则,直到找到第一个匹配项。 在此示例中,仅对IPv4网络10.1.1.0/16和192.168.1.0/24(地址192.168.1.1除外)和IPv6网络2001:0db8::/32允许访问。在有很多规则的情况下,最好使用ngx_http_geo_module模块。

局限性

      ngx_http_access_module是根据remote_addr这个变量来识别客户端IP的,可以使用反向代理绕过这一配置。如下图所示,即使Nginx禁止IP1进行访问,但是通过反向代理后remote_addr的值为IP2。
请输入图片描述

解决方法

  • 采用别的HTTP头信息控制访问,如:HTTP_X_FORWARD_FOR
  • 结合geo模块
  • 通过HTTP自定义变量传递

基于用户登录认证

      ngx_http_auth_basic_module模块允许通过使用"HTTP基本身份验证"协议验证用户名和密码来限制对资源的访问。

配置格式

语法:auth_basic string | off;
默认:auth_basic off;
上下文:http, server, location, limit_except

语法: auth_basic_user_file file;
默认: —
上下文: http, server, location, limit_except

      按以下格式保留用户名和密码的文件:

name1:password1
name2:password2:comment
name3:password3

      文件名可以包含变量。
      支持以下几种密码类型:

  • crypt()函数加密;可以使用Apache HTTP Server发行版中的"htpasswd"函数或"openssl passwd"命令生成;
  • 使用基于MD5的密码算法(apr1)的Apache变体进行哈希处理;可以使用相同的工具生成;
  • 由RFC 2307中所述的"{scheme} data"语法(1.0.3)指定;当前实施的方案包括一些软件包使用的PLAIN(不应该使用示例1),SHA(1.3.13)(不应该使用普通SHA-1哈希)和SSHA(盐化的SHA-1哈希。OpenLDAP和Dovecot)。

添加了对SHA方案的支持,只是为了帮助从其他Web服务器进行迁移。 不应将其用于新密码,因为它使用的未加盐SHA-1哈希很容易受到彩虹表攻击。

示例

location / {
    auth_basic "Auth access";
    auth_basic_user_file /opt/nginxconf/auth_conf;
    root   html;
    index  index.html index.htm;
}

# auth_conf 文件使用htpasswd命令生成
# htpasswd -c filepath username

请输入图片描述

局限性

  • 用户信息依赖文件
  • 操作管理机械,效率低下

解决方案

  • Nginx结合LUA实现高效认证
  • Nginx和LDAP打通,利用nginx-auth-ladp模块
Last modification:November 2nd, 2020 at 10:26 am
如果觉得我的文章对你有用,请随意赞赏