Мониторим взлом 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
Мониторим размер лог-файла:
Элемент данных: | Триггер: |
Мониторим число уникальных 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:
Элемент данных: | Триггер: |
Готовый шаблон для zabbix: Template_Iptables_Log.xml
После подключения шаблона к хосту, в настройках хоста нужно указать макросы {$TRESHOLD_IPTABLES_LOG_SIZE}
, {$TRESHOLD_IP_CONTACTED}
, затем активировать триггеры.
Enjoy!