Я думаю, что у каждого возникала данная проблема, когда ваш сервер смотрит в мир и на нем открыт ssh, естественно его пытаются постоянно брутофорсить, то есть подобрать пароль и логин. И в прицепе ничего страшного в этом нет, но все же неприятно, нагружает сервер и мало ли, вдруг все же подберут. Вот и меня когда-то возникла данная проблема. Порыскав в инете, я наше достаточно хороший навесок на PAM — pam_abl, который по заверению авторов должен был избавить меня от данной проблемы. Данная программа при определенном количестве попыток вносит ip адресс нарушителя себе в базу, и в следующий раз когда он пытается войти в систему блокирует его. Установив и потестив ее, выяснилось, что в базу она ip вносит, но вот блокировать не хочет, может проблема была в CentOS может в програмке, но оно так и не заработало по полной. И тогда немного подумав, я решил дописать пару скриптов, так как база с ip нарушителей у нас есть, то можно ведь этих нарушителей внести в iptables.
Если вам ненужен открытый ssh порт на внешнем порту, вы его можете просто отключить, для этого надо зайти в /etc/ssh/sshd_config и отредактировать параметр ListenAddress
И так начнем:
В файле /etc/security/pam_abl.conf
# Количество дней на которые блокируется Хост
host_purge=5d
# Количество попыток за /1h или /1d после чего наступает блокировка данного хоста
host_rule=*:5/1h,10/1d
Для активации необходимо добавить в начале файла /etc/pam.d/sshd
auth required /lib/security/pam_abl.so config=/etc/security/pam_abl.conf
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so
Перезапускаем sshd
Для просмотра заблокированных хостов используется команда –
Протестируем pam_abl, введя 5 раз неверный пароль–
No user_db in /etc/security/pam_abl.conf
Failed hosts:
192.168.0.200 (1)
0/00:45:51
после чего хост занесен в базу pam_abl
Вот скрипт который будут смотреть в данную базу и делать соответствующие записи в iptables.
#!/bin/bash #Задаем переменные # define variables chain_name="crackers" //Имя цепочки в iptables iptables=/sbin/iptables is="/sbin/iptables-save" abl_hostdb=/var/lib/abl/hosts.db //Пусть к базе pam_abl #Проверка доступа к iptables # check access to iptables if [ ! -x $iptables ]; then echo "cannot execute iptables!" echo "please correct iptables-variable in $0" exit fi #Проверка наличия базы pam_abl # check access to read-db-script if [ ! -x $read_dbscript ]; then echo "cannot execute read-db-script!" echo "please correct read_dbscript-variable in $0" exit fi #Проверка существования цепочки(в нашем случаи crackers) # check if defined chain exist in current iptable-rules if [ -z "`$iptables -n -L | grep -i "chain $chain_name"`" ]; then echo "chain $chain_name is not defined in your iptable rules!" echo "cannot add a rule into a non-existing chain. please update your iptables-config." exit fi #Обнуление цепочки(если этого не делать, то у нас при каждом запуске скрипта будут возникать повторяющиеся правила) #flush iptables $iptables -t filter -F $chain_name #добавление правил в цепочку crackers из базы pam_abl # reload chain with actual crackers for i in `/usr/sbin/pam_abl | grep -v hosts: | grep -v ocking | awk '{print $1}'`; do $iptables -t filter -A $chain_name -s $i -j DROP done #Сохраняем iptables, что бы при перезагрузке не потерять созданных правил # Saving iptables $is > /etc/sysconfig/iptables
Добавляем самой первой в iptables в таблицу *filter
-A INPUT –i внешний порт(как пример это может быть eth0) –j crackers
Теперь добавляем ранее созданный скрипт на автозапуск в crontab
Редактируем фаил /etc/crontab и добавляем там
Запуск будет производиться каждые пять минут.
Второй скрипт присылает каждый день репорт с правилами добавленными в iptables за сутки, а также делает бекап iptables каждые сутки в папку ipdir в формате iptables-daily-$DATE
Вот текс скрипта:
#!/bin/bash DATE=`date +'%m-%d-%Y'` export DATE; mail_to=ваш почтовый адресс export mail_to; host_name=`hostname` export host_name is="/sbin/iptables-save" tmp="/tmp/" ipdir="/usr/local/block/iptables" ipdaily="$ipdir/iptables-daily-$DATE" #Difference in configuration # $is > $ipdaily if [ -a $tmp/iptables-yestarday ] then comm -3 $tmp/iptables-yestarday $ipdaily > $tmp/iptables.dif # diff -U 4 $ipdaily $tmp/iptables-yestarday > $tmp/iptables.dif $is > "$tmp/iptables-yestarday" else echo "Script runned first time $DATA" > $tmp/iptables.dif $is > "$tmp/iptables-yestarday" fi #Mail notification about changes if [ ! -s $TMPDIR/iptables.dif ] then ( cat $tmp/iptables.dif | mail -s "$DATE List of iptables chains with Bloked IP on $host_name last day" $mail_to ) else ( (cat $tmp/iptables.dif & echo "No new iptables chains") | mail -s "$DATE List of iptables chains with Bloked IP on $host_name last day" $mail_to )
Добавляем данный скрипт в /etc/crontab
Выполняется каждый день в 4:32 утра
Вот и все, проблем с брутофорсерами стало на много меньше 🙂