
CryptoAPI: Jak na IPSEC (I)
V dnešním článku se podíváme na problematiku implementací IPsec v Linuxu a ukážeme si, jak jednoduše pomocí IPsec vytvořit šifrovanou VPN.
IPsec
Šifrování dat se v posledních několika letech stává důležitějším a důležitějším.
Ty tam jsou rané doby, kdy se na šifrování a bezpečnost příliš nehledělo.
Krom aplikací podporující šifrování souborů (PGP) existují i protokoly,
které umožňují šifrovat daný datový kanál (jako jsou např. SSL a TLS;
aby nedocházelo k mýlce, algoritmy používané těmito protokoly či programy
jsou většinou podobné nebo stejné).
Ale ani to nemusí někdy stačit. Občas vyvstane potřeba šifrovat veškerý
síťový provoz mezi dvěma stroji. Nebo rovnou mezi dvěma sítěmi.
A to je právě to, k čemu slouží IPsec. Šifrování probíhá na úrovni protokolu
IP, tudíž pro aplikace a další síťové prvky je zcela transparentní, což je
obrovskou výhodou IPsec.
Historie IPsec
Počátky IPsec se datují do roku 1992, kdy byl zahájen vývoj této sady protokolů.
První implementace se IPsec dočkal v roce 1995 v BSDI. Z téhož roku pochází též
první RFC pojednávající o IPsec (za zmínku stojí např. RFC 1825 -
Security Architecture for the Internet Protocol). Postupně se implementace
IPsec rozšířily do všech dnes běžně používaných operačních systémů. Současná verze
IPsec je popsáná především RFC 2401 - Security Architecture for the Internet
Protocol. Přehled všech RFC týkajících se této problematiky naleznete na
stránkách
IP Security Protocol Working Group
Implementace v Linuxu
V Linuxu nalezneme hned několik implementací IPsec. První z nich je implementace
IPsec používající CryptoAPI, jež je součástí záplaty patch-int
(instalaci této záplaty jsme si popsali v minulém článku). Další velmi dobrou
implementací je FreeS/WAN.
Žádná z těchto implementací ovšem není standardní součástí jádra. Od jádra 2.5.47
je ovšem součástí Linuxu implementace standardu IPsec inspirována (a částečně postavená
na) KAME, což je projekt implementující IPv6
a IPsec pro různé *BSD jádra (např. FreeBSD a OpenBSD).
Za zmínku též stojí, že tato nativní implementace používá CryptoAPI.
Implementace z patch-int
Tato implementace standardu IPsec patří k těm nejsnáze použitelným. Krom aplikace záplaty
patch-int (popř. je tu ještě možnost aplikace samostatné záplaty obsahující jen tuto implementaci IPsec + CryptoAPI)
potřebujeme ještě utilitu ipsecadm. Tu můžeme získat
zde.
Rozbalíme balík:
tar -xzf ipsec_tunnel-0.9.tar.gz
cd ipsec_tunnel-0.9
A spustíme skript configure, který se zeptá na umístění zdrojových
souborů jádra a kam má utilitu nainstalovat. Poté spustíme kompilaci a výsledek
nainstalujeme, tedy tradičně:
./configure
make
make install
Nyní můžeme přistoupit ke konfiguraci IPsec, nejprve si ale povíme něco o teoretické
stránce konfigurace.
Trocha teoreie IPsec
Prvním krokem je vytvoření tzv. bezpečnostních asociací - neboli SA, což je
zkratka vycházející z anglického "Security Associations". Tímto pojmem označujeme
jednosměrné spojení mezi dvěma stroji, jež je identifikováno IP adresami obou
strojů, SPI a použitým protokolem.
SPI ("Security Parametr Index") je ID identifikující danou asociaci
mezi dvěma stroji. Je zde proto, aby bylo možné vytvořit více asociací mezi
dvěma stroji. Tento na první pohled nelogický požadavek má své opodstatnění
v praxi a často ho využijeme.
Oním použitým protokolem může být buď AH ("Authentication Header")
nebo ESP ("Encapsulating Security Payload"). AH hlavička slouží ke kontrole
integrity a auntentičnosti paketu, ESP hlavička je o poznání delší, protože ESP kromě
autentizace implementuje taktéž šifrování dat. V praxi spíše využijeme ESP právě
z důvodu možnosti šifrování obsahu paketů. Tím docílíme toho, že v případě odposlechu
provozu zůstanou data pro útočníka nečitelná.
Oba protokoly (AH a ESP) mohou pracovat ve dvou režimech: transportním
a tunelovém. V transportním režimu probíhá komunikace pouze mezi dvěma stroji.
V tunelovacím režimu se jako data přenáší celé IP pakety, které router obdrží. Jakmile je
router na druhé straně tunelu přijme a dešifruje, tak dešifrované pakety pošle do
sítě dále. Tohoto mechanismu se využívá pro vytvoření šifrovaných VPN sítí
("Virtual Private Network"). Šifrovácí algoritmus může být libovolná symetrická
šifra specifikovaná v SA.
ipsecadm
Tolik tedy k lehkému teoretickému úvodu do IPsec a nyní si ukážeme, jak pracovat
s ipsecadm, což je utilita sloužící ke konfiguraci IPsec v této implementaci.
Před samotným definováním jedntolivých SA pomocí ipsecadm ještě musíme
vygenerovat příslušné klíče. Je třeba vygenerovat celkem dva klíče. První z nich bude
sloužit k autentizaci, druhý k samotnému šifrování.
Autentizace se provádí především pomocí algoritmu HMAC a zvolené hashovací funkce.
Klíč zde neslouží k šifrování, ale je použit spolu s daty při počítání (v němž se
uplatňuje i použitá hashovací funkce; podrobnosti naleznete v RFC 2104) autentizačního
kódu daného paketu. Tím se zaručí, že komunikace skutečně probíhá mezi dvěma určenými
stroji. Krom HMAC se eventuálně ještě může použít některý algoritmus postavený na
použití symetrických šifer (např. DES-MAC), ale tuto možnost ipsecadm
nenabízí.
Ale zpět k ipsecadm, klíč pro auntentizaci můžeme vygenerovat obecně takto:
ipsecadm key create algoritmus
kde, jako algoritmus specifikujeme vybranou hashovací funkci (zvolit doporučuji SHA1,
je bezpečnější než MD5). Parametrem --file=soubor můžeme specifikovat
soubor, do kterého ipsecadm uloží vygenerovaný klíč. Pro jistotu si uvedeme
příklad takového generování:
ipsecadm key create sha1 --file=/etc/ipsec/auth.key
Vygenerování klíče pro šifrování je podobné. Zvolíme algoritmus pro šifrování
(např. AES/Rijndael) a vygenerujeme klíč pomocí
ipsecadm key create generic --file=soubor
a ještě pomocí parametru --bits=délka specifikujeme požadovanou
délku klíče. Pro jistotu si uvedeme příklad pro vygenerování 256 bitového klíče
pro AES(pro jiné algorimy by se postup samožejmě nelišil, maximálně by se lišila
délka klíče):
ipsecadm key create generic --file /etc/ipsec/enc.key --bits=256
Nyní tedy máme vygenerovány klíče a můžeme přistoupit k vytvoření jednotlivých
asociací (SA). Pro provedení tohoto kroku musíme znát jméno symetrické šifry
v CryptoAPI, jejich seznam nalezneme v adresáři /proc/crypto/cipher.
U jmen algoritmů nalezneme různé přípony, jako např. cbc,ecb či
cfb. Jedná se o algoritmy, pomocí
kterých se z jednotlivých zašifrovaných bloků dat sestavují výsledná šifrovaná data.
V ECB (Electronic Code Book) módu jsou jednotlivé bloky skládány za sebe, což má
samozřejmě jistou nevýhodu - dva stejné bloky zdrojových dat budou produkovat
i identické šifrované bloky. Proto se používají techniky jako např. CBC či CFM,
které tento problém více či méně eliminují.
Pro naše účely použijeme algoritmus aes-cfc (jinak řečeno, AES/Rijndael
v CBC módu) a sha1 pro autentizaci. Přídáme asociaci (SA) pomocí příkazu
ipsecadm sa add. Pomocí volby --cipher specifikujeme použitou
symetrickou šifru, volba --cipher-keyfile specifikuje
umístění souboru s klíčem pro šifrování, --digest specifikuje hashovací
funkci, --digest-keyfile určuje umístění klíče pro autentizaci,pomocí
--spi nastavíme SPI dané SA (pro přípomenutí, SPI je ID identifikující
jednotlivé asociace mezi dvěma stroji). Dále můžeme pomocí volby --duplex
zároveň vytvořit i SA pro obrácený směr (čímž si ušetříme práci - znovu přípomínám,
že SA jsou jednosměrné) a nakonec pomocí volby --src nastavíme veřejnou
IP tohoto stroje a stejně tak pomocí --dst vzdálenou IP druhého stroje.
Uvedeme si příklad vytvoření takové SA:
ipsecadm sa add --spi 0x2000 --cipher=aes-cbc \
--cipher-keyfile=/etc/ipsec/enc.key --digest=sha1 \
--digest-keyfile=/etc/ipsec/auth.key --duplex --src=4.3.2.1 \
--dst=1.2.3.4
Kdybychom si pomocí příkazu ipsec sa show nechali vypsat jednotlivé asociace,
tak bychom viděli, že jsme skutečně přidali dvě asociace:
[root@orodruina ipsec]# ipsecadm sa show
Destination Source SPI Cipher/bits Digest-HMAC/bits
========================================================================
1.2.3.4 4.3.2.1 0x00002000 aes-cbc/256 sha1-96/160
4.3.2.1 1.2.3.4 0x00002000 aes-cbc/256 sha1-96/160
A nyní finálně přidáme tunely pomocí příkazu ipsecadm tunnel add zařízení
(zařízení se nazývají ipsecX, kde X je číslo zařízení).
Pomocí volby --local nastavíme lokální IP adresu a pomocí
--remote IP adresu vzdáleného stroje. Eventálně ještě můžeme použít volbu
--spi a specikovat i SPI (což je nutné, pokud máme více tunelů mezi jednou
dvojicí strojů). Příklad:
ipsecadm tunnel add ipsec1 --local=4.3.2.1 --remote=1.2.3.4
Dalším krokem je aktivování zařízení ipsec1. To provedeme příkazem
ipconfig ipsec1 lokální_IP up, poté můžeme nastavit routování do druhé LAN
přes toto zařízení - provést to můžeme příkazem
route add -net sít netmask maska_sítě dev ipsec1. Např. pro stroj s lokální
IP 10.1.1.2 a pro síť na druhém konci IPsec tunelu 172.16.0.0/16 by posloupnost
příkazů vypadala např. takto:
ifconfig ipsec1 10.1.1.2 up
route add -net 172.16.0.0 netmask 255.255.0.0 dev ipsec1
Obdobně provedeme konfiguraci i na druhém stroji (samozřejmě kromě klíčů a algoritmů, tyto parametry musí zůstat stejné). Pak můžeme vyzkoušet např. ping
z jedné lokální sítě na druhou (za předpokladu správně nastaveného routování).
Pomocníkem nám může být např. tcpdump, v ideálním případě uvidíme přes
venkovní síťové zařízení proudit ESP pakety (pomůže nám např. pustit tcpdump
s parametrem esp, pak nic jiného než ESP pakety tcpdump
nebude zobrazovat). Eventuálně ještě může při ladění pomoci zkontrolvat,
jaké pakety chodí přes síťové zařízení ipsecX, což tcpdump zobrazí pomocí
volby -i zařízení.
Závěrem
Tolik tedy k této nejjednodušší implementaci IPsec na Linuxu. Příště se podíváme
na další implementace, jejich konfiguraci, popř. jejich výhody a nevýhody.
Další části seriálu:
|