Port Knocking (почукване на портове) – метод за разрешаване на достъп до портове (услуги, приложения), които по подразбиране са забранени в защитната стена. Целта на метода е реализиране на допълнително ниво на защита на портове, за които това е подходящо като SSH, RDP, L3 VPN и др. Обикновено достъпът се разрешава след изпълнение на строга последователност от връзки към портове и/или протоколи. Най-често се използват TCP и UDP, но е възможно изпълнение на метода както чрез протоколи от по-ниско ниво от транспортното, така и на по-високо – на пр. L7 (Layer 7 – Приложен слой).
Основни предимства на „почукването на портове“ са:
- Повишаване на сигурността на определени услуги
- Автентикация чрез ресурсите на защитната стена
- Временно установяване на връзка през затворени портове
- Голяма динамика и богата вариативност
- Липса на механизъм за проверка на това дали „почукването на портове“ е внедрено и др.
В MikroTik RouterOS „Port Knocking“ се реализира чрез специфични правила в защитната стена (IP / Firewall / Filter). За изпълнение на конфигурация, която да работи, се изисква познаването и на адресни списъци (address-list) и познаване на действието add-src-to-address-list във Filter. За по-високо ниво на защита е възможно прилагане на L7 Firewall.
Всяко правило в защитната стена на RouterOS се състои от две части: условие и действие (matcher и action). Условията са разпределени в табовете General, Advanced и Extra. Многообразието на условията позволява „почукване на портове“ на различни нива според OSI модела.
Да разгледаме няколко сценария за изпълнение на „Port Knocking“.
L4 Port Knocking
Да приемем, че се налага защита чрез „Port Knocking“ на следните услуги в нашия RouterOS: WebFig, WinBox и SSH. За изпълнение на метода ще използваме 2 TCP порта и 1 UDP и възможността за динамично добавяне в адресни списъци.
Услугите са на самия рутер, поради което ще използваме веригата Input във IP / Firewall / Filter:
- Преди правилата за „Port Knocking“ е важно приемане на established и related връзките за веригата Input (в нашия случай). Липсата на такова правило ще прекрати достъпа до услугите след 1 мин. при успешен „Port Knocking“ (според последното правило, което съдържа address-list-timeout=1m)
- При заявка на TCP порт 62521 ще се добави IP адреса на подателя в адресен списък с име „Port 62521 List“ за 10 сек.
- При заявка на UDP порт 9851 ще се провери дали IP адресът на подателя е в списъка „Port 62521 List“ и ако отговорът е да, то IP адреса ще се добави в списък с име „Port 9851 List“ за 10 сек.
- При заявка на TCP порт 29819 ще се провери дали IP адресът на подателя е в списъка „Port 9851 List“ и ако отговорът е да, то той ще се добави с списък с име „Port 29819 List“ за 1 мин.
- След това ще забраним достъпа до TCP портове 80,8291,22 (стандартните портове за услугите WebFig, WinBox и SSH в RouterOS) за всичко, с изключение на участниците в адресен списък с име „Port 29819 List“.
/ip firewall filter add chain=input comment="Accept established & related connections for Input" connection-state=established,related add action=add-src-to-address-list address-list="Port 62521 List" address-list-timeout=10s chain=input comment="If connection on 62521/TCP - add to address list Port 62521 List for 10 sec." dst-port=62521 protocol=tcp add action=add-src-to-address-list address-list="Port 9851 List" address-list-timeout=10s chain=input comment="If connection on 9851/UDP - add to address list Port 9851 List for 10 sec." dst-port=9851 protocol=udp src-address-list="Port 62521 List" add action=add-src-to-address-list address-list="Port 29819 List" address-list-timeout=1m chain=input comment="If connection on 29819/TCP - add to address list Port 29819 List for 60 sec." dst-port=29819 protocol=tcp src-address-list="Port 9851 List" add action=drop chain=input comment="Drop all HTTP, WinBox & SSH except address list Port 29819" dst-port=80,8291,22 protocol=tcp src-address-list="!Port 29819 List"
Конфигурацията може да варира, като зависи изцяло от предпочитанията на мрежовия администратор. Препоръчително е използване на две, три или повече правила, както и използване не само на TCP, или само на UDP портове, но на различни комбинации, както е описано в горния пример. Използването само на TCP улеснява „почукването“ от страна на клиента, т.к. може да бъде използван само уеб браузър (HTTP използва за транспортен протокол TCP), но намалява сигурността. Посоченият по-горе пример е по-сложен. За да получим достъп до услугите (WebFig, WinBox и SSH) е необходимо да направим връзка последователно към 62521/TCP, 9851/UDP и 29819/TCP и след това в рамките на 1 мин. да влезем в някоя от услугите.
За да извършим това се налага да използваме CLI приложения като: PortQryV2.exe, Knock (Cygwin/Win32 Knock Client) или графични като GregSowell.com Port Knock.
Примери за почукване чрез PortQryV2 и Knock:
- PortQry -n 192.168.137.147 -o 62521,9851,29819 -p both
- knock 192.168.137.147 62521:tcp 9851:udp 29819:tcp
Пример за почукване чрез Windows GregSowell.com Port Knock може да видите на фиг. 1.
L4 + L3 Port Knocking
Port Knocking в RouterOS може да се реализира чрез протоколи от транспортния и мрежовия слой. Пример за използване на 2 TCP (L4) порта и ICMP (L3) протокола.
/ip firewall filter add action=add-src-to-address-list address-list="Port 62521 List" address-list-timeout=1m chain=input comment="If connection on 62521/TCP - add to address list Port 62521 List for 60 sec." dst-port=62521 protocol=tcp add action=add-src-to-address-list address-list="ICMP+9851 List" address-list-timeout=1m chain=input comment="If ICMP - add to address list ICMP+9851 List for 60 sec." protocol=icmp src-address-list="Port 62521 List" add action=add-src-to-address-list address-list="Port 29819 List" address-list-timeout=1m chain=input comment="If connection on 29819/TCP - add to address list Port 29819 List for 60 sec." dst-port=29819 protocol=tcp src-address-list="ICMP+9851 List" add action=drop chain=input comment="Drop all HTTP, WinBox & SSH except address list Port 29819" dst-port=80,8291,22 protocol=tcp src-address-list="!Port 29819 List"
Посочените по-горе приложения за автоматизиране на „почукването“ от клиента не разполагат с опция за изпращане на ICMP заявки – ограничени са до TCP и UDP връзки. Използването на други протоколи изисква ръчно изпълнение или допълнителни средства за автоматизация (създаване на собствени скриптове).
L4/L3 Port Knocking + L7 Firewall
MikroTik RouterOS разполага с L7 Firewall, който позволява търсене на съответствие не само в хедърите, но и в самите данни за всички слоеве на OSI модела. Освен това данни могат да се изпращат и в UDP хедъра, в незадължителното поле data.
- При заявка на TCP порт 62521 ще се добави IP адреса на подателя в адресен списък с име „Port 62521 List“ за 60 сек.
- При заявка на UDP порт 9851 ще се провери дали IP адресът на подателя е в списъка „Port 62521 List“ и дали полето data в UDP хедъра съдържа думата „tainaduma“. Ако отговорът е да и за двете условия, то IP адресът на подателя ще се добави в списък с име „Port 29819 List“ за 60 сек.
- След това ще забраним достъпа до TCP портове 80,8291,22 за всички с изключение на участниците в адресен списък с име „Port 29819 List „.
/ip firewall layer7-protocol add name="Port 29819" regexp="^tainaduma\$" /ip firewall filter add action=add-src-to-address-list address-list="Port 62521 List" address-list-timeout=1m chain=input comment="If connection on 62521/TCP - add to address list Port 62521 List for 60 sec." dst-port=62521 protocol=tcp add action=add-src-to-address-list address-list="Port 29819 List" address-list-timeout=1m chain=input comment="If connection on 29819/TCP & L7 ckeck ok - add to address list Port 29819 List for 60 sec." dst-port=29819 layer7-protocol="Port 29819" protocol=udp src-address-list="Port 62521 List" add action=drop chain=input comment="Drop all HTTP, WinBox & SSH except address list Port 29819" dst-port=80,8291,22 protocol=tcp src-address-list="!Port 62521 List"
Пример за почукване с изпращане на данни в UDP хедъра чрез Windows GregSowell.com Port Knock може да видите на фиг. 2.
Могат да бъдат представени множество други примери за техническа реализация на Port Knocking в RouterOS чрез присвояване стойности на други условия в IP / Firewall / Filter. Представените два примера представят добре концепцията – останалото зависи от вашето въображение.
Добри практики и препоръки
- Никога не започвайте правилата си с ICMP, т.к. редица приложения за сканиране на портове първо изпращат ICMP съобщение за проверка на хоста (PING J)
- Задължително приемайте връзките от типове established и related преди забраняващото правило. В противен случай ще имате връзка, но само за определено време – това зададено при последния адресен списък
- Не имплементирайте директно готови примери от Интернет – сменяйте поне номерата на портовете
- Направете сложни правила (комбинирайте TCP и UDP) и автоматизирайте „почукването“ по най-удобния за вас начин: чрез графични приложения, напишете скриптове и др.
- Ако „Port Knocking“ ви харесва – не отлагайте имплементирането му – ботовете няма да отлагат своите атаки
- Не използвайте L7 Firewall в първото ви правило или във всички правила – не е необходимо да анализирате всички пакети, а само тези, които вече отговарят на дадени критерии
Полезни връзки по темата
- Port knocking – Wikipedia, the free encyclopedia
- PORTKNOCKING – A system for stealthy authentication across closed ports
- Port Knocking – MikroTik Wiki
- Port Knocking for Security – MUM – MikroTik
- MikroTik Firewall : Securing your Router with Port Knocking
- Mikrotik – Port Knocking
- Windows Port Knock Application | Greg Sowell Consulting