Как да използвате Port Knocking на Linux (и защо не трябва)

Удрянето на портове е начин да защитите сървър чрез затваряне на портовете на защитната стена – дори тези, за които знаете, че ще бъдат използвани. Тези портове се отварят при поискване, ако — и само ако — заявката за връзка предоставя тайното почукване.

Чукането на порт е „тайно почукване“

През 1920 г., когато забрана беше в разгара си, ако искаш да влезеш в а спокойно, трябваше да знаеш тайното чукане и да го потупаш правилно, за да влезеш вътре.

Пристанището е съвременен еквивалент. Ако искате хората да имат достъп до услугите на вашия компютър, но не искате да отваряте защитната ви стена към интернет, можете да използвате чукване на портове. Позволява ви да затворите портовете на вашата защитна стена, които позволяват входящи връзки и да ги отваряте автоматично, когато се направи предварително уреден модел на опити за свързване. Последователността от опити за свързване действа като тайно почукване. Още едно тайно почукване затваря пристанището.

Чукането на пристанището е нещо като новост, но е важно да знаете, че е пример за това сигурност чрез неизвестност, и тази концепция е фундаментално погрешна. Тайната на това как да получите достъп до система е безопасна, защото само тези от конкретна група я знаят. Но след като тази тайна бъде разкрита – било то защото е разкрита, наблюдавана, отгатна или разкрита – вашата сигурност е невалидна. По-добре е да защитите сървъра си по други, по-силни начини, като например изискване за влизане, базирано на ключ, за 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 порта.

  Как да инсталирате и използвате пощенския клиент Kube на Linux

Ако някой е свързан чрез SSH, когато издадем тази команда, не искаме той да бъде прекъснат:

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

Тази команда добавя правило към защитната стена, което гласи:

-О: Добавяне на правилото към таблицата с правила на защитната стена. Тоест добавете го на дъното.
INPUT: Това е правило за входящи връзки.
-m conntrack: Правилата на защитната стена действат върху мрежовия трафик (пакети), които отговарят на критериите в правилото. Параметърът -m кара iptables да използва допълнителни модули за съвпадение на пакети – в този случай този, наречен conntrack, работи с възможностите за проследяване на мрежовата връзка на ядрото.
–cstate ESTABLISHED,RELATED: Това посочва типа връзка, към която ще се прилага правилото, а именно ESTABLISHED и RELATED връзки. Установена връзка е тази, която вече е в ход. Свързана връзка е тази, която е направена поради действие от установена връзка. Може би някой, който е свързан, иска да изтегли файл; това може да се случи при нова връзка, инициирана от хоста.
-j ACCEPT: Ако трафикът съответства на правилото, преминете към целта ACCEPT в защитната стена. С други думи, трафикът се приема и позволява да премине през защитната стена.

Сега можем да издадем командата за затваряне на порта:

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

Тази команда добавя правило към защитната стена, което гласи:

-О: Добавете правилото към таблицата с правила на защитната стена, т.е. добавете го в долната част.
ВХОД: Това правило се отнася за входящи връзки.
-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 тристранно ръкостискане.

  Как да изчистите метаданни от файлове в Linux

Разделът „openSSH“ може да се чете като „трябва да се направи заявка за TCP връзка към портове 7000, 8000 и 9000 – в този ред и в рамките на 5 секунди – за да бъде изпратена командата за отваряне на порт 22 до защитната стена.

Разделът „closeSSH“ може да се чете като „трябва да се направи заявка за TCP връзка към портове 9000, 8000 и 7000 – в този ред и в рамките на 5 секунди – за да бъде изпратена командата за затваряне на порт 22 до защитната стена.

Правилата на защитната стена

Записите на „команда“ в секциите openSSH и closeSSH остават същите, с изключение на един параметър. Ето как са съставени:

-О: Добавете правилото в долната част на списъка с правила на защитната стена (за командата openSSH).
-D: Изтрийте командата от списъка с правила на защитната стена (за командата closeSSH).
ВХОД: Това правило се отнася за входящия мрежов трафик.
-s %IP%: IP адресът на устройството, което иска връзка.
-p: Мрежов протокол; в този случай това е TCP.
–dport: Пристанището на местоназначението; в нашия пример това е порт 22.
-j ПРИЕМАНЕ: Преминете към целта за приемане в рамките на защитната стена. С други думи, оставете пакета да премине през останалите правила, без да действате по него.

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

Редакциите, които ще направим във файла, са подчертани в червено по-долу:

Удължаваме „seq_timeout“ до 15 секунди. Това е щедро, но ако някой ръчно задейства заявки за връзка, може да му трябва толкова много време.

В секцията „openSSH“ променяме опцията -A (добавяне) в командата на -I (вмъкване). Тази команда вмъква ново правило за защитна стена в горната част на списъка с правила за защитна стена. Ако оставите опцията -A, тя добавя списъка с правила на защитната стена и го поставя в долната част.

Входящият трафик се тества спрямо всяко правило на защитната стена в списъка отгоре надолу. Вече имаме правило, което затваря порт 22. Така че, ако входящият трафик бъде тестван за това правило, преди да види правилото, което позволява трафика, връзката се отказва; ако първо види това ново правило, връзката е разрешена.

Командата за затваряне премахва правилото, добавено от openSSH от правилата на защитната стена. SSH трафикът отново се обработва от съществуващото правило „порт 22 е затворен“.

След като направите тези редакции, запазете конфигурационния файл.

Редактирането на контролния файл knockd

Контролният файл knockd е съвсем по-опростен. Преди да се потопим и редактираме обаче, трябва да знаем вътрешното име на нашата мрежова връзка; за да го намерите, въведете тази команда:

ip addr

В

Връзката, която тази машина използва за изследване на тази статия, се нарича enp0s3. Запишете името на вашата връзка.

Следната команда редактира контролния файл knockd:

sudo gedit /etc/default/knockd

Ето файла knockd в gedit.

Няколкото редакции, които трябва да направим, са подчертани в червено:

  Как да играете Metro Exodus на Linux

Променихме записа „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, на свой ред, с a -d (закъснение) от 500 милисекунди между тях.

След това потребител, наречен „dave“, прави SSH заявка до 192.168.4.24:

ssh [email protected]

Връзката му е приета, той въвежда паролата си и започва отдалечената му сесия. Неговият команден ред се променя от [email protected] да се [email protected] За да излезете от отдалечения компютър, той въвежда:

exit

Неговият команден ред се връща на неговия локален компютър. Той използва чук още веднъж и този път насочва портовете в обратен ред, за да затвори 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 вече е затворен отново.

Удари го по главата

Това е салонният трик на пристанището. Отнасяйте се към него като към отклонение и не го правете в реалния свят. Или, ако трябва, не разчитайте на него като на единствената си форма на сигурност.