Просмотров: 8530

Позади закрытых дверей: Port knoсking. Часть 2


Это продолжение первой статьи про port knocking (PK), — это её вторая часть. В первой (обзорной) части мы познакомились с основами и рассмотрели простейшие методы PK, многие из которых (именно в силу своей простоты) содержат различные недостатки.

Поэтому сегодня мы продолжим наше погружение в эту тему и обсудим более поздние и совершенные реализации PK, в том числе гибридные техники и алгоритмы с использованием единственного крипто-пакета (SPA), после чего подведем черту: сравним и проанализируем совокупные преимущества и недостатки каждого из рассмотренных подходов, чтобы в результате каждый мог выбрать наиболее подходящую ему реализацию «кнокера».

port knocking logo порты безопасность доступ двери стучать

Cerberus: OTP в действии

Кроме рассмотренного ранее простого knockd имеются и более сложные методики организации portknocking’a, некоторые из которых я хотел бы рассмотреть ниже хотя бы обзорно.

Cerberus, вероятно, одна из первых вариаций на тему PK, но вовсе не самая простая из существующих. Очень долгое время Cerberus использовался для служебных нужд в некоторых правительственных учреждениях США, и только в 2005 году стал доступен для широкой общественности. Это продвинутая «стучалка», которая сочетает сразу два подхода: метод одноразовой аутентификации; и классическая аутентификация каждого конкретного пользователя в неявной форме.

Давайте посмотрим, как это реализуется на практике.

Cerberus работает только через протокол ICMP, при этом используя в качестве транспорта наиболее стандартную его форму (тип 12). Как следствие этого, Cerberus позволяет работать через брандмауэр (-ы) в подавляющем большинстве случаев (как с ведома их администраторов, так и без) . Кроме того, системы обнаружения атак спокойно реагируют на пакеты Cerberus, в отличие от knockd .

ICMP: А если его тупо запретить?
Конечно, теоретически ICMP можно заблокировать, но этот протокол прямым образом влияет на маршрутизацию и фрагментацию TCP/IP-пакетов (например, именно через ICMP идут посылки достаточно важных запросов «frag needed»), поэтому это является грубым нарушением сетевых стандартов и выполняется только в крайнем случае (например, при неких ICMP-уязвимостях в системах). Блокировка сообщений типа 3 и 4 с большой вероятностью нарушит нормальную фрагментацию пакетов, что внешне проявляется как внезапная остановка передачи данных большого объема, а также периодические загадочные ошибки и разрывы сесcий по таймауту. По поводу первобытного страха ICMP-флудинга и прочего — чаще всего это страшилки из прошлого века (подобные вещи невозможны при правильно настроенной сети), сейчас практически все сохо-маршрутизаторы успешно распознают и блокируют атаки подобного рода, да и DDoS-атаки в основном направлены на web-службы.

Теперь о деталях внутреннего устройства, а значит и о возможностях этого механизма. Пакет 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
Структура пакета 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-пакет.

Давайте суммируем основные свойства именно этого протокола:

  1. Это многопользовательский протокол, то есть он позволяет обслуживать различных пользователей сервера с индивидуальным набором команд и прав;
  2. Этот протокол базируется на одноразовом пароле (OTP), то есть он устойчив к рискам прослушивания трафика и replay-атакам;
  3. Протокол использует очень живучий транспорт — ICMP type 8 ping packets, — эти типичные для сети сервисные пакеты пропускает подавляющее большинство файрволов, настроенных для самых разных задач;
  4. Гибкость протокола: для доступа к серверу вы можете авторизовать любой IP-адрес для подключения к нему (а не только адрес, с которого пришел пакет, как это реализовано в knockd ) и исполнить спецкоманду на сервере удаленно;
  5. Не нужен специальный клиент для работы с сервером — достаточно стандартных утилит ping и md5 , которые есть на любой Unix-платформе (в Windows легко найти стороннюю реализацию md5, например);
  6. Протокол использует криптоалгоритмы для защиты своего содержимого, что опять же выгодно отличает его от других portknocking-методик;
  7. При генерации OTP используются текущие дата и время с точностью до минуты. Некоторые специалисты называют это избыточным усложнением протокола, т.к. дополнительно требуется точная синхронизация времени как на сервере, так и на клиенте, чтобы такой пакет был успешно расшифрован. Тогда как другие, наоборот считают достоинством, считая это дополнительным и неявным уровнем безопасности.

Sig^2 — двунаправленная система

Система Sig^2 (иногда записывается как sig2knock) достигает некоторых преимуществ Cerberus, но иным путем, в этом плане по своему устройству скорее представляя концептуально переработанную версию уже классического knockd . Для краткого ознакомления с ней приведем базовый алгоритм развертывания системы Sig^2.

Изначально предполагается, что администратор неким заведомо надежным способом передал логин и пароль новому пользователю системы.

  1. Когда новый пользователь добавляется в PortKnocking-систему защищенного сервера, Sig^2-демон генерирует полностью случайную инициализирующую последовательность стуков (Initial Sequence Numbers, ISNs), после чего она шифруется с помощью хэша от логина и пароля этого пользователя. Администратор отсылает эту зашифрованную строку через любые доступные средства связи клиенту. После чего он самостоятельно сохраняет её на локальный диск в папку программы.
  2. Пользователь запускает клиента Sig^2, и вводит в него свой логин и пароль. Программа вычисляет хэш от имени пользователя и его пароля, после чего клиент успешно расшифровывает им строку. После чего запускается механизм «простукивания сервера» полученной последовательностью ISNs. По завершении сам клиент переходит в режим ожидания ответа от сервера.
  3. PK-демон на сервере, зафиксировав правильно отыгранную последовательность стуков от клиента, генерирует случайный номер свободного порта для текущей сессии, кроме того вычисляет новую случайную последовательность стуков, упаковывает их в ответное сообщение, шифруя оба значения хэшем на основании логина и пароля пользователя, и отправляет в UDP-пакете по координатам клиента (адрес клиента — это IP:port откуда была проиграна правильная комбинация стуков). На указанный случайный порт выполняется port mapping для запрошенного сервиса из локальной сети или самого сервера.
  4. Клиент сохраняет на диск полученную от сервера новую зашифрованную строку стуков (для следующего сеанса), после чего запускает ранее указанного пользователем внешнего клиента (например, SSH), передавая ему номер расшифрованного открытого порта. На этом сеанс считается успешно завершенным.
  5. Следующий сеанс — повторяет алгоритм, начиная с шага 2.

Несмотря на очень тщательную проработку деталей, этот протокол получился достаточно «шумным» — на полный цикл получения допуска генерируются как минимум 2 пакета в двух направлениях.

Мутация кнокеров: причины и следствия

В первой и текущей части этой статьи мы уже отчасти рассмотрели все классические методы PK, используя приобретенные знания и опираясь на изложенную теоретическую базу, повысим градус сложности и дальше обзорно рассмотрим наиболее перспективные и продвинутые направления уже современного port knocking’a.

Но начать их обзор логично с исходного вопроса — мотивации для их создания — почему эти техники в процессе своей эволюции так существенно усложняются?

Очень сильный недостаток PK в его классическом понимании — это особенности сетевой среды, которая изначально не предназначена для подобных нестандартных операций. Например, если клиент выстукивает серию-трель из 8 пакетов, где гарантия того, что 5-ый пакет не придет быстрее 4-го, нарушив всю ключевую последовательность? На самом деле гарантий здесь никаких нет, и чтобы повысить вероятность правильной последовательности — клиенту лучше высылать пакеты с некоторой паузой, например в 4 секунды. Нетрудно посчитать, что авторизация в этом случае растянется на полминуты. Увеличив время таймаута на сервере это можно как-то пережить, но что случится, если в этот момент одновременно начинает стучаться какой-то другой клиент, вклиниваясь в вашу последовательность?

Как в рамках этих достаточно узких возможностей классической техники надежно бороться с replay-атаками (sequence replay attack) или c потенциальной проблемой прозрачного перехвата всего трафика, например в виде атаки «человек посередине» (man in the middle attack)?

Fwknop: прогрессивный SPA

Да, на самом деле подводных камней тут предостаточно, поэтому классический port knocking в процессе поиска решений и эволюционного развития пришел к новой технике — авторизации по одному пакету (Single Packet Authorization, SPA).

И рассмотрим мы её опять на примере.

В качестве такового я выбрал fwknop (firewall knock operator) — по моему мнению, одну из самых удачных реализаций SPA. Несмотря на то, что она может работать и в режиме обычного PK, что порой очень удобно из соображений совместимости с другими подобными решениями — в нашем описании мы сосредоточимся только на её SPA-составляющей. Утилита написана на Perl и плотно интегрируется с возможностями вашего брандмауэра (поддерживаются netfilter/iptables и ipfw ), при этом по умолчанию SPA-пакеты доставляются через протокол UDP (поддерживаются также TCP и ICMP). Для начала работы клиенту нужно заранее получить свой приватный DSA-ключ.

Итак, в терминологии SPA «стуком» называется отправка единственного и уникального «пакета идентификации». Давайте снова воспользуемся самым быстрым способом познакомиться с потенциальными возможностями системы — рассмотрим структуру такого пакета с примером его заполнения:

  • Случайно сгенерированные числовые данные (16 байт)
  • Имя пользователя
  • Временная метка локальной системы (Timestamp)
  • Версия клиента fwknop (для обеспечения обратной совместимости)
  • Код режима: запрашивается выполнение команды или доступ к серверу?
  • Адрес/порт клиента для удаленного подключения или код команды
  • Контрольная сумма-подпись этого пакета (MD5)

В итоге все поля собираются в единую строку, кодируемую в формате Base64 , поля которой разделяются символом «:», и на выходе получается упакованная последовательность байтов. Далее она шифруется по алгоритму AES в режиме CBC (Cipher Block Chain), при размере блока в 128 бита и длине ключа в 256 бит. В заключительной фазе, эта строка инжектируется в выбранный транспортный пакет и отправляется в адрес fwknop-сервера, который прослушивает фиксированный порт (по умолчанию — 66201 ) в ожидании новых заданий.

