Nginx HTTP基本身份验证,具有特定IP地址的例外情况

时间:2018-01-16 10:32:18

标签: nginx basic-authentication

我正在为我运行的网络应用设置基本身份验证。

该应用程序使用的是nginx 1.12.2以及Apache 2.2.15(尽管这是一个测试实例,生产实例使用的是1.12.2和2.4.6)。它全部运行在CentOS 7服务器上。

我一直在使用教程here来执行此操作。我设法让身份验证工作,当我在浏览器中导航到该站点时,我会弹出一个要求输入用户名和密码的信息。但是,我无法使IP白名单工作 - 无论我在何处连接,都会请求凭据。

目标是我们网络上或通过我们的VPN连接的任何人都不必输入这些凭据。看起来它应该非常简单,但我无法让它发挥作用。

基本上我们需要192.168.1.1-192.168.1.255范围内的任何人能够访问它,以及10.8.0.x范围内的VPN地址。

在尝试IP地址控制之前,我不得不在nginx conf文件中的哪个地方放置认证信息以使其正常工作,并发现它必须在我添加的部分中。但是,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地址而不是域名进行连接,是的,我可以连接没有凭据。

1 个答案:

答案 0 :(得分:3)

您正在寻找的是geo指令。这应该 进行测试 根据IP地址打开和关闭身份验证。只需删除allow和deny 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;
        ...
    }
}