Ограничение доступа и повышение безопасности с помощью пароля в NGINX

16/12/2023 |
Loading...

Введение: В этом руководстве вы узнаете, как повысить безопасность вашего веб-сайта, настроив серверные блоки и директивы location в NGINX. Вы откроете для себя, как блокировать определенные IP-адреса клиентов, ограничивать доступ на основе географического местоположения (гео-ограничение) и реализовать аутентификацию по паролю с использованием HTTP Basic Authentication. Эти меры могут обеспечить дополнительную защиту для вашего веб-сервера, позволяя вам контролировать доступ к определенным веб-страницам.

Предварительные требования:

  • Сервер Ubuntu с правами sudo
  • NGINX, установленный на вашем сервере
  • Базовое понимание NGINX и его конфигурации

Примечание: Для ограничения по паролю рекомендуется включить HTTPS для вашего сервера.

Соглашения о форматировании:

  • В некоторых примерах конфигурации многоточие (...) может использоваться для обозначения опущенных частей.
  • Термин "сервер" относится к вашему серверу Ubuntu с установленным NGINX, а "серверный блок" относится к блоку конфигурации NGINX, который выглядит так:
server { ... }

Места конфигурации: Вы должны знать, где NGINX хранит свои конфигурационные файлы:

  • /etc/nginx — это каталог конфигурации NGINX, где размещены все конфигурационные файлы.
  • /etc/nginx/nginx.conf — это основной конфигурационный файл NGINX, с которого NGINX начинает чтение своей конфигурации.
  • /etc/nginx/sites-enabled — это место, где вы можете разместить файлы конфигурации вашего HTTP(S) сервера. После запуска или перезагрузки NGINX все файлы из этого каталога загружаются NGINX.
  • /etc/nginx/sites-available — это место, где вы можете разместить файлы конфигурации вашего HTTP(S) сервера, но они не будут загружены NGINX, если вы не создадите символическую ссылку в каталоге /etc/nginx/sites-enabled.

Файлы журналов: NGINX генерирует два журнала по умолчанию:

  • /var/log/nginx/access.log: Записывает все запросы.
  • /var/log/nginx/error.log: Записывает ошибки и информацию о состоянии.

Ошибка при перезагрузке: Если вы столкнулись с ошибкой при перезагрузке конфигурации NGINX с помощью sudo systemctl reload nginx, вы можете просмотреть конкретную ошибку, выполнив команду sudo nginx -t.

Шаг 1 — Поиск файла серверного блока

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

ls -al /etc/nginx/sites-available/

Предположим, вы хотите добавить ограничения к серверному блоку, который отвечает на example.com, найдите серверный блок со строкой server_name example.com;. Например:

server { ... server_name example.com; ... }

Убедитесь, что директива listen соответствует порту, который вы собираетесь ограничить (например, listen 80; для HTTP).

Шаг 2 — Использование IP-адресов для разрешения или запрета доступа

NGINX предоставляет директивы allow и deny для управления доступом на основе IP-адресов клиентов. Вы можете заблокировать доступ к определенным IP-адресам, включая ваш собственный для тестирования.

Шаг 2.1 — Поиск вашего публичного IP-адреса Чтобы заблокировать свой собственный IP-адрес, сначала необходимо определить ваш публичный IP-адрес. Выполните следующую команду:

curl -4 https://2ip.io

Вы получите свой публичный IP-адрес в выводе (например, 15.1.1.1). Если команда завершится ошибкой, вы можете найти свой IP-адрес через поиск Google.

Шаг 2.2 — Блокировка доступа Чтобы заблокировать ваш IP-адрес, добавьте следующую строку в соответствующий контекст location в вашем серверном блоке, заменив 15.1.1.1) на ваш публичный IP:

deny 15.1.1.1);

Вот пример фрагмента конфигурации:

server { listen 80; server_name example.com; location / { deny 15.1.1.1) } }

После внесения этого изменения перезагрузите NGINX, чтобы применить конфигурацию:

sudo systemctl reload nginx

Теперь, если вы запустите ту же команду для доступа к вашему сайту с вашего IP:

curl -4 --head http://example.com

Вы должны получить ошибку HTTP 403 Forbidden, что указывает на то, что доступ был запрещен.

Примечание: Вы можете указать несколько директив allow и deny. Будет применена первая совпавшая директива. Например:

allow 15.1.1.1; allow 15.1.1.2; deny all;

В этом примере доступ разрешен для 15.1.1.1 и 15.1.1.2, в то время как все остальные IP-адреса запрещены.

Шаг 3 — Использование модуля Geo для разрешения или запрета доступа

Модуль geo NGINX предлагает гибкий способ управления доступом на основе географического местоположения с использованием IP-баз данных. Чтобы включить эту функцию:

  1. Установите пакет libnginx-mod-http-geoip2:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
  1. Убедитесь, что /etc/nginx/nginx.conf содержит следующую строку:
include /etc/nginx/modules-enabled/*.conf;
  1. Загрузите IP-базу данных, совместимую с GeoIP2. Вы можете использовать предоставленную команду или создать учетную запись на сайте MaxMind и загрузить базу данных GeoLite2 Country:
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
  1. Отредактируйте конфигурацию NGINX, чтобы включить директивы GeoIP2:
geoip2 /etc/nginx/GeoLite2-Country.mmdb { $user_country country iso_code; } map $user_country $not_allowed { CA 1; # Канада US 1; # Соединенные Штаты default 0; # Разрешить все остальные страны } server { listen 80; server_name example.com; location / { if ($not_allowed) { return 403 "You're not allowed to access."; } } }

В этом примере доступ запрещен для пользователей из Канады (CA) и Соединенных Штатов (US), в то время как все остальные страны разрешены.

Перезагрузите NGINX, чтобы применить изменения:

sudo systemctl reload nginx

Шаг 4 — Аутентификация по паролю (HTTP Basic Authentication)

Чтобы ограничить доступ на основе имени пользователя и пароля, вы можете использовать HTTP Basic Authentication. Убедитесь, что у вас включен HTTPS для вашего сервера.

  1. Создайте файл для хранения имен пользователей и хешированных паролей:
sudo touch /etc/nginx/users
  1. Добавьте пользователей с помощью следующей команды (замените user и password на желаемые имя пользователя и пароль):
python3 -c 'from subprocess import *; import sys; print("Username: ", end="", file=sys.stderr); user = input(); passwd = run(["openssl", "passwd", "-6"], encoding="utf-8", stdout=PIPE).stdout.strip(); print("Username or password is empty. Try again!", file=sys.stderr) if user == "" or passwd == "" else print(user + ":" + passwd)' | sudo tee -a /etc/nginx/users

Эта команда добавляет пользователя в файл /etc/nginx/users и выводит имя пользователя и хешированный пароль в виде пар user:password. Пароль не хранится в открытом виде на сервере.

  1. Измените конфигурацию вашего серверного блока, чтобы включить HTTP Basic Authentication:
server { server_name example.com; location / { } auth_basic "Protected area!"; auth_basic_user_file /etc/nginx/users; listen 443 ssl; # Managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # Managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Managed by Certbot }

Не забудьте заменить example.com на ваш фактический домен.

  1. Перезагрузите NGINX, чтобы применить конфигурацию:
sudo systemctl reload nginx

Вы можете протестировать новую конфигурацию с помощью curl. Доступ к сайту без имени пользователя и пароля должен привести к ошибке HTTP 401 Unauthorized, в то время как предоставление действительных учетных данных должно предоставить доступ.

Ограничение доступа к одному URL

Чтобы ограничить доступ к определенному URL, добавьте директивы auth_basic и auth_basic_user_file непосредственно в контекст location внутри вашего серверного блока. Например:

server { server_name example.com; location / { } location /admin { auth_basic "Protected area!"; auth_basic_user_file /etc/nginx/users; } listen 443 ssl; # Managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # Managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Managed by Certbot }

В этом примере URL /admin защищен HTTP Basic Authentication.

Логирование неверных данных доступа

NGINX записывает неудачные попытки доступа в файл /var/log/nginx/error.log. Это включает неверные пароли и несуществующие имена пользователей, обеспечивая дополнительную видимость попыток несанкционированного доступа.

Примеры записей в журнале:

  • Неверный пароль:
2023/03/28 12:06:49 [error]

Получайте эксклюзивные предложения и акции!

Будьте в курсе последних предложений, скидок и специальных акций.

Update cookies preferences