Nginx 强制对允许子网中的 IP 进行身份验证

Nginx 强制对允许子网中的 IP 进行身份验证

我正在为办公室内托管的站点实施身份验证,我有一个用于对用户进行身份验证的 PAM 身份验证模块,到目前为止运行良好。

问题是我只需要对来自 Internet(外部)的用户进行身份验证,在本例中是 IP 192.168.12.1,它是将所有外部流量路由到内部 Web 服务器的网关设备。

我目前拥有的相关配置如下:

server {
    listen   80;
    server_name  xxxxxxxxxx;

    access_log  /var/log/nginx/xxxxxxxx.log;

    location / {

          satisfy any;

          allow 192.168.1.0/24; ##Office subnet
          allow 192.168.11.0/24; ##Office subnet

          ##Inside this subnet is the IP that needs to have auth 192.160.12.1
          allow 192.168.12.0/24; ## Office subnet

          auth_pam    "XXXXXXXXXX";
          auth_pam_service_name   "nginx";

          proxy_pass      http://xx.xx.xx.xx/; ## Redirects to desired web server
    }   
}

如果我使用

满足所有;

这将要求每个用户(内部和外部)进行身份验证,这不是我需要的

如果我像这样拒绝 192.168.12.1:

          deny 192.168.12.1;
          allow 192.168.1.0/24; ##Office subnet
          allow 192.168.11.0/24; ##Office subnet
          allow 192.168.12.0/24; ## Office subnet

我立即收到 403 禁止

如果我像这样拒绝 192.168.12.1:

          allow 192.168.1.0/24; ##Office subnet
          allow 192.168.11.0/24; ##Office subnet
          allow 192.168.12.0/24; ## Office subnet
          deny 192.168.12.1;

它只是绕过了身份验证

我需要一种方法来强制 192.168.12.1 通过身份验证,但又不阻止整个子网 192.168.12.0/24,因为那里还有其他设备应该能够在没有身份验证的情况下登录。

答案1

预计您会得到 403 错误deny。诀窍是省略 192.168.12.1,而不是在语句中明确提及它allow/deny。试试这个。

satisfy any;

allow 192.168.1.0/24;
allow 192.168.11.0/24;

allow 192.168.12.2/32;
allow 192.168.12.3/32;
allow 192.168.12.4/30;
allow 192.168.12.8/29;
allow 192.168.12.16/28;
allow 192.168.12.32/27;
allow 192.168.12.64/26;
allow 192.168.12.128/25;

auth_pam "XXXXXXXXXX";
auth_pam_service_name "nginx";

答案2

接受的答案不再正确。该行为是一个错误,已在 nginx 1.5.7 (2013) 中修复。您可以执行以下操作,强制对 1.2.3.4 进行基本身份验证,同时授予所有其他 IP 的访问权限:

location / {
    satisfy any;

    deny 1.2.3.4;
    allow 0.0.0.0/0;

    auth_basic "Access denied";
    auth_basic_user_file /etc/nginx/htpasswd;
}

这也是记录在这里。请注意,nginx 以首场比赛方式。

相关内容