Назад | Перейти на главную страницу

Защита веб-сайта Django, работающего с Apache mod_wsgi

Я создал веб-сайт в Django 1.6 с базой данных PostgreSQL, которая размещена на Ubuntu 12.04.3 с Apache 2.2.22, и недавно я заметил множество попыток взлома (зондирования) с разных IP-адресов постоянно каждый день, которые заполняют мой почтовый ящик отчетами, которые начинаются быть просто раздражающим.

Некоторые выдержки из запросов к серверу (пути и IP-адреса замаскированы):

 'PATH_INFO': u'/myadmin/scripts/setup.php',
 'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/myadmin/scripts/setup.php',
 'QUERY_STRING': '',
 'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
 'REMOTE_PORT': '62637',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/myadmin/scripts/setup.php',



 'PATH_INFO': u'/phpTest/zologize/axa.php',
 'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/phpTest/zologize/axa.php',
 'QUERY_STRING': '',
 'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
 'REMOTE_PORT': '60853',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/phpTest/zologize/axa.php',



 'PATH_INFO': u'/pma/scripts/setup.php',
 'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/pma/scripts/setup.php',
 'QUERY_STRING': '',
 'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
 'REMOTE_PORT': '64751',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/pma/scripts/setup.php',


 'CSRF_COOKIE': u'bmbTHkbfWOeldHyAWBwj6rLb2yEopMnZ',
 'PATH_TRANSLATED': '/path/to/my/project/project.wsgi/HNAP1/',
 'QUERY_STRING': '',
 'REMOTE_ADDR': 'XXX.XXX.XXX.XXX',
 'REMOTE_PORT': '57303',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': '/HNAP1/',

В некотором роде меня не интересуют эти попытки, поскольку они в основном проверяют уязвимости php (насколько я заметил), но я бы хотел что-то сделать с этим, а не только fail2ban для этих IP-адресов.

Поскольку это первый раз, когда я борюсь с этим, я хотел бы быть уверен, что мой веб-сервер действительно достаточно защищен, и мне интересно, что я могу сделать, чтобы убедиться, что эти боты не причинят никакого вреда моему веб-сайту и база данных. Сама информация в db не так уж и важна, и даже если кто-то получит ее копию, никто не пострадает, но все же ... :)

Итак, мои вопросы:

1) Действительно ли мой веб-сайт и база данных «безопасны», поскольку я не обслуживаю на них какие-либо сайты PHP?
2) Могу ли я что-нибудь сделать с Python / Django, чтобы собрать больше информации об этой попытке, кроме запрашиваемых IP / PORT и PATH (например, чтобы получить источник фактического скрипта, который «человек» пытался запустить)?
3) Есть ли список очень хорошо известных IP-адресов, которые используются для сканирования таких уязвимостей, чтобы я мог автоматически обновлять свой список заблокированных IP-адресов?
4) Есть ли какой-нибудь сервис, где я могу сообщить собранные IP-адреса?
5) Каковы в целом лучшие практики для защиты вашего веб-сайта / сервера не только от этих сценариев, но и от любых других распространенных попыток проникновения (я знаю, что может быть множество различных попыток, но мне любопытно узнать о моей конкретной конфигурации сервера только - Django / PostgreSQL / Apache / Ubuntu)?

Большое спасибо за любую помощь и советы по этому поводу!

Например, вы можете использовать mod_security, чтобы ограничить объем пробных запросов с одного IP-адреса.

Что-то вроде этого:

LoadModule security2_module modules/mod_security2.so

<IfModule !mod_unique_id.c>
        LoadModule unique_id_module modules/mod_unique_id.so
</IfModule>

SecRuleEngine On
SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecTmpDir /var/lib/mod_security
SecDataDir /var/lib/mod_security

SecRule REQUEST_URI "\.php$" id:1,phase:request,initcol:IP=%{REMOTE_ADDR},pass,nolog
SecRule IP:COUNTER "@gt 5" d:2,phase:request,t:none,setvar:IP.COUNTER=+1,expirevar:IP.COUNTER=900,deny,status:503,nolog
SecRule REQUEST_URI "\.php$" id:3,phase:request,t:none,setvar:IP.COUNTER=+1,expirevar:IP.COUNTER=900,nolog

Это вернет 503 Service Unavailable на любой IP-адрес, который пытался получить доступ к URI с .php более 5 раз с перерывом между попытками менее 15 минут.

Не делайте этого, если на вашем сервере что-то работает на PHP.