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

Защита местоположения по IP при применении базовой аутентификации везде

Я хочу добиться следующих результатов:

Это конфигурация nginx, которую я использую:

server {
    listen 80 default;

    # Basic auth
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    satisfy any;
    # IP whitelist
    include /etc/nginx/conf.d/ip-whitelist.conf.include;
    deny all;

    # Lock down the "hello" directory to specific IP addresses
    location /hello/ {
        # Developers only - ever!
        allow 12.34.56.78;
        deny all;
    }
    # ...
}

Что происходит в данный момент, так это то, что пункты один и два в маркированном списке выше работают - то есть любой IP-адрес в белом списке не имеет базовой аутентификации на сайте, но если IP-адрес не включен в белый список, им предлагается выполнить базовую аутентификацию.

Однако блок местоположения для "hello", похоже, не работает и по-прежнему допускает те же условия, что и выше, для всего в каталоге "hello", например если я попытаюсь получить доступ /hello/world.php с IP-адреса из белого списка он обслуживается. Если я обращаюсь к нему с IP-адреса, не внесенного в белый список, я получаю базовую аутентификацию.

Я хочу запретить доступ к каталогу "hello" для всех, кроме IP 12.34.56.78 (пример).

Что мне нужно изменить?

Как вы обнаружили, не рекомендуется изменять настройки аутентификации на уровне сервера, поскольку они будут применяться ко всем расположениям. Хотя можно отключить базовую аутентификацию, похоже, нет способа очистить существующий белый список IP-адресов.

Лучшим решением было бы добавить аутентификацию в / местоположение, чтобы оно не было унаследовано /hello.

Проблема возникает, если у вас есть другие места, требующие базовой аутентификации и белого списка IP, и в этом случае может быть стоит рассмотреть возможность перемещения компонентов аутентификации во включаемый файл или их вложения в /.

server {
    listen 80 default;

    # Lock down the "root" directory to specific IP addresses
    location / {
        satisfy any;

        # Basic auth
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        # IP whitelist
        include /etc/nginx/conf.d/ip-whitelist.conf.include;
        deny all;

        # Inherits auth settings from parent
        location ~ \.php$ {
            # PHP specific config
        }
    }

    # Lock down the "hello" directory to specific IP addresses
    location /hello/ {
        # Developers only - ever!
        allow 12.34.56.78;
        deny all;
    }
    # ...
}