В базе приложений Splunk есть много решений, которые позволяют делать Enrichment и добавлять информацию о том, что тот или иной IP-адрес выглядит подозрительным и «засветился» в той или иной reputation-базе. Однако, эти приложения либо платные (например, Recorded Future App, Kaspersky Threat Feed App), либо очень медленные (IP Reputation App, на момент написания к тому же не до конца доступен из-за maintenance с февраля месяца), поэтому мы решили разработать свой opensource плагин RST Cloud Threat Database Add-on for Splunk, который позволит собирать в единую базу разрозненные сведения из открытых источников и выдавать ответы на потоках в десятки тысяч запросов в секунду.
Для создания плагина был разработан небольшой набор скриптов на Python, который обогащает данные при поиске в Splunk налету, запрашивая нужные сведения во внешней базе данных. В качестве БД мы использовали Key-Value хранилище Redis, которое держит в оперативной памяти все значения и практически не зависит от скорости чтения/записи с дисковой подсистемы. Плагин опубликован на github и открыт для предложений по улучшению.
Наши тесты производительности данного решения на виртуальной машине с 2 ядрами Intel® Xeon® E5-2630 и 4 ГБ RAM показали, что с учетом всех накладных расходов со стороны Python 2.7, виртуализации на обычном оборудовании и самого Splunk, пропускная способность при 300K записей в Redis составляет в среднем 25K RPS, что достаточно для многих задач. Стоит сразу обратить ваше внимание на то, что данные цифры получены при использовании Redis «из коробки» без дополнительной оптимизации и кластеризации. Также в скрипте поиска пока не используются механизмы pipeline при работе с базой.
Например, использование плагина позволяет определить web form spammer или подключения к сайту с зараженных IP-адресов.
Можно быстро вывести всех «опасных» клиентов из консоли:
sourcetype=Web:*:access_log host=www.demo.demo | fields clientip | dedup clientip | lookup local=true lookupthreat clientip OUTPUT threatscore threatsource threatcategory | where threatscore > 0
Отображая данные, мы показываем их источник, категории в которых засветился данный IP в разных базах и кумулятивную оценку Threat Score.
Можно воспользоваться макросом, с которым работать несколько удобнее:
| `threatDB(clientip)`
Для упрощения Redis может стоять непосредственно на Splunk Head, а может быть вынесен на другой сервер или кластер серверов. Кроме того, в состав RST Cloud Threat Database Add-on входит несколько скриптов, которые автоматически скачивают репутационные базы из различных источников и импортируют их в Redis.
Сегодня очень много надежных и открытых источников для сбора подозрительных и опасных IP-адресов. Например, плагин позволяет работать с более чем 15, включая:
- Sblam! – база веб-спамеров в блогах, форумах и комментариях
- StopForumSpam — база веб-спамеров в блогах, форумах, wiki
- CINS Score – база Sentinel IPS, которой компания поделилась с community
- Blocklist.de – база с адресами атакующих на Postfix, SSH, Apache, Spambots, irc-Bots, Reg-Bots, DDos и других
- Ransomware Tracker – адреса серверов CnC для Ransomware (программы вымогатели)
- AlienVault OTX – открытые фиды от популярного SIEM
- Binary Defence – специализированный поставщик Theat Intelligence
- EmergingThreats – мы интегрировали фиды от компании ProofPoint для блокирования на межсетевых экранах
- Arbor ATLAS – адреса, от известнейшей компании, с которых идет DDoS-атаки
- Botvrij – адреса скомпрометированные вредоносным ПО
- Tor Project – адреса Tor-сетей.
База может включать как отдельные адреса, которые ищутся по ключу IP: red.smembers('ip:'+clientip), так и подсети, обрабатываемые скриптом в цикле for i in red.sscan_iter(name='net:index',match=str(ip.words[0])+'*',count=500).
Теперь перейдем к установке. Описание по шагам:
- Установка Redis
- Установка необходимых библиотек
- Корректировка строк для подключения в скриптах
- Настройка CRON-задачи для актуализации IP Reputation БД
Первый шаг мы опустим, во-первых, манулов много, а, во-вторых, на debian он ставится одной командой apt-get install -y redis-server с базовыми настройками.
Для решения проблем с зависимостями от Python библиотек достаточно выполнить:
$ wget bootstrap.pypa.io/get-pip.py
$ python get-pip.py
$ sudo pip install redis
$ sudo pip install netaddr
Стоит отметить, что Splunk использует внутри себя свой Python, который не стоит модифицировать, поэтому все дополнительное лучше устанавливать в тот Python, что живет в операционной системе.
В зависимости от того как вы установили Redis вам может потребоваться исправить адреса и порты подключения в скриптах в каталоге $SPLUNK_HOME/etc/apps/threatDB/bin.
Основной скрипт поиска из Splunk: redisworker.py
sys.path.append("/usr/local/lib/python2.7/dist-packages") # Path to redis-py module
redis_server = '127.0.0.1'
redis_port = 6379
Скрипт очистки БД: threat_flushdb.py
redis_server = '127.0.0.1'
redis_port = 6379
Скрипт загрузки обновленных IoC: threatuploader.py
redis_server = '127.0.0.1'
redis_port = 6379
Скрипт-загрузчик IoC из разных источников: start_threatupload.sh
base_dir=/opt/splunk/bin/scripts/threatDB
python_bindir=/usr/bin
Далее выбираем какой-нибудь временный каталог:
$ mkdir -p /tmp/threatsupload
И настраиваем CRON-планировщик, например, через файл /etc/crontab:
2 0 * * * root $SPLUNK_HOME/etc/apps/threatDB/bin/start_threatupload.sh /tmp/threatsupload
В продуктивной среде вместо root лучше использовать другую учетную запись. Так же стоит отметить, что установленного по умолчанию обновления раз в сутки достаточно, так как TTL для записей в БД составляет 48 часов.
Платные решения предоставляют целый набор индикаторов компрометации, включая IP-адреса, доменные адреса, хэши и пути файлов, имена мьютексов и т.п., что позволяет идентифицировать активность вредоносного ПО в организации, мы же в RST Cloud концентрируемся на вебе, поэтому пока наш плагин дает возможность работы только с IP-адресами. В дальнейшем мы планируем доработать плагин в части производительности и расширить его функционал, в том числе добавить фиды репутационных баз с DNS-именами, тем самым расширить область его применения.
Автор: kirion