sha*_*eoh 1 nginx basic-authentication
我正在为运行的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范围内的任何人都可以访问它,以及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;
}
Run Code Online (Sandbox Code Playgroud)
编辑
根据这些建议,我确定该问题与我自己编写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"
Run Code Online (Sandbox Code Playgroud)
但是尽管我的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"
Run Code Online (Sandbox Code Playgroud)
我认为这意味着要求我提供凭据,因为nginx认为公共IP地址是我的。我认为必须有某种方法可以告诉它同时查找公共和私人/内部地址。
因此,我也尝试使用内部IP地址而不是域名进行连接,是的,我无法使用任何凭据进行连接。
您正在寻找的是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;
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3912 次 |
| 最近记录: |