Fwknop Single Packet Authorization SPA безопасность

В самой последней версии fwknop можно отказаться от постоянного порта, для чего реализована сложная методика рандомизации портов принимающих SPA-пакеты, с которой всем желающим предлагаю самостоятельно ознакомиться вот здесь.

На первый взгляд кажется, что, будучи привязанным к одному случайному порту fwknop более заметен со стороны гипотетического сетевого наблюдателя, чем классический PK работающий посредством множества случайных портов. Но на самом деле, такой подход дает возможность отказаться вообще от каких-либо статических сигнатурных маркеров для SPA-пакетов: теперь любой приходящий пакет успешно расшифровывается и исполняется, либо он просто отбрасывается, если имеющиеся в системе DSA-ключи не смогли его расшифровать.

Но с точки зрения злоумышленника, не знающего целевой порт сервиса, задача обнаружения таких пакетов в общем сетевом потоке практически невыполнима. Очевидно, что при такой однопакетной авторизации также отпадают многие вышеперечисленные коллизии свойственные классическому PK, что на фоне использования сильного криптоалгоритма идентификации и вовсе выставляет традиционный PK как устаревший метод.

Fwknop Single Packet Authorization SPA безопасность
Статистический анализ показывает полную незаметность SPA-пакетов на фоне обычного TCP/IP-потока данных

После получения SPA-пакета и его успешной расшифровки, серверный fwknop в целях дополнительной проверки на правомерность доступа, может выполнить сканирование системы подключаемого клиента на предмет её особенностей (passive fingerprinting), для чего заранее необходимо установить стороннюю утилиту p0f.

Кстати говоря, после долгого перерыва она, наконец, снова обновилась и продолжила своё развитие. В отличие от известного сканера nmap, p0f использует полностью пассивные механизмы fingerprinting’а, то есть не генерируется никакого дополнительного трафика, который может быть обнаружен исследуемой стороной.

И только если каскад из этих проверок пройден успешно — заданная во входящем fwknop-пакете команда исполняется целевым PK-сервером.

В заключение рассмотрения fwknop отмечу три момента. Во-первых, сама криптографическая реализация идентификации базируется на стандарте ISO/IEC 9798-2 для высоконадежных систем. Для UDP-пакетов возможен дополнительный слой ассиметричного шифрования через GPG, кроме того клиент fwknop умышленно спроектирован так, что «тайные команды» на сервер в целях дополнительной конспирации можно отправлять через анонимную сеть Tor Onion Network (как?). Второй момент — это наличие поля «временных штампов» у каждого SPA-пакета. В отличие от уже рассмотренной выше похожей PK-системы Cerberus, в fwknop не требуется синхронизации времени взаимодействующих сторон, и это поле пока никак не используется на стороне сервера.

Поэтому для противодействия replay-атакам здесь применяется другая, более удобная для всех логика: сервер хранит хеши всех обработанных им пакетов. С учетом первого статического блока внутри зашифрованного пакета (случайная комбинация символов), а также динамического timestamp ’a — клиент не может даже теоретически снова сгенерировать идентичный пакет, поэтому любой повторно принятый пакет автоматически отвергается со стороны сервера.

Графический клиент morpheus-fwknop
Графический клиент morpheus-fwknop

Третий, заключительный пункт касается немаловажного момента работы с клиентской частью fwknop  — она будет работать везде, где доступен Perl (для Windows есть Strawberry Perl ). Самые последние версии этой программы были полностью переписаны на Си (сохранена полная совместимость по протоколу), доступны её сборки под Linux, Mac OS X, *BSD. Есть графический Win32-клиент для Windows (поставляется с исходниками на Delphi), а также новый проект на .Net — morpheus-fwknop (смотрите рис. выше).

В дополнение имеется решение для Android и даже web-прокси WebKnock (смотрите рис. ниже), который позволяет послать свой SPA-пакет с любого стационарного или мобильного устройства подключенного к Интернету.

SPA-авторизация через браузер – WebKnock
SPA-авторизация через браузер – WebKnock

При использовании fwknop в режиме обычного PK (non-SPA) подходит множество ранее упомянутых классических клиентов для knockd. Для тестирования правильности сопряжения и настроек клиента и сервера любезно поставляется специальный сервисный скрипт.

Port knocking на перекрестках истории

Исторически идея 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, которая является давним и надежным поставщиком брендового серверного оборудования и дополнительных комплектующих к нему. Рекомендую!

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru pikabu.ru blogger.com liveinternet.ru livejournal.ru google.com bobrdobr.ru yandex.ru del.icio.us

Подписка на обновления блога → через RSS, на e-mail, через Twitter
Теги: , , , , , , , , ,
Эта запись опубликована: Среда, 30 января 2013 в рубрике Unix'овоеОбзоры.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Зарегистрировать/комментатор

Для регистрации укажите свой действующий email и пароль. Связка email-пароль позволяет вам комментировать и редактировать данные в вашем персональном аккаунте, такие как адрес сайта, ник и т.п. (Письмо с активацией придет в ящик, указанный при регистрации)

(обязательно)


⇑ Наверх
⇓ Вниз