воскресенье, 29 июня 2014 г.

Защита nginx от Китая и Индии с помощью GeoIP, apache или nginx

Как правило, большое количество брутфорсеров находятся в Китае и Индии. Так как мои сайты не расчитаны на эту аудиторию, то ip'шники из Китая и Индии можно спокойно блокировать. В этом нам поможет модуль GeoIP для apache или nginx.

nginx:
Для использования этого модуля необходимо чтобы nginx был скомпилирован с поддержкой модуля http_geoip_module.
Проверить это можно так:
# nginx -V
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-echo --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/tmp/buildd/nginx-1.2.1/debian/modules/nginx-dav-ext-module

Если же этого нет, то nginx нужно перекомпилировать с поддержкой данного модуля.


Установим базы GeoIP:
# apt-get install geoip-database libgeoip1
Либо их скачать и установить из сорцов отсюда: http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz

Добавляем в конфиг nginx в раздел http информацию о GeoIP:
# vim /etc/nginx/nginx.conf
# GeoIP
http {
   ...
   geoip_country /usr/share/GeoIP/GeoIP.dat;
   map $geoip_country_code $allowed_country {
      default yes;
      CN no;
      IN no;
      DE no;
   }
}

Для примера я добавил в блок помимо Китая (CN) и Индии (IN) ещё и Германию (DE), так как у меня есть доступ к немецкому прокси и именно через него я буду проверять работоспособность модуля, позже я его убрал, когда убедился в полной работоспособности.

Теперь нужно в каждой секции виртуального сервера дописать:
# vim /etc/nginx/nginx.conf
server {
...
   if ($allowed_country = no) {
      return 444;
   }
}

В моём случае всё оказалось проще, к каждому моему виртуальному хосту инклудится файл /usr/local/ispmgr/etc/nginx.inc, поэтому, чтобы не дописывать кучу строк в конфиг, достаточно один раз дописать наши строки в файл и он будет распространяться на все виртуальные хосты.

Таким образом:
# vim /usr/local/ispmgr/etc/nginx.inc
...
if ($allowed_country = no) {
   return 444;
}

# service nginx restart

Список других кодов: http://dev.maxmind.com/geoip/legacy/codes/iso3166/

Проверяю с помощью расширения ZenMate для Chrome. В параметрах выбрал сервер из Франкфурта (Германия) и пробую заходить на один из моих сайтов (естественно такого сайта нет, сугубо для примера):

Теперь можно убрать Германию из блока.

Если нет возможности использовать nginx, то вот инструкция для apache.
apache:
Для apache все еще проще.
Установка модуля:
# apt-get install libapache2-mod-geoip

Приводим конфиг примерно к такому виду (я блокирую Китай, Индию, Пакистан):
# vim /etc/apache2/mods-enabled/geoip.conf
<IfModule mod_geoip.c>
  GeoIPEnable On
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
  SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
  SetEnvIf GEOIP_COUNTRY_CODE IN BlockCountry
  SetEnvIf GEOIP_COUNTRY_CODE PK BlockCountry
</IfModule>
<Directory /var/www/user/data/www/site.ru>
  Deny from env=BlockCountry
</Directory>

Добавляем скрипт, для обновления баз раз в месяц:
# vim /etc/cron.monthly/update-geoip
#!/bin/sh
cd /usr/share/GeoIP
mv GeoIP.dat GeoIP.dat_org
wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gzip -d -f GeoIP.dat.gz

Перезагрузим apache для применения настроек:
# service apache2 restart

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