arpwatch

arpwatch — демон, который отслеживает соответствие между IP и MAC-адресами, и при обнаружении аномалий, сообщающий об этом в Syslog. Используется как один из инструментов для борьбы с ARP-spoofing’ом.

Демон анализирует ARP-ответы на сетевом интерфейсе, к которому он привязан, и запоминает соответствие IP-адресов и MAC-адресов. Как только он видит, что соответствие нарушено, или обнаруживает появление новых адресов в сети, он сообщает об этом в системный журнал (syslog).

# yum install arpwatch

Конфигурируем:

$ cat /etc/sysconfig/arpwatch
OPTIONS="-i enp5s0 -f arp.dat -u arpwatch -e admin@example.com -s 'root (Arpwatch)'"
$ sudo systemctl start arpwatch
$ sudo systemctl enable arpwatch
/var/lib/arpwatch - default directory
          arp.dat - ethernet/ip address database
   ethercodes.dat - vendor ethernet block list

По умолчанию, демон пишет логи в /var/log/messages, что бы не мусорить в этот файл перенаправим в отдельный лог. Для этого создаем файл логов и файл конфигурации для rsyslog

# touch /var/log/arpwatch.log

# vi /etc/rsyslog.d/arpwatch.conf
if ( $programname startswith "arpwatch" ) then {
action(type="omfile" file="/var/log/arpwatch.log")
stop
}

Проверяем и перезапускаем:

# rsyslogd -N 1
# systemctl restart rsyslog

Так как в первых трех октетах МАС-адреса кодируется производитель оборудования, нам желательно иметь обновленную локальную базу МАС/Производитель. Обновляем базу MAC адресов:

# vi arpwatch_update_mac.sh

#!/bin/bash
# update_mac_addresses.sh
# This script downloads the currect mac address data from the IEEE and parses it for nmap and arpwatch.
# nmap-mac-prefixes is for nmap.
# ethercodes.dat is arpwatch.

# Download the current data

wget http://standards-oui.ieee.org/oui/oui.txt

# Divide the data into Manufacturer and Address files
cat oui.txt | grep '(base 16)' | cut -f3 > mac.manufacturer
cat oui.txt | grep '(base 16)' | cut -f1 -d' ' > mac.address

# Paste them back together for nmap data
paste mac.address mac.manufacturer > nmap-mac-prefixes

# Parse the address data for arpwatch
cat mac.address | perl -pe 's/^(([^0].)|0(.))(([^0].)|0(.))(([^0].)|0(.))/\2\3:\5\6:\8\9/' > tmp.address
cat tmp.address | tr [A-Z] [a-z] > mac.address

# Paste the parsed data into the arpwatch file
paste mac.address mac.manufacturer > /var/lib/arpwatch/ethercodes.dat

# Clean up intermediary files
rm tmp.address
rm mac.address
rm mac.manufacturer
rm oui.txt

Делаем файл исполняемым и прописываем в cron для ежемесячного обновления:

# chmod +x arpwatch_update_mac.sh
# crontab -e
@monthly                /home/svm/bin/arpwatch_update_mac.sh

ARPWatch рассылает четыре вида сообщений.

  • new activity – связка ethernet/ip-адресов снова проявила активность спустя шесть месяцев или больше
  • new station – ethernet-адрес зафиксирован впервые
  • flip flop – ethernet-адрес изменился с одного известного адреса на другой известный адрес
  • changed ethernet address – хост перешёл на использование нового ethernet-адреса

ARPWatch также пишет события в messages/syslog.

В syslog могут писаться следующие типы уведомлений:

  • ethernet broadcast  – MAC-адрес хоста является широковещательным.
  • ip broadcast – IP-адрес хоста является широковещательным.
  • bogon – адрес отправителя IP-пакета не входит в непосредственно подключённую сеть (directly connected network) для заданного интерфейса.
  • ethernet broadcast – MAC-адрес отправителя состоит из одних нулей или одних единиц.
  • ethernet mismatch – MAC-адрес отправителя пакета не соответствует MAC-адресу, указанному внутри ARP-запроса.
  • reused old ethernet address – ethernet-адрес изменился с известного адреса на адрес, который был замечен ранее, но не только что. (Похоже на flip flop, но чуть-чуть другое.)
  • suppressed DECnet flip flop – сообщение “flip flop” подавлено в связи с тем, что как минимум один из двух адресов является адресом DECnet.

Если в логах появляются сообщения вида

Aug 2 06:52:09 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:10 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:35 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:36 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:37 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71

где 10.90.90.91 – IP  из другой сети, отличной от той, что сконфигурирована на слушающимся интерфейсе (например, для доступа к комуникатору), то можно добавить эту сеть в настройках /etc/sysconfig/arpwatch, что бы не мусорило в логах и перегрузить сервис:

-n 10.90.90.0/24

Источники: