我想为我的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的内容。
该应用程序使用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地址而非域名连接,能够成功连接且无需提供凭据。