Мониторинг подозрительной DNS активности в локальной сети

Материал из RSU WiKi
Перейти к: навигация, поиск

Когда служба OpenDNS [1] сообщает о вирусной активности для серой сети, в которой пользователи выходят в интернет с одного внешнего IP-адреса, возникает проблема определения какие именно машины заражены.

Служба OpenDNS предоставляет информацию о запрошенных доменах, относящихся к категории "Malware". По анализу лога запросов DNS-сервера сети на наличие доменов из списка OpenDNS можно выявить зараженные ПК. Так же процесс нужно автоматизировать скриптами.

  • Мы включили логирование DNS-сервера (в нашей конфигурации в отдельный лог не вынослили, поэтому нас интересует файл /var/log/messages). На основании собранных за сутки DNS-запросов можно выносить вердикт о зараженности той или иной машины.
  • Нашли скрипт сотрудника OpenDNS [2], который забирает список доменов с их сайта и модифицировали его под свои нужды (сбор только malware-доменов)

od_fetchmalware.sh

#!/bin/sh
 
 #
 # OpenDNS Stats Fetcher
 # Richard Crowley <richard@opendns.com>
 #
 # Modified by RSU network team
 # <noc@rsu.edu.ru>
 
 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

Примечания

  1. OpenDNS: DNS-Based Web Security
  2. GitHub: rcrowley / opendns-fetchstats

См. также

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты