NGINX + HTTP Basic Authentication

Debian 11
Вводные

Авторизация средствами http протокола. Таким способом можно закрыть доступ к определенным разделам на сайте.

Предполагается, что у вас уже установлен NginX с модулем http-auth-request.

Если же нет, то собираем по инструкции ниже.

Также нужно установить утилиту Apache htpasswd для генерации хешированных паролей:

apt update && apt install -y apache2-utils

Далее всё на чистом Debian 11. Все команды от root.

NginX - сборка

Ставлю зависимости и NginX 1.18.0:

apt update && apt install mc vim htop wget curl build-essential autoconf libpcre++-dev automake pkg-config libtool libgeoip-dev libmaxminddb-dev \
libpcre++-dev libssl-dev apache2-dev libxml2-dev libcurl4-gnutls-dev zlib1g-dev libnginx-mod-http-perl libperl-dev php-fpm -y && \
timedatectl set-timezone Europe/Moscow && timedatectl set-ntp on && \
mkdir ~/nginx && cd ~/nginx && wget https://nginx.org/download/nginx-1.18.0.tar.gz && \
tar -zxvf nginx-1.18.0.tar.gz && cd nginx-1.18.0

Для корректной работы NginX на этапе компиляции нужно добавить дополнительные модули.
Скачиваем и распаковываем:

wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz && \
wget https://github.com/openresty/set-misc-nginx-module/archive/refs/tags/v0.33.tar.gz && \
wget https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.2.tar.gz && \
wget https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz && \
tar xvf openssl-1.1.1w.tar.gz && tar xvf v0.33.tar.gz && tar xvf v0.3.2.tar.gz && tar xvf 3.4.tar.gz && \
rm v0.3.2.tar.gz v0.33.tar.gz 3.4.tar.gz openssl-1.1.1w.tar.gz && rm -rf /etc/nginx

Конфигурирование и установка:

./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/bin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--modules-path=/etc/nginx/modules \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-http_realip_module \
--with-http_mp4_module \
--with-http_flv_module \
--with-http_dav_module \
--with-http_secure_link_module \
--with-http_ssl_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_stub_status_module \
--with-http_random_index_module \
--with-http_auth_request_module \
--with-http_slice_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-openssl=/root/nginx/nginx-1.18.0/openssl-1.1.1w \
--with-pcre \
--with-http_perl_module \
--add-module=/root/nginx/nginx-1.18.0/ngx_devel_kit-0.3.2 \
--add-module=/root/nginx/nginx-1.18.0/set-misc-nginx-module-0.33 \
--add-module=/root/nginx/nginx-1.18.0/ngx_http_geoip2_module-3.4
make && make install

Добавляем сервис NginX:

tee /lib/systemd/system/nginx.service<<EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/bin/nginx -t
ExecStart=/usr/bin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

Разрешаем и запускаем:

systemctl unmask nginx.service && systemctl daemon-reload && mkdir -p /var/cache/nginx/{client,proxy,fastcgi,uwsgi,scgi}_temp && mkdir -p /etc/nginx/{conf,keys,proxy-confs} && rm -rf /etc/nginx/*.default && systemctl restart nginx && systemctl enable nginx && systemctl status nginx
htpasswd с примерами

htpasswd - краткая помощь по команде:
-c - создаёт файл passwdfile. Если файл passwdfile уже существует, он перезаписывается и усекается;
-s - использовать шифрование SHA для паролей;
-D - удалить пользователя.

Примеры:

Следующая команда добавляет или изменяет пароль для пользователя user01. Пользователю будет предложено ввести пароль:

htpasswd /etc/nginx/.htpasswd-users user01

Создать новый файл и сохранить в нём запись для пользователя user01. Пользователю будет предложено ввести пароль:

htpasswd -c /etc/nginx/.htpasswd-users user01

Если файл существует и не может быть прочитан или записан, он не изменяется, и htpasswd отобразит сообщение и вернет статус ошибки.

Настройка в NginX

Также нужно будет добавить в блок server следующие строки:

server {
    
    ...
    
    location /admin {
        satisfy  any;
		allow 10.10.100.10;
		deny all;
		auth_basic  "admin site";
		auth_basic_user_file  /etc/nginx/.htpasswd-users;
    }
}

Комментарии:

Если зайти с хоста 10.10.100.10 то запрос пароля выводится не будет и нас пустит.

satisfy – разрешает доступ, если все (all) или хотя бы один (any) из модулей ngx_http_access_module, ngx_http_auth_basic_module, ngx_http_auth_request_module или ngx_http_auth_jwt_module разрешают доступ;
auth_basic – текстовое сообщение при авторизации;
auth_basic_user_file – полный путь к файлу с паролями


Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.