Hlavní navigace

Single Packet Authorization aneb jeden paket vládne všem

15. 1. 2010
Doba čtení: 5 minut

Sdílet

Před časem jsme na Rootu psali o tom, jak funguje takzvaný port knocking. To je bezpečnostní technika, která je velmi dobře použitelná, ale má i některé podstatné nevýhody. Dnes si ukážeme Single Packet Authorization, která vás představí serveru jedním jediným paketem. Dobrý den, tady uživatel!

Rekapitulace aneb klasické klepání

V září loňského roku jsme v článku Port knocking: zaklepejte na svůj server psali o metodě zvané port knocking. Ta vylepšuje bezpečnost serveru tím, že dovoluje ukrýt některé potenciálně napadnutelné porty před zraky zvědavců. Tyto porty jsou pak speciální technikou otevírány jen oprávněným uživatelům.

Všechny techniky z této kategorie neslouží jako samostatná ochrana, ale fungují jako další obranný val. Pokud jej kdokoliv neoprávněný překoná, stále má před sebou klasické metody autentizace a další bezpečnostní mechanismy. Pokud ale o portech vůbec neví, nemůže zkoušet různé exploity nebo 0day útoky.

Po nasazení port knockingu jsou porty uzavřeny za firewallem, který sleduje provoz z venčí. Klient pak generuje určitou sekvenci paketů, kterou odešle na správné porty serveru. Pokud server pozná, že z jednoho počítače přichází správná sekvence paketů na správné porty, povolí mu přístup k portu nebo portům, které jsou jinak chráněny. Pak teprve je možné se například připojit k SSH.

Nevýhody klasického port knockingu

Problémem tradičního postupu je především to, že je možné jej jednoduše odhalit a odposlechnout. Pokud bude někdo monitorovat provoz na naší síti, rychle zjistí, že si otevíráme porty a objeví také naši klepací sekvenci. Ve výše zmíněném článku jsme okrajově zmínili také šifrovaný port knocking. Ten vylepšuje standardní metodu tím, že pomocí vyklepávání dlouhé sekvence na různé porty odesílá zašifrované přihlašovací informace.

To bohužel přináší další problémy, neboť je možné najednou předat maximálně dva bajty, protože máme k dispozici jen 65536 různých portů, na které můžeme posílat pakety. Zaslání takové sekvence tedy může být poměrně zdlouhavé a musíme server zahltit poměrně velkým množstvím paketů. To na dnešních rychlých linkách nemusí být problém, ale rozhodně se nejedná o čisté řešení.

Navíc při takovém množství paketů se může lehce stát, že dojde k výpadku nebo pakety dorazí v jiném pořadí a protože server nemá možnost žádným způsobem na tyto problémy zareagovat, mohou být naše pokusy o přihlašování neúspěšné. Navíc nás velmi jednoduše může kdokoliv blokovat tím, že bude prostě do naší sekvence vstupovat s náhodnými pakety s falešnou IP adresou. Tím nám úplně zablokuje přístup k serveru.

Řešením je SPA

O výše zmíněných problémech se samozřejmě obecně ví a existují různé metody, jak některé z nich tlumit. Většina z nich ale stále přetrvává. Proto byl před několika lety vymyšlen protokol SPA neboli Single Packet Authorization, což v překladu znamená „autorizace jedním paketem“.

Samotná architektura port knockingu a SPA je podobná. Opět existuje server s firewallem, který standardně zavírá některé porty. Server znovu pasivně monitoruje provoz na síti a sleduje, co se za firewallem děje. Klient si také otevírá dveře pomocí zasílání informace na „hluchý“ server. Tím ale veškerá podobnost končí.

SPA totiž přesouvá celou komunikaci tam, kam standardně patří – totiž na aplikační vrstvu. V tomto případě se pracuje s celým paketem, který je obvykle omezen protokolem Ethernet na 1500 bajtů.

Co se posílá?

Podoba paketu je poměrně přesně určená, obsahuje sedm samostatných částí, které jsou od sebe odděleny dvojtečkou. Jednotlivé části jsou: 16 bajtů náhodných dat, jméno uživatele, časová značka, verze SPA implementace, mód SPA (pokus o přístup nebo příkaz), samotný text obsahující přístupová data nebo příkaz a nakonec MD5 kontrolní součet. Většina těchto částí má proměnlivou délku.

