Wednesday, February 19, 2014

Как защитить себя и свой сайт от недругов (например)

Кто приходит в гости к нам...

Есть такие нехорошие люди, которые "чесом" пытаются открывать на всех подряд хостах (включая ваш) все подряд порты (включая те, на которых работают ваши сервисы) и что-нибудь с ними делать. Ну, например - молчать и ждать, что им из этого порта прилетит, в надежде что нибудь потом, по ситуации, что-нибудь совсем нехорошее сделать получится дальше. Есть ведь такие, которые взламывают плохо защищенные веб-сайты (на PHP, например) и расстраивают хозяев этих сайтов.

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

109.68.190.145 vps.node71.doip.net
173.244.206.13 173.244.206.13.static.midphase.com
173.244.206.19 173.244.206.19.static.midphase.com

И как с ними бороться...

Если обнаружили такой адрес, то можно его заблокировать вручную через iptables, например:

iptables -A INPUT -s 109.68.190.145 -j DROP

Но, хотелось бы, чтобы это делалось как-то более автоматически, например по данным мониторинга серверных логов. Не будучи глубоким профессионалом в области компьютерной безопасности, я на скорую руку написал скрипт, который бьет по рукам (то есть по IP адресам) таких нехороших программ и людей, если они пытаются подобрать незащищенные урл-ы к сайтам.

Скрипт должен запускаться периодически (по crontab например), чем чаще - тем надежнее, но с учетом здравого смысла. При запуске из лога apache выбираются все обращения по несуществующим url и адреса, с которых эти запросы приходили, автоматически блокируются.

Обратить внимание, что если самим ввести неправильный url - значит заблокировать собственно себя. Улучшения и критика приветствуются.

#!/bin/sh

#Dump current config
cat /etc/sysconfig/iptables | grep A\ INPUT > /var/tmp/iptables.txt

#Append new data (with possible overlaps)
grep File\ does\ not\ exist: /var/log/httpd/error_log | grep /admin | awk '{print $8}' | awk '{gsub("]","",$0); print $0}' | sort | awk '!x[$0]++' | awk '{print "-A INPUT -s " $0 " -j DROP"}' >> /var/tmp/iptables.txt

#Eliminate duplicate entries
cat /var/tmp/iptables.txt | sort | awk '!x[$0]++' | awk '{print "iptables " $0 }' > /var/tmp/iptables.sh

#Re-configure iptables
iptables --flush
cat /var/tmp/iptables.sh
sh /var/tmp/iptables.sh

#Save data
service iptables save

Ну а индустриальное решение, которое подсказали - http://www.fail2ban.org/ - надо пробовать...