ArpGuard

Теория

Вот что говорит нам о протоколе ARP педивикия:

ARP (англ. Address Resolution Protocol — протокол разрешения адресов) — протокол канального уровня (англ. Data Link layer), предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP.

Более простыми словами можно сказать что ARP отвечает за соответствие пары IP-MAC.  ARP данные образуют кеш (таблицу) примерно такого вида:

(84.234.56.5) at 00:e0:4c:7e:e1:0c on net0
(192.168.0.1) at 00:e0:4c:5a:dd:e6 on lan0
(192.168.0.10) at 00:1c:bf:c6:b1:b7 on lan0

Таблица может быть динамической или статической. В случае динамического ARP-кеша, новые пары добавляются в него автоматически, путем ответа на широковещательный ARP-запрос. В противном случае на широковещательный запрос ответ не генерируется, а записи в таблицу нужно вносить руками. Чем нам может быть полезна статическая таблица?

1) как средство защиты от подмены ip адресов;
2) инструмент для бана хостов по MAC-адресу;
3) защита от вручную сконфигурированных параметров сети;

Разберем по пунктам.

1) Средство защиты от подмены ip адресов.
Вы администратор небольшой локальной сети, трафик на Вашем предприятии не анлимный и стоит денег. Каждый месяц Вы носите отчеты по использованию трафика работниками шефу. Отчеты генерируются по ip адресам сотрудников, ip жестко привязаны к MAC-адресам и прописаны на DHCP сервере. Так бы и жили долго и счастливо, …если бы не младший бухгалтер Вася. Вася, как оказалось в последствии, очень любил французские мелодрамы, но интернетов у него дома небыло, а брать фильмы в прокате — жаба давила.  И тут один далекий знакомый Василия рассказал ему как можно и фильмы смотреть, и деньги экономить. На следующий день, когда все разошлись на обед, Василий полез… Полез в свойства протокола TCP/IP и присвоил себе ip адрес главбуха… Окрыленный своей победой, Василий начал качать гигабайты мелодрам… В конце-концов, шеф списывает с З/П главбуха сумму, эквивалентную потраченным гигабайтам. А потом шум… гам… главбух орет: » Не может быть! Это не я! Я не качала! И вообще не люблю я французские фильмы!!!»… шеф тычит в нее Вашим отчетом о потраченном трафике… одним словом, дурдом. Вопрос решать надо и шеф нанимает для расследования консалтинговую компанию «Нет проблем». В ходе расследования «Нет проблем» находит в кеше браузера Василия следы пребывания на искомых сайтах. А дальше все просто: Вы (из-за своей некомпетенции) и Василий (из-за своего жлобства) делят поровну долги за перерасход трафика и оплачивают работу компании «Нет проблем».
Все было бы иначе, если бы Вы использовали статическую ARP-таблицу. После подмены Василием ip адреса, шлюз не пустил бы его в интернеты из-за несоответствия пары IP-MAC. Тут стоит оговорится что это далеко не панацея от подмены адреса, так как MAC тоже может быть заменен на фальшивый, но не верю я что Василий справился бы с этой задачей.

2) инструмент для бана хостов по MAC-адресу.
Если Вы любитель отстроить и забыть — это может Вам пригодится. Ибо больше не надо перегружать правила фаервола или рестартовать сквид. Можно приспособить под эти нужды статическую ARP-таблицу. Достаточно заменить в ней правильный MAC-адрес на не соответствующий адаптеру и забаненый юзер не пройдет дальше локальной сети.

3) защита от вручную сконфигурированных параметров сети.
Если с первыми двумя примерами все достаточно ясно, то тут могут появится вопросы. Уточнение: тут пойдет речь не о «подмене» ip, а о банальном проникновении в сеть изнутри с целью посканить, поспуфить и выведать сурьезные коммерческие тайны. Что может помешать нам вручную указать IP не использующийся в локальной сети вообще? Верно. Статическая ARP-таблица. Тут у внимательного читателя должен возникнуть вопрос: «Каким образом она может помешать, если IP, который поставит злоумышленник, вообще нет в сети». А кто Вам сказал что его нет? В этом и заключается хитрость — он есть. Фактически в сети может присутствовать сколь угодно мало хостов, вплоть до двух, но наша статическая таблица будет содержать все 255 возможных записей для каждого IP, в каждой подсети. Реальные IP адреса будут иметь свои реальные MAC’и, а остальные IP свои поддельные. В таком случае при попытке указать любой IP вручную, ОС расскажет Вам о том, что этот IP в данный момент занят и использовать его нельзя.

От теории к практике

Для того, чтобы увидеть ARP таблицу, достаточно ввести в терминале:

#arp -an
? (192.168.0.1) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.2) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.3) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]
? (192.168.0.4) at 00:00:00:00:00:00 on lan0 permanent published [ethernet]

Параметр -n говорит ARP’у о том, что не надо резолвить DNS имена хостов. Для того, чтобы очистить таблицу:

#arp -da
192.168.0.1 (192.168.0.1) deleted
192.168.0.2 (192.168.0.2) deleted
192.168.0.3 (192.168.0.3) deleted
192.168.0.4 (192.168.0.4) deleted

Внести запись в таблицу о новой паре, а также забанить по MAC, для примера, написав нулевой. Не забываем, если arp-запись уже существует, сначала ее нужно удалить, и только потом добавлять новую. Ключа для изменения уже существующей, увы, нет:

