Поиск по сайту:

Как использовать Port Knocking в Linux (и почему этого делать не следует)


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

Стук в порт — это «секретный стук»

В 1920-х годах, когда сухой закон был в самом разгаре, если вы хотели попасть в спикизи, вам нужно было знать секретный стук и правильно постучать, чтобы попасть внутрь.

Стук в порт - современный эквивалент. Если вы хотите, чтобы люди имели доступ к службам на вашем компьютере, но не хотите открывать брандмауэр для доступа в Интернет, вы можете использовать детонацию портов. Это позволяет вам закрывать порты на вашем брандмауэре, которые разрешают входящие соединения, и автоматически открывать их при выполнении заранее установленного шаблона попыток подключения. Последовательность попыток подключения действует как секретный стук. Еще один секретный стук закрывает порт.

Стук портов — это что-то новое, но важно знать, что это пример безопасности через неизвестность, и эта концепция в корне ошибочна. Секрет доступа к системе безопасен, потому что его знают только члены определенной группы. Но как только этот секрет раскрыт — либо потому, что он раскрыт, замечен, угадан или выработан — ваша безопасность аннулируется. Вам лучше защитить свой сервер другими, более надежными способами, например, требовать входа на основе ключа для сервера SSH.

Наиболее надежные подходы к кибербезопасности являются многоуровневыми, поэтому, возможно, одним из этих уровней должен быть стук портов. Чем больше слоев, тем лучше, верно? Тем не менее, вы можете возразить, что стук портов мало что добавляет (если вообще что-то) к должным образом защищенной и защищенной системе.

Кибербезопасность — обширная и сложная тема, но вы не должны использовать стук в порт как единственную форму защиты.

Установка нокаут

Чтобы продемонстрировать стук портов, мы собираемся использовать его для управления портом 22, который является портом SSH. Мы будем использовать инструмент под названием Knockd. Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux вместо этого используйте инструмент управления пакетами вашего дистрибутива Linux.

Введите следующее:

sudo apt-get install knockd

Возможно, в вашей системе уже установлен брандмауэр iptables, но вам может потребоваться установить пакет iptables-persistent. Он обрабатывает автоматическую загрузку сохраненных правил iptable.

Введите следующее, чтобы установить его:

sudo apt-get install iptables-persistent

Когда появится экран конфигурации IPV4, нажмите пробел, чтобы принять вариант «Да».

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

Следующая команда указывает iptables разрешить продолжение установленных и текущих соединений. Теперь мы выполним еще одну команду, чтобы закрыть порт SSH.

Если кто-то подключается по SSH, когда мы вводим эту команду, мы не хотим, чтобы он был отключен:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Эта команда добавляет в брандмауэр правило, в котором говорится:

  • -A: добавить правило в таблицу правил брандмауэра. То есть добавить его в конец.
  • ВХОД: это правило о входящих соединениях.
  • -m conntrack: правила брандмауэра действуют в отношении сетевого трафика (пакетов), который соответствует критериям правила. Параметр -m заставляет iptables использовать дополнительные модули сопоставления пакетов — в данном случае тот, который называется conntrack, работает с возможностями отслеживания сетевых подключений ядро.
  • –cstate ESTABLISHED,RELATED: указывает тип соединения, к которому будет применяться правило, а именно соединения ESTABLISHED и RELATED. Установленное соединение — это соединение, которое уже установлено. Связанное соединение — это соединение, созданное в результате действия установленного соединения. Возможно, кто-то из подключенных хочет скачать файл; это может произойти при новом соединении, инициированном хостом.
  • -j ПРИНЯТЬ: если трафик соответствует правилу, перейти к цели ПРИНЯТЬ в брандмауэре. Другими словами, трафик принимается и разрешается проходить через брандмауэр.

Теперь мы можем дать команду закрыть порт:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Эта команда добавляет в брандмауэр правило, в котором говорится:

  • -A: добавить правило в таблицу правил брандмауэра, т. е. добавить его в конец.
  • ВХОД. Это правило касается входящих подключений.
  • -p tcp: это правило применяется к трафику, использующему протокол управления передачей.
  • –dport 22. Это правило применяется к TCP-трафику, предназначенному для порта 22 (порт SSH).
  • -j REJECT: если трафик соответствует правилу, перейти к цели REJECT в брандмауэре. Таким образом, если трафик отклонен, он не проходит через брандмауэр.

Мы должны запустить демон netfilter-persistent. Мы можем сделать это с помощью этой команды:

sudo systemctl start netfilter-persistent

Мы хотим, чтобы netfilter-persistent выполнял цикл сохранения и перезагрузки, чтобы он загружал и контролировал правила iptable.

Введите следующие команды:

sudo netfilter-persistent save
sudo netfilter-persistent reload

Теперь вы установили утилиты, и порт SSH закрыт (надеюсь, без прерывания чьего-либо соединения). Теперь пришло время настроить секретный стук.

Настройка нокаута

Есть два файла, которые вы редактируете для настройки knockd. Первый — это следующий файл конфигурации knockd:

sudo gedit /etc/knockd.conf

Откроется редактор gedit с загруженным файлом конфигурации knockd .

Мы отредактируем этот файл в соответствии с нашими потребностями. Нас интересуют разделы «openSSH» и «closeSSH». Следующие четыре записи находятся в каждом разделе:

  • последовательность: последовательность портов, к которым необходимо получить доступ, чтобы открыть или закрыть порт 22. Порты по умолчанию: 7000, 8000 и 9000, чтобы открыть его, и 9000, 8000 и 7000, чтобы закрыть его. . Вы можете изменить их или добавить больше портов в список. Для наших целей мы будем придерживаться значений по умолчанию.
  • seq_timeout: период времени, в течение которого кто-то должен получить доступ к портам, чтобы инициировать их открытие или закрытие.
  • команда: команда, отправляемая брандмауэру iptables при запуске действия открытия или закрытия. Эти команды либо добавляют правило в брандмауэр (чтобы открыть порт), либо удаляют его (чтобы закрыть порт).
  • tcpflags: тип пакета, который должен получать каждый порт в секретной последовательности. Пакет SYN (синхронизация) является первым в запросе TCP-подключения, называемом трехэтапным рукопожатием.

Раздел «openSSH» может быть прочитан как «запрос TCP-соединения должен быть сделан на порты 7000, 8000 и 9000 — в таком порядке и в течение 5 секунд — для отправки команды на открытие порта 22 на брандмауэр».

Раздел «closeSSH» может быть прочитан как «запрос TCP-соединения должен быть сделан на порты 9000, 8000 и 7000 — в таком порядке и в течение 5 секунд — для отправки команды на закрытие порта 22 на брандмауэр».

Правила брандмауэра

Записи «command» в разделах openSSH и closeSSH остаются прежними, за исключением одного параметра. Вот как они состоят:

  • -A: добавить правило в конец списка правил брандмауэра (для команды openSSH).
  • -D: удалить команду из списка правил брандмауэра (для команды closeSSH).
  • ВХОД. Это правило касается входящего сетевого трафика.
  • -s %IP%: IP-адрес устройства, запрашивающего подключение.
  • -p: сетевой протокол; в данном случае это TCP.
  • –dport: порт назначения; в нашем примере это порт 22.
  • -j ПРИНЯТЬ: перейти к цели принятия в брандмауэре. Другими словами, пусть пакет проходит через остальные правила, не предпринимая никаких действий.

Редактирование файла конфигурации Knockd

Изменения, которые мы внесем в файл, выделены красным ниже:

Мы увеличиваем «seq_timeout» до 15 секунд. Это щедро, но если кто-то вручную запускает запросы на подключение, ему может понадобиться столько времени.

В разделе «openSSH» мы меняем параметр -A (добавить) в команде на -I (вставить). Эта команда вставляет новое правило брандмауэра в верхнюю часть списка правил брандмауэра. Если оставить параметр -A, он добавит список правил брандмауэра и поместит его вниз.

