Ограничение доступа и повышение безопасности с помощью пароля в NGINX
Введение: В этом руководстве вы узнаете, как повысить безопасность вашего веб-сайта, настроив серверные блоки и директивы 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-баз данных. Чтобы включить эту функцию:
- Установите пакет
libnginx-mod-http-geoip2:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
- Убедитесь, что
/etc/nginx/nginx.confсодержит следующую строку:
include /etc/nginx/modules-enabled/*.conf;
- Загрузите IP-базу данных, совместимую с GeoIP2. Вы можете использовать предоставленную команду или создать учетную запись на сайте MaxMind и загрузить базу данных GeoLite2 Country:
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
- Отредактируйте конфигурацию 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 для вашего сервера.
- Создайте файл для хранения имен пользователей и хешированных паролей:
sudo touch /etc/nginx/users
- Добавьте пользователей с помощью следующей команды (замените
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. Пароль не хранится в открытом виде на сервере.
- Измените конфигурацию вашего серверного блока, чтобы включить 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 на ваш фактический домен.
- Перезагрузите 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]
Поиск
Популярные записи
Получайте эксклюзивные предложения и акции!
Будьте в курсе последних предложений, скидок и специальных акций.