我正在为办公室内托管的站点实施身份验证,我有一个用于对用户进行身份验证的 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 以首场比赛方式。