Nginx HTTP基本身份验证,允许特定IP地址的例外。

4
我想为我的Web应用程序设置基本身份验证。
该应用程序使用nginx 1.12.2和Apache 2.2.15(虽然这是一个测试实例,生产实例使用1.12.2和2.4.6),并运行在CentOS 7服务器上。
我一直在使用这里的教程来做这件事。我已经成功地让身份验证工作了,并且在浏览器中导航到网站时会弹出要求用户名和密码的窗口。但是,我无法让IP白名单正常工作-无论我从哪里连接,都会要求凭据。
目标是我们网络上的任何人或通过我们的VPN连接的人都不必输入这些凭据。看起来应该很简单,但我无法让它正常工作。
实质上,我们需要允许范围在192.168.1.1-192.168.1.255以及VPN地址10.8.0.x之间的任何人访问此内容。
在尝试IP地址控制之前,我必须调整nginx配置文件中添加身份验证信息的部分才能让其正常工作。但是,IP控制未按预期工作。我看不出我错过了什么。以下是/etc/nginx/sites-available/myapp.conf的内容。
upstream myapplication-3.3.2 {
        server 127.0.0.1:18805;
}

server {
  listen 80;
  server_name mydomain.com;
  location '/.well-known/acme-challenge' {
    default_type "text/plain";
    root  /srv/letsencrypt;
  }
  location / {
    return 301 https://$server_name$request_uri;
  }
}

server {
        listen 18804;
        location / {
                return 301 https://$host$request_uri;
        }
}


server {
        listen 80;
        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        listen 443 ssl;
        server_name mydomain.com;

        access_log /var/log/nginx/myapplication3.access.log;
        error_log /var/log/nginx/myapplication3-errors.log;

        ssl on;
        ssl_certificate_key /home/user1/.acme.sh/mydomain.com/mydomain.com.key;
        ssl_certificate /home/user1/.acme.sh/mydomain.com/fullchain.cer;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        satisfy any;
        allow 127.0.0.1;
        allow 192.168.1.1/24;
        allow 10.8.0.0/24;
        deny all;

        auth_basic      "Authentication required";
        auth_basic_user_file /etc/httpd/.htpasswd;

        client_max_body_size 0;

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://myapplication-3.3.2;
        }
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
}

编辑

根据建议,我已经确定问题与我编写IP地址本身的方式有关。我可以使用0.0.0.0/0来获得一个工作异常,这是一个好的开始,如果我使用我的实际公共IP地址也可以。但是,我似乎无法使用我的私有/内部IP地址范围添加异常。我尝试了几种方法,包括:

192.168.1.0/24 "off";
192.168.1.1/24 "off"
192.168.1.0/32 "off"
192.168.1.0/32 "off"

尽管我的IP地址是192.168.1.22,但在访问该页面时仍提示进行身份验证。

编辑添加以回答问题。

当我有192.168.1.0/24 "off"时,在尝试访问该页面时,在日志中看到以下内容。

78.432.xx.xxx - - [23/Jan/2018:14:01:19 +0000] "GET /favicon.ico HTTP/1.1" 401 195 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"

我猜这意味着nginx认为我的公共IP地址是我的,所以要求我提供凭据。不过我想应该有办法告诉它同时查找公网和私网地址。

因此,我尝试使用内部IP地址而非域名连接,能够成功连接且无需提供凭据。


你是否查看了日志以了解nginx认为你的IP是什么? - Shawn C.
再次编辑,简而言之,您的问题让我意识到当我使用域名尝试访问应用程序时,nginx仅注册我的公共/外部IP地址。我需要使用内部/私有地址。 - shaneoh
我认为你已经超出了原始问题的范围,到了一个类似于 https://serverfault.com/ 的问题。 - Shawn C.
1
我认为你是正确的。你对原问题的回答是正确的,但现在它已经偏离了。我会转到Serverfault,谢谢。 - shaneoh
1个回答

15
你需要的是 geo 指令。这应该可以基于 IP 地址打开和关闭身份验证,只需删除允许和拒绝 IP 范围即可。在测试过程中进行操作。
geo $authentication {
    default "Authentication required";
    127.0.0.1 "off";
    192.168.1.1/24 "off";
    10.8.0.0/24 "off";
    ...
}

server {
    ...
    location / {
        ...
        auth_basic $authentication;
        auth_basic_user_file /etc/nginx/.htpasswd;
        ...
    }
}

我最近几天一有时间就在尝试这个,但似乎无法让它正常工作。我能做到的最接近的是使用基本身份验证进行连接,但无法允许来自这些地址的连接绕过它。 - shaneoh
1
在我的一个测试子域上进行了测试,就像上面那样,除了 IP 范围,它对我起作用了。确保 auth_basicauth_basic_user_file 在位置内部,否则可能无法正常工作。 - Shawn C.
请提供需要翻译的内容。 - shaneoh
对我来说不起作用,即使将IP加入白名单后仍然收到基本身份验证输入。 - Hassen Ch.
你需要将 auth_basic / auth_basic_user_file 放置在 "location" 中。 - RSiqueira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接