40
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Port knocking — ваш турникет на межсетевом экране

Время чтения 3 минуты
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
40
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Привет, вАЙТИ. Меня зовут Егор Орлов, я более 24 лет в ИТ, преподаю в СПбПУ.

В этой статье мы разберем назначение и принципы работы механизма port knocking, рассмотрим примеры настройки сервиса knockd в ОС на основе ядра Linux. Получим управляемый механизм временного открытия доступа во внутреннюю сеть по определенным сетевым портам через межсетевой экран. Все детали собрал ниже.

Port knocking — ваш турникет на межсетевом экране

«Простукивание портов»: что это такое

Port knocking (перевод с английского «простукивание портов») — техника обработки на защищаемом узле определенной последовательности обращений к сетевым портам. Используется, как правило, в следующих сценариях:

  1. С удаленного узла выполняется определенная «открывающая» серия обращений к портам, после чего на защищаемом узле выполняется правило для межсетевого экрана, открывающее возможность подключения к серверу по определенному протоколу/порту, например SSH, RDP, VNC и т. п., для удаленного управления. По истечении тайм-аута на «полезное» подключение выполняется правило, его запрещающее.
  2. Аналогично предыдущему пункту, только запрещающее правило применяется не по тайм-ауту, а после выполнения определенной, «закрывающей» последовательности обращений к портам. Таким образом, «полезное» подключение можно выполнить только между «открывающим» и «закрывающим» простукиванием портов.

Реализовав первый или второй сценарий, мы получаем аналог турникета на проходной, только вместо прикладываемой карточки — ожидаемая защищаемым узлом серия обращений к портам, а вместо прохода в офис — возможность выполнения «полезного» сетевого подключения. 

Варианты реализации port knocking

Реализация port knocking может выполняться стандартными средствами любой UNIX-подобной ОС — например, в случае ОС на основе ядра Linux обработку определенных обращений к портам можно реализовать средствами netfilter/iptables (или nftables), а для простукивания с удаленного узла применять nmap.

Мы же рассмотрим настройку и использование port knocking в двух приведенных выше сценариях средствами специализированной службы knockd и клиентской утилиты knock.

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

Установка компонент

Установка службы knockd, отслеживающей обращения к портам, производится путем добавления в систему пакета, который, как правило, называется knock-server. В зависимости от используемого вами дистрибутива это будет выглядеть примерно так:

# apt install knock-server

Или, например, так:

# dnf install knock-server

После установки пакета knock-server конфигурационный файл службы находится по пути: 

/etc/knockd.conf

Его мы и будем править в дальнейшем. Управление же службой выполняется средствами systemctl. Соответственно, запуск, остановка, автозапуск, перезапуск после изменения конфигурации реализуются следующими командами:


# systemctl start knockd
# systemctl stop knockd
# systemctl enable knockd
# systemctl restart knockd

 

Клиентский же компонент — утилита knock, — как правило, содержится в одноименном пакете.

Предварительная настройка

В вариантах настройки, указанных ниже, мы будем использовать knockd только для того, чтобы открывать на время турникет для приема новых «полезных» соединений. Для того чтобы после закрытия турникета трафик «полезного» соединения не блокировался настройками пакетной фильтрации, стоит разрешить его на защищаемом узле. Например, таким образом:

 # iptables -A INPUT -i <int> -m state --state ESTABLISHED,RELATED -j ACCEPT

<int> — сетевой интерфейс защищаемого узла, на котором мы принимаем сетевой трафик.

Данное правило разрешает только пакеты, принадлежащие (ESTABLISHED) или относящиеся (RELATED) к уже установленным сетевым соединениям, не разрешая при этом принимать новые соединения.

Также стоит установить запрещающую политику по умолчанию для всего входящего трафика.

# iptables -A INPUT DROP

Всё остальное за нас сделает правильно настроенный knockd.

Первый сценарий 