Входящий трафик проверяется на соответствие каждому правилу брандмауэра в списке сверху вниз. У нас уже есть правило, закрывающее порт 22. Таким образом, если входящий трафик проверяется на соответствие этому правилу до того, как он увидит правило, разрешающее трафик, в соединении будет отказано; если он первым увидит это новое правило, соединение будет разрешено.

Команда close удаляет правило, добавленное openSSH, из правил брандмауэра. Трафик SSH снова обрабатывается ранее существовавшим правилом «порт 22 закрыт».

После внесения этих изменений сохраните файл конфигурации.

Редактирование файла управления постукиванием

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

ip addr

Соединение, которое эта машина использует для исследования этой статьи, называется enp0s3. Запишите имя вашего соединения.

Следующая команда редактирует управляющий файл knockd:

sudo gedit /etc/default/knockd

Вот файл knockd в gedit.

Несколько правок, которые нам нужно сделать, выделены красным:

Мы изменили запись «START_KNOCKD=» с 0 на 1.

Мы также удалили хеш # в начале записи «KNOCKD_OPTS=» и заменили «eth1» именем нашего сетевого подключения, enp0s3. Конечно, если ваше сетевое подключение — eth1, вы не сможете его изменить.

Доказательство в пудинге

Пришло время проверить, работает ли это. Мы запустим демон knockd с помощью этой команды:

sudo systemctrl start knockd

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

Используйте следующую команду, чтобы отправить секретную последовательность запросов на подключение к портам на хост-компьютере с IP-адресом 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Это говорит knock нацелить компьютер с IP-адресом 192.168.4.24 и запустить запрос на подключение к портам 7000, 8000 и 9000, в свою очередь, с -d (задержка ) 500 миллисекунд между ними.

Затем пользователь по имени «dave» отправляет SSH-запрос на адрес 192.168.4.24:

ssh dave@192.168.4.24

Его соединение принято, он вводит свой пароль, и его удаленный сеанс начинается. Его командная строка меняется с dave@nostromo на dave@howtogeek. Чтобы выйти из удаленного компьютера, он набирает:

exit

Его командная строка возвращается на его локальный компьютер. Он использует knock еще раз, и на этот раз он нацелен на порты в обратном порядке, чтобы закрыть порт SSH на удаленном компьютере.

knock 192.168.4.24 9000 8000 7000 -d 500

По общему признанию, это была не особенно плодотворная удаленная сессия, но она демонстрирует открытие и закрытие порта с помощью стука по порту и умещается на одном скриншоте.

Итак, как это выглядело с другой стороны? Системный администратор на хосте, подключающем порты, использует следующую команду для просмотра новых записей, поступающих в системный журнал:

tail -f /var/log/syslog

  • Вы видите три записи openSSH. Они возникают, когда утилита удаленного нокаутирования использует каждый порт.
  • При выполнении всех трех этапов триггерной последовательности в журнал заносится запись «ОТКРЫТЬ СЕЗАМ».
  • Отправлена команда для вставки правила в список правил iptables. Он разрешает доступ через SSH к порту 22 с определенного IP-адреса ПК, который дал правильный секретный стук (192.168.4.23).
  • Пользователь dave подключается только на несколько секунд, а затем отключается.
  • Вы видите три записи closeSSH. Они возникают, когда утилита удаленного детонирования нацелена на каждый порт — она сообщает хосту, детонирующему порты, закрыть порт 22.
  • После срабатывания всех трех этапов мы снова получаем сообщение «ОТКРОЙ СЕЗАМ». На брандмауэр отправляется команда для удаления правила. (Почему не ЗАКРЫТЬ СЕЗАМ при закрытии порта? Кто знает?)

Теперь единственное правило в списке правил iptables, касающееся порта 22, — это то, которое мы ввели в начале, чтобы закрыть этот порт. Итак, порт 22 снова закрыт.

Ударь по голове

Это салонный трюк со стуком в порт. Относитесь к этому как к отвлечению внимания и не делайте этого в реальном мире. Или, если необходимо, не полагайтесь на него как на единственную форму безопасности.