Поиск по сайту:

Как настроить базовую HTTP-аутентификацию в NGINX


Базовая аутентификация по имени пользователя и паролю — это простой и простой способ защитить административные панели и серверные службы. Nginx можно настроить для защиты определенных областей вашего веб-сайта или даже использовать в качестве обратного прокси-сервера для защиты других служб.

Как работает HTTP-аутентификация?

При базовой HTTP-аутентификации определенные маршруты на сервере заблокированы, и для доступа к ним требуется имя пользователя и пароль. Например, так защищены админ-панели большинства домашних роутеров; когда вы пытаетесь получить к ним доступ, браузер открывает диалоговое окно с запросом учетных данных.

Когда пользователь пытается получить доступ к защищенному ресурсу, сервер отправляет пользователю заголовок WWW-Authenticate вместе с ответом 401 Unauthorized. Клиент отправляет обратно соответствующее имя пользователя и пароль, сохраненные в заголовке Авторизация , и, если они совпадают с файлом ключа, им разрешается подключение.

Поскольку базовая HTTP-аутентификация требует отправки паролей по сети, вам необходимо настроить HTTPS/TLS на вашем сервере, иначе кто-то посередине может узнать пароль в виде открытого текста. HTTPS шифрует соединение, делая передачу безопасной. Вы можете установить бесплатный сертификат с помощью LetsEncrypt или, если вы хотите защитить частный сервер, создайте и подпишите его самостоятельно.

Базовая аутентификация по имени пользователя/паролю — это лишь одна из многих схем аутентификации; другой распространенной схемой являются токены носителя, используемые для потоков OAuth 2.0. Вы можете использовать эту схему с Nginx с помощью модуля JSON Web Tokens, но полная настройка намного сложнее, чем аутентификация по имени пользователя и паролю.

Создать файл паролей

Вы можете использовать htpasswd для создания файлов паролей. Скорее всего, он уже установлен в вашей системе, но если это не так, вы можете установить его из пакета apache2-utils . (Nginx использует тот же формат пароля, что и Apache):

sudo apt-get install apache2-utils

Создайте новый файл паролей, запустив htpasswd с флагом -c, в данном случае для пользователя «admin»:

sudo htpasswd -c /etc/nginx/.htpasswd admin

Вам будет предложено ввести пароль, который будет хеширован и сохранен в /etc/nginx/.htpasswd. Если вы хотите добавить нескольких пользователей, не используйте флаг -c, чтобы добавить новые записи.

Включите базовую HTTP-аутентификацию

Вы можете защитить любой маршрут в nginx, используя директиву auth_basic внутри местоположения. Например, чтобы защитить паролем /admin, вы должны поместить этот блок местоположения внутри блока сервера в вашем основном файле конфигурации nginx (обычно расположенном в /etc/nginx/nginx.conf ). ):

location /admin {
  try_files $uri $uri/ =404;
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;
}

Директива auth_basic_user_file должна указывать на файл паролей, который вы создали на первом этапе. Это не должно называться как-то особенно, поэтому вы можете создавать разные файлы паролей для разных маршрутов.

Nginx сделает все остальное за вас. Перезапустите, чтобы применить изменения:

sudo service nginx restart

И проверьте защищенный маршрут в своем браузере. Вас должны попросить ввести пароль и отказать в доступе, если вы не можете его предоставить.

Использование прокси-аутентификации

Распространенным вариантом использования базовой аутентификации является защита внешнего ресурса с помощью обратного прокси-сервера nginx. Это прекрасно работает с auth_basic и так же просто, как использовать их вместе:

location / {
  #//turn on auth for this location
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;

  #//normal proxy configuration
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  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_set_header Accept-Encoding "";

  proxy_pass https://<ip-address>;
  proxy_redirect default;
}

Это работает, запрещая любой доступ к прокси-серверу до аутентификации пользователя. После аутентификации nginx работает как обычно.

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

Вам нужно будет использовать модуль headers-more, чтобы иметь возможность более непосредственно изменять заголовки:

location / {
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  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_set_header Accept-Encoding "";

  proxy_pass https://<ip-address>;
  proxy_redirect default;

  more_set_input_headers 'Authorization: $http_authorization';
  more_set_headers -s 401 'WWW-Authenticate: Basic realm="your_server.com"';
}

Конфигурация прокси такая же, за исключением того, что отсутствует auth_basic, потому что мы не хотим выполнять аутентификацию с помощью nginx. Директива more_set_input_headers творит чудеса здесь и настраивает заголовок для взаимодействия с веб-сервером, чтобы включить переменную $http_authorization, полученную от клиента. Таким образом, имя пользователя и пароль передаются через nginx на серверную часть.

Следующая строка более сложная; обычный способ установки заголовков перезапишет переменную realm при проксировании через nginx, что не идеально. Использование more_set_headers сохранит это и покажет клиенту правильную информацию.