Это продолжение первой статьи про port knocking (PK), — это её вторая часть. В первой (обзорной) части мы познакомились с основами и рассмотрели простейшие методы PK, многие из которых (именно в силу своей простоты) содержат различные недостатки.
Поэтому сегодня мы продолжим наше погружение в эту тему и обсудим более поздние и совершенные реализации PK, в том числе гибридные техники и алгоритмы с использованием единственного крипто-пакета (SPA), после чего подведем черту: сравним и проанализируем совокупные преимущества и недостатки каждого из рассмотренных подходов, чтобы в результате каждый мог выбрать наиболее подходящую ему реализацию «кнокера».
Кроме рассмотренного ранее простого knockd
имеются и более сложные методики организации portknocking’a, некоторые из которых я хотел бы рассмотреть ниже хотя бы обзорно.
Cerberus, вероятно, одна из первых вариаций на тему PK, но вовсе не самая простая из существующих. Очень долгое время Cerberus использовался для служебных нужд в некоторых правительственных учреждениях США, и только в 2005 году стал доступен для широкой общественности. Это продвинутая «стучалка», которая сочетает сразу два подхода: метод одноразовой аутентификации; и классическая аутентификация каждого конкретного пользователя в неявной форме.
Давайте посмотрим, как это реализуется на практике.
Cerberus работает только через протокол ICMP, при этом используя в качестве транспорта наиболее стандартную его форму (тип 12). Как следствие этого, Cerberus позволяет работать через брандмауэр (-ы) в подавляющем большинстве случаев (как с ведома их администраторов, так и без) . Кроме того, системы обнаружения атак спокойно реагируют на пакеты Cerberus, в отличие от knockd
.
Теперь о деталях внутреннего устройства, а значит и о возможностях этого механизма. Пакет Cerberus состоит из заголовка и динамически-вычисляемого одноразового пароля (One time Password, OTP), блок с которым занимает последние 16 символов. Функционально-главное поле заголовка (ActionID
) содержит код команды, которую следует запустить на стороне сервера.
Вот общая структура описанного пакета:
struct { 2 byte Initiator (0xDEAD) 1 byte UserID 1 byte ActionID (Action sequence) 8 byte One time Password (OTP) 4 byte IP address (Dotted decimal to Hex) }
В таком пакете одноразовым паролем (OTP) выступает MD5-хеш из точного системного времени, ранее полученное случайное число с сервера (server seed), пользовательского пароля, а также целевого IP-адреса.
Структура пакета Cerberus
Проиллюстрируем эту теорию на практическом примере клиента, который отправляет одноразовый пакет с помощью подручных средств. Я привожу команды для FreeBSD, с минимальной адаптацией они доступны и на других платформах.
1. Сначала создаем крипто-составляющую пакета — одноразовый ключ (OTP):
date +%d%m%y%k%MSrvseedMypass204.244.123.234 | md5sum | cut -c <nobr>17-32</nobr>
2. Получаем результат «f0b70bc031a365e9ccf47bea», который вставляем в общий формат сообщения и отправляем его на сервер:
ping -c1 —p «dead4201f0b70bc031a365e9ccf47bea» sesame.samag.ru
Здесь переменные Srvseed
и Mypass
— это серверное seed-значение и пароль акаунта пользователя на сервере соответственно. На рисунке выше приведена структура сгенерированного нами пробного пакета для её последующей инкапсуляции в ICMP-пакет.
Давайте суммируем основные свойства именно этого протокола:
knockd
) и исполнить спецкоманду на сервере удаленно; ping
и md5
, которые есть на любой Unix-платформе (в Windows легко найти стороннюю реализацию md5, например); Система Sig^2 (иногда записывается как sig2knock) достигает некоторых преимуществ Cerberus, но иным путем, в этом плане по своему устройству скорее представляя концептуально переработанную версию уже классического knockd
. Для краткого ознакомления с ней приведем базовый алгоритм развертывания системы Sig^2.
Изначально предполагается, что администратор неким заведомо надежным способом передал логин и пароль новому пользователю системы.
IP:port
откуда была проиграна правильная комбинация стуков). На указанный случайный порт выполняется port mapping для запрошенного сервиса из локальной сети или самого сервера. Несмотря на очень тщательную проработку деталей, этот протокол получился достаточно «шумным» — на полный цикл получения допуска генерируются как минимум 2 пакета в двух направлениях.
В первой и текущей части этой статьи мы уже отчасти рассмотрели все классические методы PK, используя приобретенные знания и опираясь на изложенную теоретическую базу, повысим градус сложности и дальше обзорно рассмотрим наиболее перспективные и продвинутые направления уже современного port knocking’a.
Но начать их обзор логично с исходного вопроса — мотивации для их создания — почему эти техники в процессе своей эволюции так существенно усложняются?
Как в рамках этих достаточно узких возможностей классической техники надежно бороться с replay-атаками (sequence replay attack) или c потенциальной проблемой прозрачного перехвата всего трафика, например в виде атаки «человек посередине» (man in the middle attack)?
Да, на самом деле подводных камней тут предостаточно, поэтому классический port knocking в процессе поиска решений и эволюционного развития пришел к новой технике — авторизации по одному пакету (Single Packet Authorization, SPA).
И рассмотрим мы её опять на примере.
В качестве такового я выбрал fwknop (firewall knock operator) — по моему мнению, одну из самых удачных реализаций SPA. Несмотря на то, что она может работать и в режиме обычного PK, что порой очень удобно из соображений совместимости с другими подобными решениями — в нашем описании мы сосредоточимся только на её SPA-составляющей. Утилита написана на Perl и плотно интегрируется с возможностями вашего брандмауэра (поддерживаются netfilter/iptables
и ipfw
), при этом по умолчанию SPA-пакеты доставляются через протокол UDP
(поддерживаются также TCP и ICMP). Для начала работы клиенту нужно заранее получить свой приватный DSA-ключ.
Итак, в терминологии SPA «стуком» называется отправка единственного и уникального «пакета идентификации». Давайте снова воспользуемся самым быстрым способом познакомиться с потенциальными возможностями системы — рассмотрим структуру такого пакета с примером его заполнения:
fwknop
(для обеспечения обратной совместимости) В итоге все поля собираются в единую строку, кодируемую в формате Base64
, поля которой разделяются символом «:», и на выходе получается упакованная последовательность байтов. Далее она шифруется по алгоритму AES
в режиме CBC
(Cipher Block Chain), при размере блока в 128 бита и длине ключа в 256 бит. В заключительной фазе, эта строка инжектируется в выбранный транспортный пакет и отправляется в адрес fwknop-сервера, который прослушивает фиксированный порт (по умолчанию — 66201
) в ожидании новых заданий.
В самой последней версии fwknop
можно отказаться от постоянного порта, для чего реализована сложная методика рандомизации портов принимающих SPA-пакеты, с которой всем желающим предлагаю самостоятельно ознакомиться вот здесь.
На первый взгляд кажется, что, будучи привязанным к одному случайному порту fwknop
более заметен со стороны гипотетического сетевого наблюдателя, чем классический PK работающий посредством множества случайных портов. Но на самом деле, такой подход дает возможность отказаться вообще от каких-либо статических сигнатурных маркеров для SPA-пакетов: теперь любой приходящий пакет успешно расшифровывается и исполняется, либо он просто отбрасывается, если имеющиеся в системе DSA-ключи не смогли его расшифровать.
Но с точки зрения злоумышленника, не знающего целевой порт сервиса, задача обнаружения таких пакетов в общем сетевом потоке практически невыполнима. Очевидно, что при такой однопакетной авторизации также отпадают многие вышеперечисленные коллизии свойственные классическому PK, что на фоне использования сильного криптоалгоритма идентификации и вовсе выставляет традиционный PK как устаревший метод.
Статистический анализ показывает полную незаметность SPA-пакетов на фоне обычного TCP/IP-потока данных
После получения SPA-пакета и его успешной расшифровки, серверный fwknop
в целях дополнительной проверки на правомерность доступа, может выполнить сканирование системы подключаемого клиента на предмет её особенностей (passive fingerprinting), для чего заранее необходимо установить стороннюю утилиту p0f.
И только если каскад из этих проверок пройден успешно — заданная во входящем fwknop-пакете команда исполняется целевым PK-сервером.
В заключение рассмотрения fwknop
отмечу три момента. Во-первых, сама криптографическая реализация идентификации базируется на стандарте ISO/IEC fwknop
умышленно спроектирован так, что «тайные команды» на сервер в целях дополнительной конспирации можно отправлять через анонимную сеть Tor Onion Network (как?). Второй момент — это наличие поля «временных штампов» у каждого SPA-пакета. В отличие от уже рассмотренной выше похожей PK-системы Cerberus, в fwknop
не требуется синхронизации времени взаимодействующих сторон, и это поле пока никак не используется на стороне сервера.
Поэтому для противодействия replay-атакам здесь применяется другая, более удобная для всех логика: сервер хранит хеши всех обработанных им пакетов. С учетом первого статического блока внутри зашифрованного пакета (случайная комбинация символов), а также динамического timestamp
’a — клиент не может даже теоретически снова сгенерировать идентичный пакет, поэтому любой повторно принятый пакет автоматически отвергается со стороны сервера.
Графический клиент morpheus-fwknop
Третий, заключительный пункт касается немаловажного момента работы с клиентской частью fwknop
— она будет работать везде, где доступен Perl (для Windows есть Strawberry Perl ). Самые последние версии этой программы были полностью переписаны на Си (сохранена полная совместимость по протоколу), доступны её сборки под Linux, Mac OS X, *BSD. Есть графический Win32-клиент для Windows (поставляется с исходниками на Delphi), а также новый проект на .Net — morpheus-fwknop (смотрите рис. выше).
В дополнение имеется решение для Android и даже web-прокси WebKnock (смотрите рис. ниже), который позволяет послать свой SPA-пакет с любого стационарного или мобильного устройства подключенного к Интернету.
SPA-авторизация через браузер – WebKnock
При использовании fwknop
в режиме обычного PK (non-SPA) подходит множество ранее упомянутых классических клиентов для knockd. Для тестирования правильности сопряжения и настроек клиента и сервера любезно поставляется специальный сервисный скрипт.
Исторически идея port knocking’a была впервые сформулирована в открытых источниках в начале 2001 года в почтовой рассылке German Linux User Group. Сам термин был придуман и озвучен специалистом по сетевой безопасности Мартином Крживинским (Martin Krzywinski) в 2003 году в журнале SysAdmin Magazine. Первым практически реализованным «кнокером» стал Cerberus, который кроме этого впервые использовал усложненную методику одноразовых паролей (One Time Password, OTP). В целом, из-за однотипности и простоты классического PK, всех его представителей принято обозначать как TPK (traditional port knocking), где наиболее типичный и яркий представитель — knockd
.
Дальнейшее совершенствование методов сокрытия привело к созданию механизма авторизации по единственному крипто-пакету (Single Packet Authorization, SPA), который был впервые продемонстрирован в рабочем виде в 2005 году на конференции BlackHat. Самая удобная и популярная среди широких народных масс реализация SPA была представлена чуть позже — в 2008 году Майклом Рашем (Michael Rash), который создал fwknop
(программа до сих пор активно развивается). Третье и последнее поколение «кнокеров» — это различные гибридные техники (hybrid port-knocking, HPK), сочетающие в себе сильные стороны от самых разных концепций и течений (иногда в силу экстравагантности своих подходов ставящие под сомнение даже свою принадлежность к PK).
Огромное количество информации и разных реализаций PK доступно на портале посвященному этой теме — www.portknocking.org.
Следующую часть-продолжение этой статьи — читайте здесь. Общее оглавление и начало этой серии статей — доступно здесь.
~
Кстати говоря, могу порекомендовать отличные серверные шкафы от фирм estap или apc, которые не только надёжны и удобно спроектированы, но внешнее эффектны и вполне доступны по цене. Итак, качественный шкаф для сервера напольный можно купить у компании CITIPRO, которая является давним и надежным поставщиком брендового серверного оборудования и дополнительных комплектующих к нему. Рекомендую!