Как настроить базовую 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
сохранит это и покажет клиенту правильную информацию.