Проект: Защищаем вебсайт паролем в nginx

Перевод: Password Protect a Website with nginx
Логотип веб-сервера nginx

Нужно было оставить один из старых сайтов в онлайне, но ограничить к нему доступ, чтобы уменьшить вероятность взлома (старая CMS, и т.д.) – так что я решил закрыть сайт паролем.

Что это за nginx?

nginx (произносится Энжин-Икс) это веб-сервер, обратный прокси и мощный кэш для поддержки и раздачи трафика, он использщуется в одних из самых крупных сайтов сегодняшнего Интернета. nginx – очень легковесный сервер, может раздавать внушительные объёмы данных при массивной параллельности запросов и минимальных требованиях к севреру, где nginx запущен.

Компания nginx была приобретена компанией F5 в 2019 году.

Я буду очень много рассказывать про nginx в 2020м году – уже давно им пользуюсь в своих серверах и решениях, так что буду использовать каждую возможность задокументировать мои настройки и поделиться опытом.

Защита сайтов паролем в nginx

Есть несколько простых шагов для защиты сайта паролем в nginx (очень похожие шаги, но с чуть иным синтаксисом, используются в другом веб-сервере – Apache):

  1. Решить, будем мы создавать или обновлять файл с паролями. И как он будет называться.

  2. Решить, какие имя и пароль мы будем использовать для защиты

  3. Сгенерировать шивроанный хэш на основе пароля, добавать его в файл с паролями

  4. Обновить конфигурацию вебсервера, чтобы активировать защиту

Сайты – это всего лишь папки с файлами на каких-то серверах. Поэтому при включении защиты паролем, можно с одинаковой лёгкостью закрыть весь сайт – например, www.unixtutorial.org или только под-раздел типа www.unixtutorial.org/images.

ИНТЕРЕСНО: хотя и говорят обычно “закрыть сайт паролем”, на самом деле защита требует двух элементов: имени пользователя и правильного к нему пароля. Так что при успешной защите сайта мы видим диалоговое окно вроде такого, спрашивающего имя пользователя и пароль:

Запрос имени пользователя и пароля для доступа к сайту

Файл с паролями и настройка логина

Большинство доступа контролируется файлами паролей, обычно они называются htpasswd. Можно создать общий файл /etc/nginx/htpasswd или конкретный файл для каждого из сайтов, типа /etc/nginx/unixtutorial.htpasswd.

Файл с паролями – обычный текстовый. Можно создать даже так:

# touch /etc/nginx/unixtutorial.htpasswd

Но ещё лучше – воспользоваться командой htpasswd. Она входит в состав Apache tools, так что может понадобиться установить соответствующий пакет:

$ sudo yum install httpd-tools

Когда мы запускаем команду htpasswd, нужно указывать два параметра: имя файла с паролями и имя пользователя, для коготорого мы хотим создать пароль.

Если указан несуществующий файл, мы получим ошибку и подсказку:

$ sudo htpasswd /etc/nginx/htpasswd unixtutorial 
htpasswd: cannot modify file /etc/nginx/htpasswd; use '-c' to create it.

И да, используя опцию -c (от английского create – создавать), мы можем создать файл и добавить в него пароль для пользователя unixtutorial:

$ sudo htpasswd -c /etc/nginx/htpasswd unixtutorial
New password:
Re-type new password:
Adding password for user unixtutorial

Если посмотреть теперь в файл /etc/nginx/passwd, там окажется наш пользователь unixtutorial и хэш его пароля:

$ cat /etc/nginx/htpasswd
unixtutorial:$apr1$bExTryjo/$uxRop/uv5UwXvWl4EM5gv0

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

Активация защиты вебсайта паролем

Мой сайт настраивается вот таким фрагментом конфигурации nginx:

server {
     listen      *:80;
     server_name forum.reys.net;
     keepalive_timeout    60;

     access_log /var/log/nginx/forum.reys.net/access.log multi_vhost;
     error_log /var/log/nginx/forum.reys.net/error.log;

location / {
     include "/etc/nginx/includes/gzip.conf";
     proxy_pass  http://172.31.31.47:80;

     include "/etc/nginx/includes/proxy.conf";
     include "/etc/nginx/includes/headers.conf";
     }
}

Защита паролем делается на уровне подраздела (location). В моём случае location / означает, что весь сайт (а не подраздел) будет защищён паролем.

Так что прямо перед элементом proxy_pass я добавляю защиту паролем:

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;

Как видно, мы указали имя файла с паролями, который только что создали. Есть ещё параметр для auth_basic, можно заменить слово Restricted на любое другое текстовое сообщение – его будет видно в диалоге запроса имени-пароля при доступе к сайту.

Вот как будет выглядеть это дело:

location / {
     include "/etc/nginx/includes/gzip.conf";
     proxy_pass  http://172.31.31.47:80;

     auth_basic "Restricted";
     auth_basic_user_file /etc/nginx/htpasswd;

     include "/etc/nginx/includes/proxy.conf";
     include "/etc/nginx/includes/headers.conf";
     }

Сохраняем файл и перезапускаем nginx:

$ sudo service restart nginx

Порядок! Теперь сайт https://forum.reys.net защищён паролем!

Ссылки




Давайте учиться вместе!

Заходите на страницу Facebook или присоединяйтесь к чату в Telegram:
Я использую браузер Brave
Попробуйте сами: Brave Browser
IT Консалтинг
У меня есть консалтинговая компания: Tech Stack Solutions. Я помогаю планировать и создавать облачные решения на базе AWS и помогаю с развёртыванием и поддержкой сервисов на Unix/Linux. Свяжитесь со мной тут.

Recent Tweets