Содержание статьи
И парни с той стороны, конечно, не просто собирают данные для диссертации. Чтобы в этом убедиться, достаточно открыть SSH и посмотреть, как в течение получаса в твой порт набьется целая команда специалистов по чужой безопасности, генерирующих записи вроде таких:
sshd[198760]: Failed password for www-data from 82.154.230.131 port 65229 ssh2
sshd[198760]: Received disconnect from 82.154.230.131 port 65229:11: Bye Bye [preauth]
sshd[198760]: Disconnected from authenticating user www-data 82.154.230.131 port 65229 [preauth]
sshd[198766]: Invalid user bkp from 103.152.18.138 port 51314
sshd[198766]: pam_unix(sshd:auth): check pass; user unknown
sshd[198766]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.152.18.138
sshd[198766]: Failed password for invalid user bkp from 103.152.18.138 port 51314 ssh2
Не надо быть сотрудником ИБ‑отдела, чтобы догадаться, какие именно исследования проводят эти граждане. И избавиться от их назойливого внимания достаточно сложно. Уж если вцепились, то к процессу будут подключаться всё новые и новые адреса, и вот уже кажется, что весь интернет сидит и подбирает пароли к твоей машине.
Если говорить языком цифр, то за час любой адрес IPv4 (даже не отвечающий вообще ни на что) опрашивается более 300 раз с полутора сотен источников. За месяц будут опрошены все порты до одного, за две недели — 65 000, а за неделю — 63 000. В общем, «небольшой», но многочисленный брат еще как следит.
Учитывая, что, даже если инфраструктуру твоей компании обслуживает команда опытных специалистов, которые быстро и решительно накатывают свежие обновления, не запускают «на пять минут» какую‑нибудь службу (которая потом висит годами) и не выкладывают по‑быстрому файлики для субподрядчиков (ну кто там его найдет на нашем секретном порте, хе‑хе), все равно остается неустранимое «окно уязвимости».
Эксплоит уже в работе, а разработчики еще тестируют патч, а потом пользователи его раскатывают — пока все это провернется, атакующая сторона, имея предварительно собранную базу отпечатков, быстро и точно по ним отработает. А то и просто воспользуется поисковиками интернета вещей, которые раздают доступ к такой информации через API за весьма скромное вознаграждение. Да и простое сканирование при помощи какого‑нибудь ZMap позволяет, не приходя в сознание, составить грубый список целей, по которым следом летит нагрузка. Кто не спрятался — его проблемы.
Гораздо лучше, если охотники на чужое о внешних службах просто не будут знать, по крайней мере до момента, пока напрямую не заинтересуются.
Постановка задачи
Работы по защите периметра от сканирования можно разбить на две части. Первая — это формирование стоп‑листа с адресами, намерения которых вызывают вопросы (или, наоборот, никаких вопросов уже нет); вторая — распределение и применение этого списка по машинам.
Ни одна, ни другая задача не представляют сложности в плане реализации, но для комплексного решения потребуется дополнительная логика и какой‑то формат, в котором будет удобно хранить и анализировать данные.
Делать такой комбайн только для себя не очень целесообразно, поэтому, когда стало ясно, что парой скриптов и unit-файлом дело не обойдется, я решил создать более‑менее универсальный проект, пригодный для использования всеми, кому тема интересна.
Так родился проект scan2ban, который помогает мне защищать машины от ненужного внимания и, возможно, пригодится и тебе. Дальше я покажу, как работают разные его модули и чего удается добиться с их применением.
Угрозы и нейтрализация
Если кому‑то кажется, что сканирование — это вещь простая и вариантов тут нет, то он ошибается. За время наблюдения я выявил три разных типа.
Сканер. Тут все понятно: зарядили перебор портов, не особо скрываясь, и сидим ждем. Сканировать могут на постоянной основе или одноразово, но всегда с одного адреса. Это легко выявить и заблокировать. Если нам прислали три пакета и ни один не попал в открытый порт, то добро пожаловать в блок. На момент написания статьи первая десятка самых активных источников этого класса за месяц выглядела так.
Ваншотеры. Это менее заметные персонажи. Их действия выглядят так: со случайного адреса прилетает запрос на какой‑то конкретный порт, и только на него. Блокировать такое сканирование по счетчику бесполезно, в следующий раз ваншотер появится не скоро и точно так же опросит один порт. При этом первое обращение все равно пройдет (если у тебя есть соответствующая служба). Таких запросов во входящем трафике абсолютное большинство, без малого 80%. Вот как это выглядит на протяжении месяца.
A/B/C — это маркер агента, куда запрос пришел. Здесь блокировать можно только превентивно. Этим занимается модуль greyport, который повторяет идею серых списков для почты. По умолчанию все порты закрыты, и, чтобы получить доступ, надо повторить запрос заданное число раз (число повторов, задержку отсчета и контрольный интервал можно задать в настройках модуля).
В общем случае это не доставляет неудобств, кроме замедленного первого соединения. Доступ для адреса по умолчанию открывается на сутки, потом процедура повторится. Эффективность не стопроцентная, но, задав число повторов равное одному, можно отбить те самые 80% проходимцев, два отвадят 90%, три — от 95%. Но три — это уже совсем предел. Сетевой стек на стороне клиента больше пяти запросов, как правило, не отправляет, и отлетать начнут уже нормальные клиенты.
На качество работы greyport влияет в том числе номер порта. Выше я привел параметры эффективности для портов 80 и 22, а для Elasticsearch (9200) задержка только одного первого пакета отбивает 99 запросов из 100.
Также на примере сканеров этого класса можно оценить скорость работы «партнеров» по производственному процессу. Из таблицы видно, что задержка между пакетами варьируется от секунд (для соседних адресов) до часов, если сегменты разные. Однако тут есть существенный элемент случайности. Например, во время подготовки выборки я нашел пример, когда адреса из разных (сильно разных) сетей были опрошены с разницей в две секунды, зато соседние — с разницей в две минуты.
Третий тип сканеров самый спокойный. Эти периодически постукивают то тут, то там. Выглядит это следующим образом.
Поисковики по интернету вещей — это третья категория. От них запросы приходят бессистемно, адреса опрашивают вразнобой. Бывает, опрашивают несколько раз с разных адресов. У них целые сетевые сегменты и «одобрямс» от провайдера, так что можно размазывать запросы по источникам и вообще никуда не спешить.
Для работы с подобными клиентами предназначен модуль lazyscan, который проверяет, сколько событий с адреса было зарегистрировано за довольно длительный период (по умолчанию неделя, а иногда и этого мало). И если выясняется, что источник занимается своим делом систематически, модуль так же неспешно (пока наберется статистика), но надолго переводит его в список заблокированных.
Таких субъектов за три месяца наблюдений набралось более 5000, темпы пополнения упали, но по 50–60 новых адресов в сутки продолжает добавляться.
Владельцы «легальных» сканеров предлагают писать им письма в случае, если их активность кому‑то не нравится. Теоретически, после того как ты докажешь, что являешься владельцем диапазона, который хочешь исключить из опросов, они больше не потревожат. Но такие действия больше напоминают замазывание кусков спутниковых карт — лучшего способа привлечь внимание не придумать.
Да и особого смысла слать письма нет, так как на одного добропорядочного приходится пять менее отзывчивых, жаловаться на которых можно разве что в спортлото. Поэтому оптимальной тактикой выглядит молчаливый блок, что еще и экономит силы.
Горшок с нарисованным медом
Давай глянем на уровень выше и посмотрим, чем наши любители сканировать интересуются в плане прикладных протоколов, в частности HTTP. Столь любимые всеми веб‑админки, REST и прочие чудеса — это удобство не только для владельца сервиса, но и для обладателя тайного знания. Отправив хитрый запрос, он пополнит ряды администраторов устройства без всяких там ROP, heap spraying и других страшных слов. Для контроля за подобной активностью есть модуль, разбирающий запросы к Nginx и посильно их классифицирующий.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»