Як використовувати Port Knocking в Linux (і чому не слід)

Перекриття портів — це спосіб захистити сервер, закривши порти брандмауера — навіть ті, про які ви знаєте, що будуть використовуватися. Ці порти відкриваються на вимогу, і тільки тоді, коли запит на з’єднання забезпечує секретний стук.

Стук у порт — це «таємний стук»

У 1920-х роках, коли заборона було в самому розпалі, якщо ви хотіли потрапити в а спокійно, Ви повинні були знати секретний стук і правильно вистукнути його, щоб потрапити всередину.

Port knocking — сучасний еквівалент. Якщо ви хочете, щоб люди мали доступ до служб на вашому комп’ютері, але не хочете відкривати свій брандмауер для доступу до Інтернету, ви можете використовувати перебір портів. Це дозволяє вам закрити порти на вашому брандмауері, які дозволяють вхідні з’єднання, і відкривати їх автоматично, коли зроблено заздалегідь визначений шаблон спроб підключення. Як секретний стук виступає послідовність спроб підключення. Ще один таємний стук закриває порт.

Стукання портів – це щось на кшталт новинки, але важливо знати, що це приклад безпека через невідомість, і ця концепція в корені хибна. Секрет доступу до системи безпечний, тому що про нього знають лише ті, хто входить до певної групи. Але як тільки ця таємниця розкривається — чи то тому, що її розкрили, спостерігали, здогадалися чи розгадали — ваша безпека втрачає силу. Вам краще захистити свій сервер іншими, більш надійними способами, наприклад, вимагати входу на основі ключа для сервера SSH.

Найнадійніші підходи до кібербезпеки є багаторівневими, тому, можливо, одним із цих рівнів має бути збій портів. Чим більше шарів, тим краще, чи не так? Однак ви можете стверджувати, що стукіт портів не додає багато (якщо взагалі є) до належним чином загартованої, безпечної системи.

Кібербезпека – це обширна і складна тема, але ви не повинні використовувати перебір портів як єдину форму захисту.

Установка knockd

Щоб продемонструвати стукіт порту, ми збираємося використовувати його для керування портом 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.

  Як підключити зовнішні жорсткі диски в Linux

Якщо хтось підключений через SSH, коли ми надаємо цю команду, ми не хочемо, щоб він був відрізаний:

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

Ця команда додає до брандмауера правило, яке говорить:

-A: Додати правило до таблиці правил брандмауера. Тобто додайте його на дно.
INPUT: Це правило щодо вхідних підключень.
-m conntrack: правила брандмауера діють на мережевий трафік (пакети), які відповідають критеріям правила. Параметр -m змушує iptables використовувати додаткові модулі узгодження пакетів — у цьому випадку той, який називається conntrack, працює з можливостями ядра відстеження мережевих з’єднань.
–cstate ESTABLISHED,RELATED: Це вказує тип підключення, до якого застосовуватиметься правило, а саме ВСТАНОВЛЕНІ та ПОВ’ЯЗАНІ з’єднання. Встановлене з’єднання – це з’єднання, яке вже виконується. Пов’язане з’єднання – це з’єднання, яке створено внаслідок дії встановленого з’єднання. Можливо, хтось підключений хоче завантажити файл; це може статися через нове підключення, ініційоване хостом.
-j ПРИЙНЯТИ: якщо трафік відповідає правилу, перейдіть до цілі ACCEPT у брандмауері. Іншими словами, трафік приймається і пропускається через брандмауер.

Тепер ми можемо видати команду, щоб закрити порт:

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

Ця команда додає до брандмауера правило, яке говорить:

-A: Додайте правило до таблиці правил брандмауера, тобто додайте його внизу.
INPUT: Це правило стосується вхідних підключень.
-p tcp: це правило застосовується до трафіку, який використовує протокол керування передачею.
–dport 22: це правило стосується саме TCP-трафіку, який націлений на порт 22 (порт SSH).
-j ВІДМІНИТИ: якщо трафік відповідає правилу, перейдіть до цілі ВІДМІНИТИ у брандмауері. Отже, якщо трафік відхилено, він не дозволений через брандмауер.