В этом сценарии служба knockd ожидает «открывающей» последовательности по указанным в конфигурации портам. Естественно, необходимо использовать порты, не занятые другими сетевыми службами. По получении ожидаемой последовательности knockd выполняет команду, открывающую «полезное» подключение, — в нашем случае это будет команда, разрешающая прием новых соединений по протоколу SSH (tcp/22). А по завершении тайм-аута выполняет команду, запрещающую прием новых соединений. 

Соответствующие настройки для knockd (конфигурация в /etc/knockd.conf) выглядят следующим образом:


[options]
	logfile = /var/log/knockd.log
	Interface =  # Подставить используемый интерфейс
[openSSH]
	sequence = 661,671,681
	seq_timeout = 5
	tcpflags = syn
	cmd_timeout = 30
	start_command = /sbin/iptables -I INPUT -i  -s %IP% -p tcp --dport 22 -m state --state NEW -j ACCEPT
	stop_command = /sbin/iptables -D INPUT -i  -s %IP% -p tcp --dport 22 -m state --state NEW -j ACCEPT

 

Общие опции knockd:

  • logfile — файл логирования сообщений knockd;
  • Interface — интерфейс, который будет прослушиваться с помощью knockd.

Опции, описывающие работу турникета, — обработка «открывающей» последовательности:

  • sequence — последовательность «стука» (обращений к портам). Можно явно задать так же и протокол, например 661:udp, 671, 681:tcp;
  • seq_timeout — время в секундах, за которое необходимо завершить «стук»;
  • tcpflags — флаги tcp, которые должны быть в «открывающей» последовательности. Несколько флагов могут быть указаны через запятую или исключены явно, например – !fin,syn,ack;
  • start_command — команда, которая будет выполнена после получения корректной последовательности;
  • stop_command — команда, которая будет выполнена по истечении cmd_timeout;
  • cmd_timeout — время в секундах на подключение (время между выполнением start_command и stop_command).

После выполнения настройки службу knockd необходимо перезапустить:

# systemctl restart knockd 

Наконец, с удаленного узла мы можем предъявить пропуск — простучать указанные в конфигурации службы порты и получить возможность установить соединение:


# knock -v target.host 661 671 681
hitting tcp target.host:661
hitting tcp target.host:671
hitting tcp target.host:681
# ssh user@target.host
. . .

Второй сценарий

Отличие конфигурации для второго сценария — отсутствие тайм-аута cmd_timeout, но присутствие описания «закрывающей» последовательности.


[options]
        logfile = /var/log/knockd.log
        Interface =   # Подставить используемый интерфейс
[openSSH]
       sequence    = 661,671,681
       seq_timeout = 5
       command     = /sbin/iptables -I INPUT -i  -s %IP% -p tcp --dport 22  -m state --state NEW -j ACCEPT
       tcpflags    = syn
[closeSSH]
       sequence    = 681,671,661
       seq_timeout = 5
       command     = /sbin/iptables -D INPUT -i  -s %IP% -p tcp --dport 22  -m state --state NEW -j ACCEPT
       tcpflags    = syn

 

При данных настройках администратор удаленного узла после предъявления «открывающей» последовательности и установки «полезного» соединения сам должен выполнить обращение с «закрывающей» последовательностью.

Финальные соображения

Таким образом, мы получили реализацию турникета на межсетевом экране — механизм, который может открывать на время нужные нам варианты соединения по итогам предъявления определенного пропуска.

Естественно, не стоит упускать из виду угрозу прослушивания трафика со стороны злоумышленника. Если злоумышленник может перехватить ваше взаимодействие с защищаемым узлом в момент предъявления «открывающей» последовательности, то для него не составит труда «скопировать» ваш пропуск. При наличии соответствующих угроз стоит периодически менять используемую «открывающую» последовательность и, разумеется, использовать защищенные варианты аутентификации в рамках «полезного» подключения. 

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники