Блокировка доступа к NGINX
Способы ограничения доступа к ресурсу в NGINX
Блокировка по User Agent`у
Я использую эту технику, прежде всего, для защиты от роботов, которые игнорируют настройки в моем файле robots.txt
.
1 | if ($http_user_agent ~ "Windows 95|Windows 98|xpymep|TurnitinBot|sindice|Purebot|libwww-perl") { |
Я выбрал для блокирования libwww-Perl
, потому что в последние несколько лет, я не видел ни GET или POST по libwww-Perl
, вероятно пробовали использовать какую-то уязвимость ПО.
Блокировка по IP-адресу
1 | deny 85.17.26.68; # spam |
Блокировка по запросу
Кроме того, можно заблокировать доступ на основе информации которая отправляется в заголовках HTTP.
1 | if ($http_referer ~* (viagra|sex|porn|) ) { |
Я использую ключ ~*
для того чтобы предотвратить запрос GET по указанным словам во всей строке.
Блокировка по подсети
1 | deny 69.28.58.0/24; # spam |
Блокировка по геолокации
Мы можем заблокировать целые страны, основанные на данных GeoIP предоставляемых MaxMind.
Необходимо, чтобы NGINX имел модуль GeoIP
.
Во-первых, вы должны обозначить NGINX где база данных GeoIP находится в файловой системе.
Вы можете сделать это внутри HTTP {}
;
Конфигурация блока:
geoip_country /etc/nginx/GeoIP.dat;
Теперь сообщаем NGINX страны которые необходимо заблокировать:
1 | if ($geoip_country_code ~ (BR|CN|KR|RU) ) { |
Блокировка по паролю
В конфигурационном файле, в папке, которую хотим закрыть надо только указать файл, где хранятся пароли. Вот два примера для закрытия папки с файлами:
1 | location ^~ /files/ { |
либо админки с ограничением по IP-адресу:
1 | location ^~ /admin/ { |
Добавить пользователя можно с помощью стандартной утилиты от apache:
1 | htpasswd -b passwords NewUser NewPassword |
В файле запись с зашифрованным паролем имеет вид NewUser:P47ghZ4kloG78: #Your Can Comment Here
Защиту от перебора паролей можно организовать одновременно двумя методами, основанными на использовании iptables:
- Блокирование IP на время, если количество запросов в секунду превышает какое-либо разумное количество
- Вести лог неудачных попыток подбора пароля и скриптом раз в минуту проверять лог и заносить IP адреса в iptables
Для первого варианта достаточно создать правила:
1 | iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW |
Можно вместо DROP использовать TARPIT, чтобы усложнить жизнь ломателям.
Для второго варианта надо добавить в конфиг:
1 | location /401.html { |
Формат error401
, у меня например такой:
1 | log_format error401 '$remote_addr - $remote_user [$time_local] ' |