Ми повинні запустити демон netfilter-persistent. Ми можемо зробити це за допомогою цієї команди:

sudo systemctl start netfilter-persistent

Ми хочемо, щоб netfilter-persistent проходив цикл збереження та перезавантаження, тому він завантажує та контролює правила iptable.

Введіть такі команди:

sudo netfilter-persistent save

sudo netfilter-persistent reload

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

Налаштування knockd

Для налаштування knockd ви редагуєте два файли. Перший – це такий файл конфігурації knockd:

sudo gedit /etc/knockd.conf

Відкриється редактор gedit із завантаженим файлом конфігурації knockd.

Ми відредагуємо цей файл відповідно до наших потреб. Нас цікавлять розділи «openSSH» і «closeSSH». У кожному розділі є такі чотири записи:

послідовність: послідовність портів, до яких хтось має отримати доступ, щоб відкрити або закрити порт 22. За замовчуванням порти 7000, 8000 і 9000 для його відкриття та 9000, 8000 і 7000 для його закриття. Ви можете змінити ці порти або додати більше портів до списку. Для наших цілей ми будемо дотримуватися значень за замовчуванням.
seq_timeout: період часу, протягом якого хтось має отримати доступ до портів, щоб ініціювати їх відкриття або закриття.
команда: команда, що надсилається брандмауеру iptables, коли запускається дію відкриття або закриття. Ці команди або додають правило до брандмауера (щоб відкрити порт), або видаляти його (щоб закрити порт).
tcpflags: тип пакета, який кожен порт повинен отримати в секретній послідовності. Пакет SYN (синхронізації) є першим в a TCP запит на підключення, який називається a тристороннє рукостискання.

  8 чудових безкоштовних ігор для Linux, які ви повинні спробувати

Розділ «openSSH» можна прочитати як «запит на з’єднання TCP потрібно зробити до портів 7000, 8000 і 9000 — у такому порядку та протягом 5 секунд — щоб команда на відкриття порту 22 була надіслана брандмауеру».

Розділ «closeSSH» можна прочитати як «запит на з’єднання TCP потрібно зробити до портів 9000, 8000 і 7000 — у такому порядку та протягом 5 секунд — щоб команда на закриття порту 22 була надіслана брандмауеру».

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

Записи «команди» в розділах openSSH і closeSSH залишаються незмінними, за винятком одного параметра. Ось як вони складаються:

-A: додайте правило в нижню частину списку правил брандмауера (для команди openSSH).
-D: видалити команду зі списку правил брандмауера (для команди closeSSH).
INPUT: Це правило стосується вхідного мережевого трафіку.
-s %IP%: IP-адреса пристрою, який запитує підключення.
-p: мережевий протокол; в даному випадку це TCP.
–dport: порт призначення; у нашому прикладі це порт 22.
-j ПРИЙНЯТИ: Перехід до цільового призначення у брандмауері. Іншими словами, дозвольте пакету пройти через решту правил, не діючи на них.

Редагування файлу конфігурації knockd

Зміни, які ми внесемо у файл, виділені червоним кольором нижче:

Ми подовжуємо «seq_timeout» до 15 секунд. Це щедро, але якщо хтось вручну запускає запити на з’єднання, йому може знадобитися стільки часу.

У розділі «openSSH» ми змінюємо параметр -A (додати) у команді на -I (вставити). Ця команда вставляє нове правило брандмауера вгору списку правил брандмауера. Якщо ви залишите параметр -A, він додасть список правил брандмауера та помістить його внизу.

Вхідний трафік перевіряється на відповідність кожному правилу брандмауера в списку зверху вниз. У нас уже є правило, яке закриває порт 22. Отже, якщо вхідний трафік перевіряється на відповідність цьому правилу, перш ніж він побачить правило, яке дозволяє трафік, підключення відмовляється; якщо він перший бачить це нове правило, підключення дозволено.

