Мониторинг подозрительной DNS активности в локальной сети
Материал из RSU WiKi
Версия от 18:10, 10 января 2010; Admin (Обсуждение | вклад)
Когда служба OpenDNS сообщает о вирусной активности для серой сети, в которой пользователи выходят в интернет с одного внешнего IP-адреса, возникает проблема определения какие именно машины заражены.
Служба OpenDNS предоставляет информацию о запрошенных доменах, относящихся к категории "Malware". По анализу лога запросов DNS-сервервера сети на наличие доменов из списка OpenDNS можно выявить зараженные ПК. Так же процесс нужно автоматизировать скриптами.
- Мы включили логирование DNS-сервера (в нашей конфигурации в отдельный лог не вынослили, поэтому нас интересует файл /var/log/messages). На основании собранных за сутки DNS-запросов можно выносить вердикт о зараженности той или иной машины.
- По ссылке нашли скрипт сотрудника OpenDNS, который забирает список доменов с их сайта и модифицировали его под свои нужды (сбор только malware-доменов)
od_fetchmalware.sh
#!/bin/sh
#
# OpenDNS Stats Fetcher
# Richard Crowley <richard@opendns.com>
#
# Modified by RSU network team
#
URL="https://opendns.com/dashboard"
HEADING="Rank,Domain,Total,Blacklisted,Blocked by Category,Blocked as Phishing,Blocked as Malware"
usage() {
echo "Usage: $0 <username> <passwd> <network_id> <YYYY-MM-DD> [<YYYY-MM-DD>]" >&2
exit 1
}
date_check() {
case "$1" in
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
;;
*)
echo "Error: dates must be in the YYYY-MM-DD form" >&2
exit 2
;;
esac
}
USERNAME="$1"
if [ -z "$USERNAME" ] ; then usage ; fi
PASSWORD="$2"
if [ -z "$PASSWORD" ] ; then usage ; fi
NETWORK_ID="$3"
if [ -z "$NETWORK_ID" ] ; then usage ; fi
date_check "$4"
if [ -z "$5" ] ; then
DATE="$4"
else
date_check "$5"
DATE="$4to$5"
fi
COOKIEJAR=$(mktemp /tmp/opendns-fetchstats-XXXXXX)
# Get the signin page's form token
FORMTOKEN=$(curl --silent --insecure \
--cookie-jar "$COOKIEJAR" \
"$URL/signin" \
| grep formtoken \
| sed 's/^.*name="formtoken" value="\([0-9a-f]*\)".*$/\1/' \
)
# Sign into OpenDNS
curl --silent --insecure \
--cookie "$COOKIEJAR" \
--cookie-jar "$COOKIEJAR" \
--data "formtoken=$FORMTOKEN&username=$USERNAME&password=$PASSWORD&sign_in_submit=foo" \
"$URL/signin" \
> /dev/null
# Fetch pages of Top Domains
PAGE=1
CSV=$(curl --silent --insecure \
--cookie "$COOKIEJAR" \
"$URL/stats/$NETWORK_ID/topdomains/$DATE/malware/page$PAGE.csv" \
| grep -v "$HEADING"
)
echo "$CSV" ;
rm -f "$COOKIEJAR"
- Написали свой скрипт, который с помощью первого качает список доменов, затем ищет ip-адреса ПК в логе named, позволяет установить разное количество дней для бана зараженных ПК и составляет ACL для squid и текстовый файл для общего доступа. В скрипте нужно прописать логин и пароль от OpenDNS-аккаунта. Так как у нас squid расположен на отдельной виртуальной машине, то для передачи ему acl и сообщения о необходимости перезагрузки используем scp. Для scp рекомендуется открывать безпарольный ssh-доступ на удаленный сервер, т. к. пароль от него в противном случае будет храниться в открытом виде в скрипте.
#!/bin/bash
# Скрипт, инспектирующий лог-файл DNS-сервера named
# с целью выявления завирусованных машин через анализ DNS-запросов к доменам из списка OpenDNS.
# Формирует список логинов в txt ($FW) и squid acl ($FA) форматах.
# OpenDNS
# Credentials
OD_LOGIN="*****"
OD_PASSW="*****"
# Идентификатор в сети OpenDNS
OD_NETID="XXXXX"
OD_CDATE=`date +%Y-%m-%d --date='1 day ago'`
# Полный лог доменов с сайта OpenDNS
DOMAINS_LOG="/tmp/malwared.csv"
# Первые 5 доменов из лога
DOMAINS_LIST="/tmp/domains.list"
# Лог named
FI="/var/log/messages"
# Временная директория с зараженными ПК
FD="/tmp/viruses/"
# Лог файл для web-отчета
FW="/srv/www/htdocs/malwared.txt"
# ACL-файлы для squid (локальный и удаленный на сервере со squid)
FA="/tmp/malwared.list"
RFA="/etc/squid/hawk/malwared.list"
# Сколько дней держать зараженные машины в карантине
LTIME="1"
# Белый список (ip-адреса через пробел)
WHLIST="172.16.0.3"
# Файл, проверяемый watchdog'ом перегружающим squid
qfile="/var/tmp/squid_chekmodify.txt"
# Забираем файл с доменами OpenDNS
/usr/local/sbin/od_fetchmalware.sh $OD_LOGIN $OD_PASSW $OD_NETID $OD_CDATE > $DOMAINS_LOG
# Выделить первые 5 доменов из фала .csv с сайта OpenDNS
head -n 6 < $DOMAINS_LOG | tail -n 5 | awk -F "," '{ print $2 }' > $DOMAINS_LIST
grep client $FI > temp1
for DOMAIN in `cat $DOMAINS_LIST`
do
grep $DOMAIN temp1 >> temp2
done
rm $DOMAINS_LIST
# Выделить ip-адреса зараженных ПК
awk -F "[\ ,#] "'{ print $7 }' < temp2|sort|uniq|awk -v folder="$FD" '{print "" > folder$1}'
rm temp1 temp2
# Удалить из папки состав белого списка (ошибка не выводится, если нет указанных адресов)
rm $FD$WHLIST 2>&1
# Бекап списока ip-адресов зараженных ПК для squid
cp $FA $FA.old
# Удалить все не дирестории старше $LTIME дней
find $FD \! -type d -mtime +$LTIME -exec rm {} \;
# Составление текущего списка ip-адресов зараженных ПК для squid
echo "none" > $FA
ls $FD >> $FA
# Вычисление разницы между текущим списком и бекапом
DI=`diff $FA $FA.old`
# Удалить бекап
rm $FA.old
# Сообщить об изменениях squid, если есть разница между текущим списком и бекапом
if [ "$DI" != "" ]
then
date > $qfile
scp $FA root@proxy.rspu:$RFA
scp $qfile root@proxy.rspu:$qfile
fi
# Составить список для просмотра в web
echo "Зараженные ПК:" > $FW
echo "" >> $FW
ls $FD >> $FW
# Данный скрипт не производит перезагрузку прокси сервера самостоятельно,
# он должен использоваться в связке со скриптом squid-autorelaoder,
# который отслеживает изменения файла $qfile
exit 0

