Назад | Перейти на главную страницу

Nginx форсирует аутентификацию для IP в разрешенной подсети

Я реализую аутентификацию для сайтов, размещенных внутри офиса, у меня есть модуль аутентификации PAM, который аутентифицирует пользователей, и пока он работает хорошо.

Проблема в том, что мне нужно аутентифицировать ТОЛЬКО пользователей, которые приходят из Интернета (внешнего), в данном случае IP 192.168.12.1, который является устройством шлюза, который направляет весь внешний трафик на внутренний веб-сервер.

Соответствующая конфигурация, которая у меня есть, такова:

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
    }   
}

Если я использую

удовлетворить всех;

Это потребует от каждого пользователя (внутреннего и внешнего) авторизации, это не то, что мне нужно.

Если я поставлю deny 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 запрета

Если я поставлю 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
          deny 192.168.12.1;

Он просто обходит аутентификацию

Мне нужен способ заставить 192.168.12.1 пройти аутентификацию, но без блокировки всей подсети 192.168.12.0/24, поскольку там есть другие устройства, которые должны иметь возможность регистрироваться без аутентификации.

Принятый ответ больше не правильный. Поведение было ошибкой, которая была исправлена ​​в 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 обрабатывает директивы allow и deny в первый матч манера.

Ожидается, что вы получите 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";