Nginx. Проксирование с настройкой HTTP Basic Authentication.

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

В основе решения лежит nginx проксирующий веб сервер с модулем ngx_http_proxy_module позволяющим передавать запросы другому серверу и модулям ngx_http_auth_basic_module позволяющим ограничить доступ к ресурсам с проверкой имени и пароля пользователя по протоколу “HTTP Basic Authentication”.

Конфигурация прокси выглядит следующи обрзаом.

server {
  listen 80;
  server_name [servername];
  error_log  /var/log/nginx/[servrname]_error.log;
  access_log  /var/log/nginx/[servername]_access.log;
  location / {
 
    auth_basic "hello"; 
    auth_basic_user_file /etc/nginx/passwd_db;
 
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;
    proxy_pass http://[servername]:[port];
  }
}

listen и server_name определяют порт и имя виртуального хоста
error_log и access_log файлы логов
auth_basic — сообщение которое видит пользователь в окне авторизации
auth_basic_user_file — задает файл в котором хранятся имена и пароли пользователей в формате

  # комментарий
  имя1:пароль1
  имя2:пароль2:комментарий
  имя3:пароль3

proxy_set_header Authorization $http_authorization; — добавляем в поле заголовка http авторизацию.
proxy_pass_header Authorization; — разрешаем передавать от проксируемого сервера клиенту поля заголовка Authorization.

Генерируем файл с паролями, более подробно о поддерживаемых типах паролей можно почитать здесь, мы будем использовать хеши на основе md5.

#!/bin/bash
user=$1 
pass=$2
hash=$(md5pass ${pass})
pass_file=/etc/nginx/passwd_db # файл куда будут записываться пароли
echo ${user}:${hash}:${pass} >> $pass_file

скрипт принимает 2 параметра 1-ый пользователь, 2-ой пароль

./gen_passwd user 123

на выходе мы получим файл следующего содержания польлзователь:хеш:пароль

cat /etc/nginx/passwd_db
user:$1$6NWL4ZIr$PgMXMgBa1rom3iLPvSuOE1:123

перечитываем конфигурацию и можно пользоваться

nginx -s reload