Jakmile je tímto způsobem paket sestaven, je zašifrován jednou ze dvou různých metod: symetrickou blokovou šifrou Rijndael se 128 bitovým klíčem nebo asymetrickým algoritmem ElGamal s 2048bitovými klíči generovanými pomocí GnuPG. Tím jsme připraveni se autorizovat. Celý paket je následně klientem odeslán na server, standardně na jeho UDP port 62201. Port je samozřejmě možno libovolně měnit.

Jaké jsou výhody?

Kromě toho, že nám k otevření portů stačí jediný paket, řeší SPA také možnost odposlechu a opakování sekvence pro jiný počítač. Hlavním bezpečnostním mechanismem je zde už zmíněných 16 náhodných bajtů, které jsou součástí každého zašifrovaného paketu. I kdyby byly všechny informace v paketu posílány několikrát za sebou, vždy se bude paket lišit o tato náhodná data. Server si podobu paketu hlídá a kdyby dorazil úplně stejný paket znovu, bude jej považovat za podvrh a bude jej ignorovat.

Výhodou SPA serveru je také to, že dokáže otevřít různé typy přístupů různým uživatelům. Proto jsou součástí paketu také uživatelské informace. Podle nich je po přijetí paketů rozhodnuto, které porty budou uživateli otevřeny. Vše může být ještě rozlišeno pomocí příkazů, takže klient může přímo požádat server o otevření konkrétního portu. Pokud má dostatečná oprávnění, SPA server požadavek vyřídí a příkaz provede.

Jak to implementovat v praxi?

Pokud chcete SPA implementovat, je třeba využít projektu fwknop, jehož balíčky se nacházejí v běžných repositářích distribucí. Je i součástí Debianu, kde naleznete dva balíčky fwknop-clien a fwknop-server.

Na serveru je konfigurace uložena v souboru /etc/fwknop/fwknop.conf. Nejdůležitějšími konfiguračními položkami jsou EMAIL_ADDRESS, HOSTNAME a KEY. Na vyplněný mail jsou odesílány různé informace týkající se provozu SPA serveru, včetně chybových hlášek. Jméno udává název SPA serveru a konečně klíč slouží k uložení klíče užívaného pro autorizaci k serveru. Klíč by měl být samozřejmě co nejdelší a pokud možno náhodný.

Pokud server nakonfigurujete a spustíte, měli byste pomocí firewallu (viz iptables) uzavřít citlivé porty, které chcete pomocí SPA chránit. Poté už se stačí z klienta připojit k serveru:

$ fwknop -A tcp/22 -D 12.12.13.14 -a 5.5.6.6

Tento příkaz osloví server 12.12.13.14 a požádá ho o otevření portu 22 (SSH) pro stroj 5.5.6.6. Klient se poté zeptá na klíč, který je nastaven na serveru:

root_podpora

[+] Starting fwknop client.
[+] Enter an encryption key. This key must match a key in the file
/etc/fwknop/access.conf on the remote system.

Encryption Key:

Pokud zadáte klíč, dozvíte se informace, které bude klient posílat serveru:

[+] Building encrypted single-packet authorization (SPA) message...
[+] Packet fields:

Random data: 4385401308094834
Username: root
Timestamp: 1120483943
Version: 1.8.2
Action: 1 (access mode)
Access: 5.5.6.6,tcp/22
MD5 sum: be132eade6f7546b6e136366d323e30e
[+] Sending 171 byte message to 12.12.13.14 over udp/62201.

Pokud se autorizace podařila, máte standardně 30 sekund, abyste se přihlásili ke zvolenému portu. Pokud to stihnete, spojení se pak normálně udrží a vy můžete pracovat. Pokud nechcete používat symetrickou šifru se sdíleným klíčem, můžete sáhnout po GnuPG a můžete se autorizovat vlastními klíči. Více informací k využití GnuPG pak naleznete v manuálové stránce.

Další odkazy

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.