Команда close видаляє правило, додане openSSH, із правил брандмауера. Трафік SSH знову обробляється існуючим правилом «порт 22 закритий».

Після внесення цих змін збережіть файл конфігурації.

Редагування файлу керування knockd

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

ip addr

The

З’єднання, яке ця машина використовує для дослідження цієї статті, називається enp0s3. Запишіть назву свого підключення.

Наступна команда редагує файл керування knockd:

sudo gedit /etc/default/knockd

Ось файл knockd у gedit.

Кілька змін, які нам потрібно внести, виділені червоним кольором:

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

Ми також видалили хеш # із початку запису «KNOCKD_OPTS=» і замінили «eth1» на назву нашого мережевого підключення, enp0s3. Звичайно, якщо ваше мережеве з’єднання eth1, ви не змінюватимете його.

  Чому Desktop Linux все ще має значення

Доказ у пудингу

Настав час перевірити, чи це спрацює. Ми запустимо демон knockd за допомогою цієї команди:

sudo systemctrl start knockd

Тепер ми перейдемо до іншої машини та спробуємо підключитися. Ми також встановили інструмент knockd на цьому комп’ютері не тому, що ми хочемо налаштувати стукування портів, а тому, що пакет knockd містить інший інструмент, який називається knock. Ми будемо використовувати цю машину, щоб стріляти в нашій секретній послідовності і стукати за нас.

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

knock 192.168.4.24 7000 8000 9000 -d 500

Це вказує націлити комп’ютер на IP-адресу 192.168.4.24 і запустити запит на підключення до портів 7000, 8000 і 9000, у свою чергу, із затримкою a -d (затримка) між ними 500 мілісекунд.

Потім користувач під назвою «dave» робить запит SSH до 192.168.4.24:

ssh [email protected]

Його підключення прийнято, він вводить свій пароль, і починається його віддалений сеанс. Його командний рядок змінюється з [email protected] до [email protected] Щоб вийти з віддаленого комп’ютера, він вводить:

exit

Його командний рядок повертається на локальний комп’ютер. Він знову використовує knock, і цього разу він націлює порти в зворотному порядку, щоб закрити порт SSH на віддаленому комп’ютері.

knock 192.168.4.24 9000 8000 7000 -d 500

Правда, це не було особливо плідним віддаленим сеансом, але він демонструє відкриття та закриття порту через стукіт порту та поміщається на одному знімку екрана.

Отже, як це виглядало з іншого боку? Системний адміністратор на хості, який перекриває порти, використовує таку команду, щоб переглянути нові записи, які надходять у системний журнал:

tail -f /var/log/syslog

Ви бачите три записи openSSH. Вони підвищуються, коли кожен порт націлений на віддалену утиліту knock.
Коли всі три етапи тригерної послідовності виконані, з’являється запис із написом «ВІДКРИТИ СЕЗАМ,” реєструється
Надсилається команда для вставки правила в список правил iptables. Він дозволяє отримати доступ через SSH до порту 22 з конкретної IP-адреси ПК, яка дала правильний секретний стук (192.168.4.23).
Користувач «dave» підключається лише на кілька секунд, а потім розривається.
Ви бачите три записи closeSSH. Вони з’являються, коли кожен порт націлений на віддалену утиліту knock — вона повідомляє хосту, який перекриває порт, закрити порт 22.
Після запуску всіх трьох етапів ми знову отримуємо повідомлення «ВІДКРИТИ СЕЗАМ». На брандмауер надсилається команда для видалення правила. (Чому б не «ЗАКРИТИ СЕЗАМ», коли він закриває порт? Хто знає?)

Тепер єдине правило у списку правил iptables щодо порту 22 — це те, яке ми ввели на початку, щоб закрити цей порт. Отже, порт 22 тепер знову закритий.

Постукай по голові

Це трюк із салонним стуком у порт. Сприймайте це як відволікання і не робіть цього в реальному світі. Або, якщо потрібно, не покладайтеся на це як на єдину форму безпеки.