Implementace protokolů IPSec na OS Linux, FreeS/WAN Martin Povolný 1
1 IPSec V úvodní části představím rodinu protokolů IPSec. Dále stručně uvedu FreeS/WAN implementaci IPSec pro OS GNU/Linux, která je šířena pod licencemi GNU GPL a LGPL. Sada protokolů byla navržena s cílem umožnit bezpečnou komunikaci na úrovni IP. IPSec poskytuje tyto služby: autentizaci účastníků komunikace (počítačů), autentizaci jednotlivých paketů, šifrování obsahu komunikace. IPSec tedy může ochránit libovolný protokol běžící nad protokolem IP. Rodina protokolů IPSec se skládá z těchto protokolů: ESP (Encapsulating Security Payload) šifrování a ověřování původu dat. AH (Authentication Header) ověřování původu jednotlivých paketů. IKE (Internet Key Exchange) dohoda o parametrech spojení, výměna klíčů,... IPSec můžeme využít k řadě úkolů, mezi které patří: bezpečné tunelování (tvorba zabezpečených kanálů přes potencionálně nepřátelské sítě), tvorba VPN (virtuálních privátních sítí), road warrior (bezpečný přístup do firemní sítě pro pracovníky v terénu), příležitostné ( opportunictic ) šifrování (automatické šifrování komunikace s těmi systémy, které jsou odpovídajícím způsobem vybaveny). Implementace rodiny protokolů IPSec je komplexní záležitost a uplatní se v ní celá řada kryptografických stavebních bloků: blokové šifrovače: DES, 3DES, AES, CAST, IDEA, Blowfish,..., hašovací funkce (MD5, SHA1, HMAC), protokol Diffie Hellman pro domluvu klíčů, RSA autentizace, nástroje pro práci s certifikáty X.509. 2
Avšak implementace IPSec nemusí podporovat všechny možnosti a funkce popsané na http://www.ietf.org/html.charters/ipsec-charter.html. Například z blokových šifrovačů je povinně vyžadován jen DES. FreeS/WAN implementuje protokoly ESP a AH na úrovni jádra částí nazvanou KLIPS a protokol IKE, nastavení směrování a další podpůrné služby prostřednictvím démonu Pluto. FreeS/WAN má řadu omezení, která se projeví zejména při komunikaci s implementacemi IPSec jiných dodavatelů. FreeS/WAN například neumožňuje šifrování pomocí DES (přestože je vyžadováno pro minimální implementace IPSec) s odůvodněním, že bloková šifra DES není dostatečně bezpečná. Dále nepodporuje agresivní mód domluvy parametrů spojení který naopak implicitně používají MS Windows 2000. Detailní informace o kompatibilitě FreeS/WAN s dalšími implementacemi jsou k dispozici na stránkách http://www.freeswan.org. 2 Postup instalace na Debian GNU/Linux V této části popíši instalaci FreeS/WAN tak, jak jsem ji provedl. Na jiných distribucích OS Linux, ale i v jednotlivých verzích a větvích distribuce Debian GNU/Linux se tento postup bude lišit. Protože na své pracovní stanici používám větev testing a v době mých testů nebyl FreeS/WAN v této větvi přítomen, musel jsem nejprve upravit konfiguraci zdrojů software pro instalaci. To provedeme následovně: 1. Do souboru /etc/apt/sources.list doplníme adresy pro větev unstable. 2. V souboru /etc/apt/preferences nastavíme nízkou prioritu unstable větve. (Chceme implicitně instalovat verzi testing kromě balíčků, které ve verzi testing neexistují, nebo těch, kde si verzi unstable explicitně vyžádáme.) Package: * Pin: release a=unstable Pin-Priority: 50 Obdobný postup můžete použít, pokud budete chtít použít čerstvou verzi FreeS/WAN na starší distribuci. Následně přistoupíme k instalaci balíčků: 1. Nainstalujeme záplaty (patche) na jádro OS Linux příkazem: apt-get install kernel-patch-freeswan. Tento balíček obsahuje nejen oficiální záplatu z http://www.freeswan.org, ale i řadu dalších, které umožňují například použití X.509 certifikátů nebo šifrovače AES. Balíček se nainstaluje do adresáře /usr/src/kernel-patches/. 2. Dále instalujeme zdroje jádra: apt-get install kernel-source-2.4.18. 3. Rozbalíme zdrojové kódy jádra: cd /usr/src/;tar xvfj kernel-source-2.4.18.tar.bz2. 3
4. Pomocí nástrojů projektu Debian jádro přeložíme a vytvoříme balíček: cd /usr/src/kernel-source-2.4.18 PATCH THE KERNEL=YES make-kpkg --config=menuconfig --revision=ipsec1 kernel image Poslední příkaz říká, že chceme před překladem aplikovat záplaty (viz. krok 1.), že chceme použít pro konfiguraci jádra variantu menuconfig a že revize balíčku s jádrem má mít jméno ipsec1. Před tímto krokem může být ještě vhodné nakopírovat si konfiguraci jádra, které už na systému běží a ulehčit si tak práci s ručním nastavováním všech voleb. To provedeme například: cp /boot/config-2.4.18 /usr/src/kernel-source-2.4.18/.config. Pokud chceme změnit konfiguraci IPSec v jádře, nalezneme ji v menu pod: Networking options IP Security Protocol.... 5. Dalším krokem je instalace vytvořeného jádra dpkg -i../kernel-image-2.4.18-ipsec1.deb. 6. Kromě záplaty do jádra se FreeS/WAN skládá ještě z řady obslužných programů, konfiguračních souborů, dokumentace,.... Ty nainstalujeme příkazem apt-get install freeswan. Instalační skripty balíčku freeswan nám nejdříve nabídnou možnost vytvoření speciálních souborů/zařízení /dev/ipsec*, a následně i vygenerování páru RSA klíčů, které budou později sloužit k autentizaci našeho stroje. Klíče si můžeme nechat vygenerovat do X.509 certifikátu. Máme možnost nechat si vygenerovat žádost o podepsání certifikátu certifikační autoritou, nebo si klíč podepsat sami. Já jsem při instalaci zvolil vygenerování Plain RSA Key, čímž mi byly jednotlivé komponenty klíče uloženy přehledně textově v šestnástkové soustavě do souboru /etc/ipsec.secrets. 7. Na závěr ještě upravíme nastavení sítě v souboru /etc/network/options: ip forward=no spoofprotect=no syncookies=no 3 Konfigurujeme VPN V této části uvedu příklad konfigurace konkrétní virtuální privátní sítě (VPN). Nejprve je vhodné upravit konfiguraci firewallu. Neuvádím zde konkrétní postup, protože pro konfiguraci firewallu používám program ferm, jehož konfigurace je odlišná od konfigurace přímo prostřednictvím ipchains nebo iptables. Pro funkčnost IPSec budeme potřebovat: povolit přístup na port UDP 500 z portů 500 na strojích s nimiž chceme komunikovat pro použití démonem Pluto, povolit protokol 50 (ESP) popřípadě 51 (AH), v popisovaném nastavení bude stačit ESP. 4
Pokud jsme si při instalaci FreeS/WAN nenechali vygenerovat RSA klíč stroje, můžeme tak učinit nyní příkazem ipsec newhostkey --output /etc/ipsec.secrets, kterým vygenerovaný klíč zároveň uložíme tam, kde ho bude FreeS/WAN čekat. Hlavní konfigurační soubor služby ipsec je /etc/ipsec.conf. V tomto souboru budeme definovat jednotlivé tunely. Účastníci komunikace potřebují pro vzájemnou autentizaci znát veřejné klíče svých partnerů. Klíče můžeme buďto uložit do záznamů DNS nebo uvést přímo v konfiguraci jednotlivých tunelů. Korektní záznam pro umístění veřejného klíče do DNS získáme příkazem ipsec showhostkey, klíče ve formě vhodné pro umístění do konfiguračního souboru získáme příkazy ipsec showhostkey --left a ipsec showhostkey --right. Zároveň si takto ověříme, že máme správně vygenerovaný a nastavený klíč stroje. Nyní budeme konfigurovat naši VPN. Máme dvě pobočky, řekněme Praha a Vyškov. Ve Výškově máme lokální firemní síť 192.168.127.0/24, router s veřejnou IP adresou 143.251.44.16 a vnitřní adresou 192.168.127.1. V Praze máme síť 192.168.128.0/24 a router s adresami 164.144.5.222, respektive 192.168.128.1. 192.168.128.0/24 192.168.128.1 164.144.5.222 internet 143.251.44.16 192.168.127.1 192.168.127.0/24 Z hlediska konfigurace spojení se na Vyškov budeme dívat jako na levou a na Prahu jako na pravou stranu. Nejprve uvádím část konfigurace společnou pro oba uzly: config setup forwardcontrol=yes interfaces=%defaultroute klipsdebug=none plutodebug=none plutoload=%search plutostart=%search uniqueids=yes conn %default keyingtries=0 disablearrivalcheck=no authby=rsasig leftrsasigkey=%dns rightrsasigkey=%dns 5
Následuje část, která je na jednotlivých uzlech rozdílná: conn vpn conn vpn authby=rsasig authby=rsasig # LEFT # LEFT leftsubnet=192.168.127.0/24 leftsubnet=192.168.127.0/24 # RIGHT # RIGHT rightsubnet=192.168.128.0/24 rightsubnet=192.168.128.0/24 # KEYS # KEYS leftrsasigkey=0saqn27o... leftrsasigkey=0saqn27o... rightrsasigkey=0saqphu... rightrsasigkey=0saqphu... Takto jsme vytvořili tunel, kterým bude směrován provoz ze sítě 192.168.127.0/24 do sítě 192.168.128.0/24 a naopak. Aby se tunel vytvořil, je ještě nutné restartovat službu ipsec příkazem /etc/init.d/ipsec restart. Pro účely testování může být naopak vhodnější tunel hned po spuštění služby ipsec nestartovat, nebo ho ani nedefinovat. To provedeme změnou direktivy auto buďto na auto=add, nebo auto=none. V takovém případě nám pro definici a spuštění tunelu budou sloužit příkazy ipsec auto --add vpn a ipsec auto --up vpn, kde vpn je jméno dotyčného tunelu. Každého asi hned napadne vyzkoušet si, jestli tunel funguje, příkazem ping. Bude však nemile překvapen, protože tento postup nebude fungovat. Odchozí pakety budou totiž mít zdrojovou adresu vnějšího rozhraní (tedy mimo chráněnou vnitřní síť), a tudíž je jádro na vstupu do rozhraní ipsec0 zahodí. Řešením může být použití příkazu traceroute, jehož volbou -i interface je možné vybrat rozhraní, jehož adresa má být použita jako zdrojová adresa paketů. Tedy například pro test dostupnosti z levé do pravé větve VPN můžeme použít příkaz traceroute -i eth1 -f 20 192.168.128.26, kde eth1 je rozhraní připojené k firemní (vnitřní) síti. Pokud neznáme adresy strojů v jednotlivých podsítích, poslouží nám například příkaz arp, nebo ping na broadcast adresu (například ping 192.168.128.255. V praxi se však stalo, že příkaz traceroute -i eth1... fungoval z pravé sítě do levé, ale ne naopak, přestože tunelování z vnitřních počítačů fungovalo. Problém byl zřejmě ve verzi programu traceroute. Při reálném nasazení budeme často chtít mít prostřednictvím ipsec možnost přistupovat i z bran do sítí na opačném konci VPN nebo mezi branami navzájem. Jednou z možností by mohlo být použití přepisu zdrojových adres (DNAT ), to by však vyžadovalo použití jádra 2.4.X. Další možností je použít nástroj iproute2. Pro jeho činnost je nutné mít jádro přeložené s volbou Advanced Router. Řešením popsaným na stránkách http://www.freeswan.org je vybudování dalších 3 tunelů: lef tnet rightgw, lef tgw rightgw a lef tgw rightnet. Konfigurace bude následující: 6
conn prahagw-vyskovnet leftsubnet=192.168.127.0/24 conn vyskovgw-prahanet rightsubnet=192.168.128.0/24 conn prahagw-vyskovnet leftsubnet=192.168.127.0/24 conn vyskovgw-prahanet rightsubnet=192.168.128.0/24 conn vyskovgw-prahagw conn vyskovgw-prahagw Nyní tyto tunely můžeme testovat naprosto přímočaře příkazem ping. Uvedl jsem konkrétní příklad konfigurace FreeS/WAN na operačním systému Debian GNU/Linux. Možnosti FreeS/WAN jsou však daleko větší, zajímavé mi například připadá použití příležitostného opportunictic šifrování. Pokud by například jak firemní router, tak i servery umísněné na páteřní síti u poskytovatele připojení poskytující například služby poštovního a www serveru byly vybaveny protokoly IPSec s klíči v DNS nebylo by nutné řešit bezpečnost na úrovni jednotlivých klientských stanic. Dále by pak stačilo každý další počítač firemní infrastruktuky vybavit implementací IPSec, mohla by být velká část komunikace šifrována bez většího úsilí ze strany administrátorů. 7