#arp -d 192.168.0.2
#arp -s 192.168.0.2 00:00:00:00:00:00 pub

Необходимо учитывать что ARP-таблица существует в памяти до первой перезагрузки. Такое положение вещей нас совсем не устраивает, если мы собираемся внедрять защиту от «вручную» выставленных IP. По этому — рисуем скрипт для автоматического обновления ARP-кеша, который и назовем ArpGuard.sh:

#!/bin/sh
#
# Variable
#
config="/usr/local/etc/arpguard.conf"
#
# Functions
#
Usage ()
{
echo "Usage: `basename $0` {command}"
echo ""
echo "Command:"
echo "--------"
echo "start              - clear all arp records and load mac-list"
echo "stop               - clear all arp records"
echo "restart            - Such as start (for compatiblity)"
echo "status             - lists all arp records"
echo "deny {ip}          - deny access for specify ip-addr"
echo "clear {ip}         - clear arp record for specify ip-addr"
echo "info {ip}          - print info for specify ip-addr"
echo "owner {key}        - search for keyword in mac-list's comments"
echo "fill {net} {i} {k} - fill mac-list by null-records from net.i to net.k"
}
#
CheckArg ()
{
        if [ -z "$1" ]; then
            Usage
            exit 1
        fi
}
#
# Start script
#
echo "ArpGuard/fbsd v.2.0"
#
case $1 in
start)
        printf " * Clearing all arp records..."
        arp -da > /dev/null 2>&1
        printf "                                        [ Ok ]\n"
        printf " * Loading mac-list..."
        arp -f ${config} > /dev/null 2>&1
        printf "                                                [ Ok ]\n"
        ;;
stop)
        printf " * Clearing all arp records..."
        arp -da > /dev/null 2>&1
        printf "                                        [ Ok ]\n"
        ;;
restart)
        printf " * Clearing all arp records..."
        arp -da > /dev/null 2>&1
        printf "                                        [ Ok ]\n"
        printf " * Loading mac-list..."
        arp -f ${config} > /dev/null 2>&1
        printf "                                                [ Ok ]\n"
        ;;
status)
        arp -an
        ;;
deny)
        CheckArg "$2"
        printf " * Deny access for ip-address $2..."
        arp -d $2 > /dev/null 2>&1
        arp -s $2 00:00:00:00:00:00 pub > /dev/null 2>&1
        printf "                        [ Ok ]\n"
        ;;
clear)
        CheckArg "$2"
        printf " * Clearing record for ip-address $2..."
        arp -d $2 > /dev/null 2>&1
        printf "                [ Ok ]\n"
        ;;
info)
        CheckArg "$2"
        arp $2
        comment=`cat ${config} | grep -E "^$2[ ]" | awk '{print $5}'`
        echo "Owner: ${comment}"
        ;;
owner)
        CheckArg "$2"
        grep -i $2 ${config}
        ;;
fill)
        CheckArg "$4"
        printf " * Filling mac-list by null-records for $2.$3 - $4..."
        echo "## $2.`expr "$3" "-" "1"` - $2.`expr "$4" "+" "1"`   <UNKNOWN>" >> ${config}
        echo "#" >> ${config}
        i="$3"
        while [ "${i}" -le "$4" ]
        do
            number1=`/usr/bin/jot -r 1 10 99`
            number2=`/usr/bin/jot -r 1 10 99`
            echo "$2.${i}       00:00:${number1}:00:${number2}:00  pub  # <<nobody>>" >> ${config}
            i=`expr "${i}" "+" "1"`
        done
        echo "#" >> ${config}
        printf "        [ Ok ]\n"
        ;;
*)
        Usage
        ;;
esac
#
exit 0

Далее кладем ArpGuard.sh в /usr/local/etc/rc.d и делаем для него конфиг:

#./ArpGuard.sh fill 192.168.0 1 255

Редактируем /usr/local/etc/arpguard.conf Пишем там соответствующие IP адресу MAC’и. После # для удобства пишем хозяина пихи.
Есть задумка включить в скрипт кусок кода, который будет парсить dhcpd.conf, и автоматом расставлять в arpguard.conf если кто-то напишет — присылайте, дополню.
Теперь про параметры запуска:
start — очищает ARP-таблицу и загружает ее из конфига
stop — очищает ARP-таблицу
restart — тоже самое, что и start
status — выводит текущую ARP-таблицу
deny {ip} — запрещает доступ указанному IP
clear {ip} — удаляет указанный IP из таблицы
info {ip} — показывает информацию о указанном IP
owner {comment} — ищет запись в комментариях конфига (владельца)
fill {net} {start} {end} — создает конфу и заполняет ее пихами и рандомными маками
После того как мы отредактировали конфиг, запускаем:

#/usr/local/etc/rc.d/ArpGuard.sh start

Пробуем ставить руками IP, радуемся что не можем и идем пить чай.

P.S. Еще раз хочу оговориться и заострить Ваше внимание на том, что статическая ARP таблица может быть полезна как дополнительное средство для обеспечения безопастности. Изложеный мной подход вполне способен оградить Вас от интересующихся «школьников» и продвинутого «офисного планктона», но он никак не помешает целенаправленной атаке на Вашу сеть. Для полноценной защиты от несанкционированного доступа необходимо использовать целый комплекс средств и действий, но это тема уже совсем другой статьи :)

Опубликовано 03.11.2009 в 19:27 · Автор Berezhinskiy · Ссылка
Рубрики: FreeBSD, Programming · Теги: , , ,

Написать комментарий