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

Условно использовать базовую аутентификацию в nginx

У меня есть сервер NGINX, встроенный в образ Docker, который я хочу использовать как в производственной, так и в промежуточной среде.

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

Есть ли способ динамически применить базовую аутентификацию к серверу nginx? Я могу передать переменную среды в nginx или использовать предварительно определенное статическое имя хоста, чтобы отличать производство от развертывания.

Однако я не уверен, как условно использовать эти данные в nginx.

Вот моя конфигурация:

server {

    listen 80 default_server;

    # IF: %ENVIRONMENT% = 'staging' OR
    # IF: $host = 'example.com'
        auth_basic           "global";
        auth_basic_user_file /etc/nginx/.htpasswd;
    #

    root /var/www;

    location /health-check {
        auth_basic off;
        try_files /health-check.html =404;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

}

Любые предложения будут высоко оценены.

Nginx не поддерживает переменные среды в блоках server, location или http, но вы можете заменить вхождение конкретной переменной в файле конфигурации на значение значения среды на envsubst до того, как nginx загрузит его.

С таким конфигурационным файлом:

server {

    listen 80 default_server;

    auth_basic ${BASIC_AUTH_ENABLED};
    auth_basic_user_file /etc/nginx/.htpasswd;

    root /var/www;

    location /health-check {
        try_files /health-check.html =404;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

}

вы можете заменить "$ {BASIC_AUTH_ENABLED}" значением переменной env BASIC_AUTH_ENABLED бегом

envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf

Первый параметр '${BASIC_AUTH_ENABLED}' указывает envsubst заменять только те вхождения, которые соответствуют этому тексту (обязательно используйте простые кавычки, иначе расширение параметра может произойти до выполнения самого envsubst).

Если значение auth_basic имеет особую ценность off, базовая аутентификация отключена (см. nginx документация по auth_basic).

В качестве точки входа вашего контейнера Docker вы можете запустить сценарий bash, например:

if
    [ ${BASIC_AUTH_ENABLED} = "true" ] ;
then
    htpasswd -cb -B -C 10 /etc/nginx/.htpasswd ${BASIC_AUTH_USER} ${BASIC_AUTH_PASSWORD} ;
else
    export BASIC_AUTH_ENABLED=off ;
fi
envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf

Поэтому, если вы включили базовую аутентификацию, зашифруйте пароль для данного пользователя, в противном случае установите значение env var на «off» специально, чтобы nginx отключил базовую аутентификацию.