Go to content Go to menu Go to search

Мониторим взлом web сервера по исходящим соединениям

Теория

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

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

Практика

Настройка на примере СentOs.

Добавить в /etc/sysconfig/iptables (до всех разрешающих и запрещающих правил):

# Писать в лог информацию о всех исходящих кроме портов 80 и 25
-A OUTPUT -m state --state NEW -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "Iptables: Outgoing http: "
-A OUTPUT -m state --state NEW -p tcp --dport 25 -j LOG --log-prefix "Iptables: Outgoing smtp: "
# Писать в лог информацию о всех исходящих кроме портов 80, 443 и 25
-A OUTPUT -m state --state NEW -p tcp ! --sport 80 -m multiport ! --dports 80,443,25 -j LOG --log-prefix "Iptables: Outgoing other: "

После чего в /var/log/messages будут появляться примерно такие строки:

Jun  7 18:19:59 wf2 kernel: Iptables: Outgoing http: IN= OUT=eth0 SRC=172.16.10.42 DST=185.99.8.5 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=20891 DF PROTO=TCP SPT=41591 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 
Jun  7 18:20:01 wf2 kernel: Iptables: Outgoing other: IN= OUT=eth0 SRC=172.16.10.42 DST=192.168.1.96 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=2775 DF PROTO=TCP SPT=56294 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0

Вынесем это в отдельный лог файл:

echo ':msg, contains, "Iptables: " -/var/log/iptables.log' > /etc/rsyslog.d/iptables.conf
echo '& ~' >> /etc/rsyslog.d/iptables.conf

service rsyslog restart

Настроим logrotate (файл /etc/logrotate.d/iptables)

/var/log/iptables.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    sharedscripts
    sharedscripts
    prerotate
        /bin/date >> /var/log/iptables.stats
        cat /var/log/iptables.log |  awk '{print $12}' | sort | /usr/bin/uniq -c | awk -F= '{printf $1 " == "; system("host " $2 "| grep -v not | awk '\''{printf $5}'\''" ); print " <> "$2" ";}' | sort -nr >> /var/log/iptables.stats
    endscript
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

/var/log/iptables.stats {
    monthly
    rotate 2
    missingok
    notifempty
    nocompress
}

(В файле /var/log/iptables.stats будет храниться ежедневная статистика по IP адресам, на которые ходил сервер)

Настраиваем Zabbix

Мониторим размер лог-файла:

Элемент данных: Триггер:
enlarge enlarge

Мониторим число уникальных IP:

Создадим в клиенте элемент данных:

echo "UserParameter=iptableslog.unique_ips,cat /var/log/iptables.log | grep Outgoing |  awk '{print \$12}' | sort | /usr/bin/uniq -c | awk '{if ( \$1 > 10) print; }' | wc -l" >  /etc/zabbix/zabbix_agentd.d/iptableslog.conf
service zabbix-agent restart

Настроим элемент данных в zabbix:

Элемент данных: Триггер:
enlarge enlarge

Готовый шаблон для zabbix: Template_Iptables_Log.xml

После подключения шаблона к хосту, в настройках хоста нужно указать макросы {$TRESHOLD_IPTABLES_LOG_SIZE}, {$TRESHOLD_IP_CONTACTED}, затем активировать триггеры.

Enjoy!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved