Защита сервера при помощи Port Knocking
Port knocking — это сетевой защитный механизм, действие которого основано на следующем принципе: сетевой порт является по-умолчанию закрытым, но до тех пор, пока на него не поступит заранее определённая последовательность пакетов данных, которая «заставит» порт открыться. Например, вы можете сделать «невидимым» для внешнего мира порт SSH, и открытым только для тех, кто знает нужную последовательность.
Настройка Сервера
Наиболее популярным ПО для организации port knocking является knockd. Работая в режиме демона совместно с iptables, knockd прослушивает сетевой интерфейс, ожидая корректной последовательности запросов на подключение. Как только knockd отлавливает корректную последовательность, он выполняет команду, определённую в конфигурационном файле knockd для данной последовательности — как правило, это вызов iptables, разрешающий соединение на определённый сетевой порт.
Например, у вас запущен демон SSH, ожидающий входящих подключений на 22 порту. Однако, правилом iptables входящие соединения на 22-й порт запрещены. Knockd, прослушивающий интерфейс eth0, ожидает последовательности из TCP SYN-пакетов на порты 9000, 6501 и 1234. Как только эта последовательность соединений будет обнаружена, knockd при помощи вызова iptables, изменит правило сетевого фильтра таким образом, чтобы разрешить подключение извне к 22-му TCP-порту, на котором уже ожидает SSH-демон.
Вы можете собрать knockd из исходных кодов, полученных на сайте (также, на сайте имеются ссылки на готовые пакеты для различных систем) или же установить, используя менеджер пакетов вашей системы. После установки knockd, его конфигурационный файл можно найти в /etc/knockd.conf .
В начале конфигурационного файла находится раздел [options] , содержащий глобальные настройки демона. Например, строкой:
вы можете определить, какой интерфейс прослушивать в случае, если в вашей системе он не является единственным.
Далее, после раздела [options] , идут описания последовательностей. По-умолчанию их две:
Значение параметра sequence определяет последовательность. Числа являются номерами TCP-портов. Также, вы можете явно указать, TCP или UDP порт использовать, при помощи суффиксов :tcp и :udp . Например:
Значение параметра seq_timeout задаёт максимальное время в секундах, которое отводится на совершение клиентом последовательности подключений. Если клиент не укладывается в это время — подключение будет отклонено.
Значение параметра command определяет путь и параметры вызываемой программы в случае обнаружения корректной последовательности.
Параметром tcpflags вы можете определять, какие флаги должны иметь пакеты, участвующие в последовательности. Несколько флагов необходимо разделять запятой:
А для явного исключения отельных флагов нужно использовать восклицательный знак:
Другим интересным вариантом конфигурации knockd является использование параметров start_command , cmd_timeout и stop_command :
Параметр start_command по смыслу идентичен параметру command . Значение параметра cmd_timeout определяет временной интервал в секундах, по истечении которого запустится команда, определённая значением параметра stop_command . Таким образом, вы можете открывать определённый порт лишь на некоторый промежуток времени.
Как правило, чтобы демон knockd запускался автоматически при старте системы, достаточно в файле /etc/default/knockd установить:
Настройка Клиента
Протестировать соединение с вашим сервером вы можете обычным telnet-клиентом, последовательно подключившись к заданным портам.
При повседневном же использовании, естественно, не очень удобно запускать последовательные серии telnet-соединений перед тем, как вам необходимо подключиться к вашему SSH-серверу. В комплекте с демоном knockd поставляется утилита knock , которая и призвана осуществлять необходимые серии подключений. Например:
Обратите внимание на формат описания номеров и типов портов. Он такой же, как и в файле /etc/knockd.conf .
Если придуманные вами последовательности основаны, в том числе и на TCP-флагах пакетов, то вам понадобятся более продвинутые средства, нежели knock. Например, SendIP или packit, умеющие формировать сетевые пакеты с произвольным содержимым.
Если вы используете port knocking повсеместно, то вам, вероятно, могут понадобиться knock-клиенты для мобильных платформ.
Для iPhone вы можете попробовать пару knockd-совместимых клиента — Port Knock Lite и KnockOnD, для Android — knock-android.
Port Knocking в PuTTY
Под Windows вы можете использовать русскую сборку PuTTY. Начиная с версии 0.63-RU-15, в ней появилась возможность осуществлять последовательность подключений к закрытым портам по технологии Port Knocking:
Практические Моменты
Одна из причин, по которой не стоит использовать knock-клиенты, запоминающих секретную последовательность и воспроизводящих её без вашего участия — это очень «похожесть» на сохранение где-то пароля к вашей учётной записи в открытом виде. Секретная последовательность подключений к портам должна находиться лично у вас в памяти и больше нигде. Тогда метод port knocking’а будет на самом деле эффективным.
Также, port knocking критикуют за то, что всегда существует вероятность того, что ваш трафик перехватят и смогут вычленить из него последовательность, и, чем чаще вы используете port knocking, тем выше эта вероятность. Конечно, вы можете дополнять вашу последовательность псевдопоследовательностями для того, чтобы запутать злоумышленников, однако в первую очередь всегда заботьтесь о безопасности самого сервиса, открытый порт которого вы маскируете и рассматривайте port knocking как дополнение к безопасности сервиса, нежели как панацею.
Более сложный метод защиты от прослушивания port knocking состоит в использовании одноразовых секретных последовательностей. Для этого в knockd.conf нужно использовать параметр one_time_sequences , значением которого должен быть путь к файлу с определением последовательностей, по одной на строку. После использования каждой последовательности knockd комментирует строку с использованной последовательностью и переключается на следующую.
В том числе имейте ввиду некоторые недостатки использования knockd. Во-первых, если процесс knockd внезапно «упадёт», вы не сможете получить удалённый доступ к маскируемой службе. Во-вторых, помните, что IP-пакеты могут доставлять к вашему серверу разными путями и приходить вовсе не в той последовательности, в которой были отправлены. Именно поэтому не стоит использовать слишком маленькое значение параметра seq_timeout.
Само-собой разумеется, что knockd можно использовать не только для управления правилами сетевого фильтра посредством запуска iptables. Вы можете запускать всё, что вам угодно, начиная от запуска процесса резервного копирования, заканчивая удалением важных данных с сервера и отправкой заявления об увольнении вашему начальнику.
Продвинутый Port Knocking
Можно установить knockd на серверах, находящихся за «основным» сервером, создав целую цепочку knockd-серверов.
Некоторые проекты, реализующие port knocking, решают проблему «replay»-атак за счёт использования криптоалгоритмов аутентификации. К таким проектам относятся, например, cryptknock, COK, и tariq.
Конечно, более продвинутые механизмы port knocking’а не оставят вам возможности «просто помнить» последовательность номеров портов, однако присутствие массы полезных «фишек» с лихвой перекроет этот «недостаток».
Всем интересующимся технологией port knocking’а рекомендуется посетить страницу portknocking.org.
Итоги
Когда специалист по безопасности скажет вам что весь этот ваш port knocking — лишь ещё один тонкий слой безопасности — он будет прав. Всегда ответственно подходите к защите непосредственно сервисов, как таковых, и не рассматривайте port-knocking как панацею. Port knocking будет полезен, чтобы скрыть запущенные службы от «случайных прохожих» и, если вы регулярно меняете секретные последовательности вашего knock-демона, то, вероятно, и предотвратит bruteforce-атаки по словарю учётных записей SSH.
Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
- Главная
- Настраиваем Port Knocking в Mikrotik
Настраиваем Port Knocking в Mikrotik
Достаточно часто системные администраторы сталкиваются с дилеммой: необходимо иметь возможность подключиться к собственным системам из любой точки мира, но при этом не выставлять открытыми наружу служебные порты. Отчасти это решается использованием VPN, но такая возможность присутствует не всегда, а в некоторых ситуациях единственной возможностью может оказаться только прямое подключение к системе. Но есть и другой способ, называемый Port Knocking, дословно обозначающий «постучать в порт», но не просто постучать, а особым образом, после чего вы сможете получить доступ, стучите — и вам откроют.
Освоить MikroTik вы можете с помощью онлайн-курса «Настройка оборудования MikroTik». В курсе изучаются все темы из официальной программы MTCNA. Автор — официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто еще не держал его в руках. В состав входят 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.
Но сначала хочется предупредить вас о некоторых заблуждениях относительно этой технологии. Являясь инструментом, обеспечивающим дополнительную безопасность, Port Knocking никак не повышает безопасность защищаемого им сервиса. Это всего лишь способ получить доступ, причем далеко не самый надежный.
Если вы хотите закрыть таким образом, скажем, терминальный сервер со слабой политикой паролей или приложение, работающее по незащищенному протоколу — то это плохая идея. Лучше займитесь обеспечением безопасности основных сервисов.
Кроме того, стучащийся клиент может находиться в публичной сети, за VPN-сервером или прокси, да даже за NAT провайдера, в этом случае доступ к сервису, хоть и кратковременно, могут получить все пользователи, находящиеся с ним на одном IP-адресе.
Также трафик может быть перехвачен и проанализирован, что позволит вычислить правильную последовательность «стука» и чем чаще вы будете использовать Port Knocking, тем быстрее можно будет это сделать.
Поэтому мы не рекомендуем этот способ для активно используемых сетевых сервисов, кроме дополнительных сложностей вы получите достаточно призрачную защиту, а вот как инструмент сокрытия служебных портов и получения доступа к ним только в случаях крайней нужды данная технология очень даже подходит.
Port Knocking с использованием портов
Этот метод можно назвать классическим, его суть сводится к обращению в определенном порядке к ряду закрытых портов за ограниченный период времени. Если мы выполнили необходимые условия — получаем доступ.
При реализации данного метода следует соблюдать правильную последовательность правил в цепочке INPUT межсетевого экрана и основным правилом, вокруг которого будет строиться наша система будет разрешение уже установленных и связанных соединений (ESTABLISHED, RELATED) и если вы настраивали роутер по нашей инструкции, то данное правило будет стоять вторым в цепочке, после «правила-пустышки» разрешающего доступ из локальной сети.
В нашем примере для получения доступа мы выберем последовательное обращение к портам 7890 и 9870, данные значения выбраны исключительно из удобочитаемости, на практике желательно разносить порты подальше друг от друга, так как такое сочетание достаточно легко «простучать» любым сканером сети, но к этому мы вернемся позже.
А пока добавим новое правило. На закладке General укажем: Chain — input, Protocol — tcp, Dst. Port — 7890.
На закладке Action добавим действия: Action — add src to address list, Address List — KNOCK-1, Timeout — 00:00:30
Данное правило при обращении к порту 7890 добавит адрес источника в список KNOCK-1 на 30 секунд, в течении этого времени мы должны успеть обратиться к следующему порту, чтобы получить доступ. Поэтому не следует указывать слишком высокие значения, на наш взгляд 30 секунд вполне достаточно для выполнения нужных команд в терминале, в ряде случаев можно незначительно увеличить таймаут.
Теперь добавим еще одно правило. Закладка General: Chain — input, Protocol — tcp, Dst. Port — 9870. Закладка Advanced: Src. Address List — KNOCK-1.
Закладка Action: Action — add src to address list, Address List — KNOCK-ACCEPT, Timeout — 00:01:00.
Данное правило добавит в лист KNOCK-ACCEPT адрес того источника, который обратится к порту 9870 и при этом находится в списке KNOCK-1, время жизни записи в новом листе — 1 минута, за это время мы должны будем установить соединение с устройством.
Тоже самое в терминале:
Оба этих правила следует расположить выше правила, разрешающего уже установленные соединения. Ниже этого правила добавим разрешающее для подключения к целевому порту, в нашем случае это будет порт Winbox — 8291.
На закладке General укажем: Chain — input, Protocol — tcp, Dst. Port — 8291, на Advanced: Src. Address List — KNOCK-ACCEPT, вкладку Action не трогаем, так как accept действие по умолчанию.
В терминале для этого выполните:
Данное правило следует расположить ниже разрешающего установленные и связанные подключения.
Теперь пару слов о том, как это работает. Первые два правила заполняют листы с адресом источника, чтобы попасть в последний — KNOCK-ACCEPT — нам нужно в течении 30 секунд обратиться к последовательно к портам 7890 и 9870. Затем в течении минуты мы должны подключиться к целевому порту, в нашем случае это Winbox. После чего все пакеты этого соединения пойдут по правилу, разрешающему уже установленные соединения. Таким образом по истечении минуты новых соединений установить не удастся, а уже установленные будут продолжать работать до отключения.
Что же, правила есть, теперь попробуем постучаться. В Linux для этого можно использовать команду netcat — nc, для того чтобы постучаться на TCP-порт используйте:
Где XXX.XXX.XXX.XXX — IP-адрес вашего роутера. Ключ -z указывает сканировать порт без посылки данных, ключ -w задает таймаут в 1 секунду.
Для UDP-портов используйте:
В Windows постучаться немного сложнее, из стандартных средств можно использовать PowerShell:
Но данная команда будет ожидать ответа от узла в течении таймаута около 20 секунд и указанного нами времени для обращения ко второму порту может не хватить, в этом случае имеет смысл увеличить время ожидания. Также таким образом можно постучать только на TCP-порт.
Другой вариант — использование утилиты tcping, которая проще и удобнее в использовании, но позволяет опять таки стучать только в TCP-порты:
Ключ -n указывает количество посылаемых пакетов, в нашем случае один.
Также существуют специальные утилиты, позволяющие автоматизировать этот процесс, например, PortKnock, которая умеет работать как с TCP, так и с UDP портами и может обращаться последовательно к 4 портам.
Подведем небольшие итоги, Port Knocking с использованием портов достаточно прост в реализации, позволяет строить цепочки с нужным количеством портов и времени обращения к ним, но также имеет ряд недостатков. Прежде всего это ограниченность возможностей Windows, а ситуации бывают разные и не всегда есть время и возможности искать дополнительное ПО и качать его. Также близко расположенные порты без особых проблем можно простучать сканером.
Мы провели небольшой эксперимент, простая утилита Advanced Port Scanner без проблем простучала последовательности 7890-9870 и более сложную 7890-9870-8790, но не смог справиться с 17890-9870. Поэтому не используйте близко расположенные порты и устанавливайте минимальное время действия адресов в списках.
Кроме того, подобные последовательности достаточно легко выявляются при возможности перехвата и анализа трафика, что вполне возможно при использовании публичных сетей и сторонних VPN-сервисов. Имейте это ввиду и уделите должное внимание безопасности основного сервиса, доступ к которому вы ограничиваете данной технологией.
Port Knocking с использованием ICMP
Данный вариант отличается от классического тем, что вместо определенных портов мы будем использовать ICMP-пакеты различного размера. Это проще сделать стандартными средствами ОС и труднее поддается анализу при перехвате трафика, так как не столь бросается в глаза.
Несмотря на стандартный размер MTU в 1500 байт, это значение может быть уменьшено при использовании VLAN, VPN и т.д., поэтому мы не советуем использовать пакеты размером более 1000 байт, также учтите размер заголовков ICMP-пакета в 28 байт.
Просто выберите два (или более) произвольных числа до 1000, которые и будут вашими ключами для Port Knocking, в нашем случае это будут 250 и 209. Точно также, как и в предыдущем способе правила будут строиться относительно разрешения для уже установленных соединений.
Нам снова понадобится создать два правила для добавления адреса источника в соответствующие листы. В первом правиле укажем на General: Chain — input, Protocol — icmp, а на Advanced: Packet Size — 278 (250 + 28) — размер нашего первого пакета, на Action: Action — add src to address list, Address List — KNOCK-1, Timeout — 00:00:30.
Во втором зададим следующие значения: General: Chain — input, Protocol — icmp, Advanced: Src. Address List — KNOCK-1, Packet Size — 237 (209 + 28) — размер второго пакета, на Action: Action — add src to address list, Address List — KNOCK-ACCEPT, Timeout — 00:01:00.
Либо выполним в терминале:
Данные правила следует расположить выше правила разрешающего установленные и сопутствующие соединения. Остальные настройки полностью повторяют предыдущий способ.
Чтобы постучаться таким образом из Linux выполним:
Где ключ -s задает размер пакета (без учета заголовка), а ключ -с количество посылаемых пакетов, в нашем случае один.
В Windows синтаксис будет немного иной:
Здесь за размер пакета отвечает ключ -l, а за количество пакетов -n.
Принцип работы не отличается от предыдущего метода, получив ICMP-пакет размером в 250 байт адрес источника будет занесен в первый список. Затем в течении 30 секунд мы должны прислать второй пакет размером в 209 байт, в этом случае адрес будет занесен в список KNOCK-ACCEPT и в течении минуты с устройством можно будет установить соединение.
На наш взгляд данный способ более удобен, так как позволяет использовать только штатные инструменты операционных систем и более сложен для выявления при анализе трафика. Также можно сочетать сразу оба способа, скажем, сначала постучать на выбранный порт, а затем прислать ICMP-пакет нужного размера. В любом случае выбор остается за вами и ограничивает вас только ваша фантазия и здравый смысл.
Освоить MikroTik вы можете с помощью онлайн-курса «Настройка оборудования MikroTik». В курсе изучаются все темы из официальной программы MTCNA. Автор — официальный тренер MikroTik. Материал подходит и тем, кто уже давно работает с оборудованием MikroTik, и тем, кто еще не держал его в руках. В состав входят 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.
Дополнительные материалы:
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
Или подпишись на наш Телеграм-канал: