====== Připojení k eduroam.cz: konfigurace IPsec na Linuxu ====== Návod pro IPsec na Linuxu není udržován, použijte [[cs:spravce:pripojovani:radsec:uvod|RadSec]]! V rámci přípravy projektu //eduroam.cz// jsme otestovali IPsec tunnel, OpenBSD's isakmpd a IPsec-Tools (KAME's IPsec utilities). Při seznamování s technologií IPsecu se jako užitečný ukázal dokument [[http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/glossary.html|Glossary for the Linux FreeS/WAN]]. FreeS WAN jsme ale netestovali, protože jeho vývoj byl zastaven. [[http://ringstrom.mine.nu/ipsec_tunnel/|IPsec tunnel]] vyžaduje úpravu zdrojového kódu kernelu a neumožňuje použití transportního režimu. Má implementováno pouze tunelování, což by přineslo zbytečné komplikace při přidělování IP adres tunelům, proto jsme se rozhodli ho nepoužít. [[http://www.ipsec-howto.org/x496.html|OpenBSD's isakmpd]] transportní režim podporuje, ale má horší podporu pro práci s certifikáty. Především se nám nepodařilo najít takovou konfiguraci, při které by byl schopen navázat šifrované spojení bez vymazání IPSec politik. V okamžiku restartu jednoho z konců spojení je nutné IPSec politiky vymazat na obou koncích, což je velmi těžko realizovatelné a mohlo byt vést až k výpadku celé národní //eduroam// RADIUS hierarchie. Z otestovaných implementací se nám jako nejvhodnější jeví [[http://ipsec-tools.sourceforge.net/|IPsec-Tools]] ([[http://www.ipsec-howto.org/x299.html|howto]]). Racoon, daemon zodpovědný za dynamickou výměnu šifrovacích klíčů, ale také není zcela bez problémů. Na RADIUS serverech provozovaných CESNETem je použit právě IPsec-Tools v konfiguraci popsané dále. Těm, kteří ještě žádné IPSec řešení nepoužívají, doporučujeme použití toho námi popisovaného. Nebráníme se spolupráci s těmi, kteří používají řešení jiné, ale v těchto případech je třeba počítat s delší dobou nutnou na odladění a otestování specifické konfigurace. ===== Potřebný software ===== V kernelu Linuxu musí být zapnuta podpora IPsec, ta se zapíná direktivami ''CONFIG_INET_AH'' a ''CONFIG_INET_ESP'' v konfiguračním souboru. Potřebný kód je k dispozci v kernelech 2.5.47+, 2.6.1+. Je také možné, že potřebná fukcionalita byla backportována do distribučního kernelu, např. Debian má podporu IPsec v kernelech od verze 2.4.25. IPsec-Tools jsou stále aktivně vyvíjeny, a proto by měly být pokud možno v poslední stabilní verzi, v době psaní tohoto dokumentu to je 0.6.4. Je možné, že na Vaší distribuci jsou trochu jiné zvyklosti, např. v umisťování spouštěcích skriptů a konfiguračních souborů. Zde uváděné příklady předpokládají použití [[http://www.debian.org/|Debian GNU/Linuxu]]. V příkladech je uváděno fiktivní jméno a IP připojovaného počítače. ===== Definice IPsec politik ===== ''Racoon'' sice umožnuje dynamické generování politik pro kernel, ale tato funkcionalita je určena pro klienty, kteří se připojují z různých IP adres. V //eduroam.cz// je dynamická konfigurace nežádoucí. Díky statické konfiguraci je mimo jiné zajištěno, že RADIUS servery mezi sebou nemohou nedopatřením komunikovat nešifrovaně. Vytvořte soubor ''/etc/ipsec-policies.conf'' s tímto obsahem (raději použijte rovnou IP adresy): SETKEY="/usr/local/sbin/setkey" LOCAL="**radius1.example.com**" PEERS="radius1.eduroam.cz" a spusťte [[cs:spravce:pripojovani:ipsec:linux:ipsec-policies|ipsec-policies start]]. Po spuštění by se mělo zobrazit: Setting ipsec policies: **radius1.example.com** <-> radius1.eduroam.cz Pro ověření, že je opravdu vše v pořádku, si můžete ještě zkontrolovat //Security Policy Database// spuštěním ''setkey -DP''. Získáte následující výstup: 195.113.187.22[any] **10.0.0.1**[any] any in prio def ipsec esp/transport/require created: Aug 26 15:31:42 2004 lastused: lifetime: 0(s) validtime: 0(s) spid=1032 seq=3 pid=5559 refcnt=1 **10.0.0.1**[any] 195.113.187.22[any] any out prio def ipsec esp/transport/require created: Aug 26 15:31:42 2004 lastused: lifetime: 0(s) validtime: 0(s) spid=1025 seq=1 pid=5559 refcnt=1 195.113.187.22[any] **10.0.0.1**[any] any fwd prio def ipsec esp/transport/require created: Aug 26 15:31:42 2004 lastused: lifetime: 0(s) validtime: 0(s) spid=18 seq=2 pid=5559 refcnt=1 Jestliže všechno vypadá v pořádku, zkuste pingnout na národní RADIUS: ''radius1.eduroam.cz''. Ping by **neměl** projít, protože jsou již nakonfigurovány IPsec politiky. Kernel tedy už ví, že musí s národním RADIUSem komunikovat šifrovaně, ale ještě neběží ''racoon'', který zajistí výměnu //Security Associations//, čímž umožní zahájení šifrované komunikace. ===== Zprovoznění racoona ===== ==== Umístění certifikátů ==== Popisovaná konfigurace předpokládá uložení certifikátů v adresáři ''/etc/ssl/certs'' a v adresáři ''/etc/ssl'' musí být symbolický link na kořenový certifikát CA. Jména linků jsou hash z subjectu kořenového certifikátu CA. Linky vytvořte takto: radius1:/etc/ssl# ln -s certs/CCA2005.pem \ `openssl x509 -in certs/CCA2005.pem -noout -hash`.0 Kořenový certifikát, soubor ''CCA2005.pem'', získáte na stránkách [[http://www.cesnet.cz/pki/|CESNET CA]]. ==== Stahování revokačního listu ==== Na tomtéž místě jako link na kořenový certifikát, tedy v ''/etc/ssl'', očekává racoon umístění revokačního listu. Jméno souboru musí odpovídat linku odkazujícímu na certifikát, jen přípona souboru bude ''.r0''. Při každém stažení certifikátu musíte kontrolovat jeho platnost a podpis, tak doporučuji použití skriptů [[https://github.com/CESNET/getcrl|getcrl.sh a getcrls.sh]], které se o vše potřebné umí postarat. Instalace je následující: radius1:~/getcrl-1.9# ./configure --prefix=/usr/local/getcrl-1.9 --sysconfdir=/etc \ --with-crt-dir=/etc/ssl --with-crl-dir=/etc/ssl radius1:~/getcrl-1.9# make radius1:~/getcrl-1.9# make install Vytvořte soubor ''/etc/getcrls.cfg'' s obsahem: http://www.cesnet.cz/pki/crl/cn=CESNET%20CA,dc=cesnet-ca,dc=cz.crl Vyzkoušejte, jestli vše funguje: radius1:~# /usr/local/getcrl-1.9/sbin/getcrls.sh -s Výstup by měl vypadat takto: getcrl[4991]: Starting with http://www.cesnet.cz/pki/crl/cn=CESNET CA,dc=cesnet-ca,dc=cz.crl getcrl[4991]: New CRL is younger than the installed one. getcrl[4991]: Task completed. Pokud je vše v pořádku, tak stahování nastavte jednou denně v cronu. Vymyslete si nějaký náhodný čas, ať se neúčastníte DoS útoku na distribuční servery. ;) ==== Konfigurace racoona ==== Umístěte níže uvedenou konfiguraci do souboru ''/etc/racoon.conf''. Pochopitelně musíte změnit IP adresy a správně spočítat lifetime pro SA. Vzorec naleznete v [[:cs:spravce:pripojovani:ipsec:uvod|obecném popisu parametrů IPsec spojení]]. path certificate "/etc/ssl"; listen { isakmp **10.0.0.1**; strict_address; } # -- radius1.eduroam.cz -- sainfo subnet **10.0.0.1**/32 any subnet 195.113.187.22/32 any { pfs_group 2; lifetime time **61587** sec; encryption_algorithm 3des; authentication_algorithm hmac_sha1; compression_algorithm deflate; } remote 195.113.187.22 { exchange_mode main; my_identifier asn1dn; peers_identifier asn1dn; certificate_type x509 "certs/**ipsec_radius1.example.com**.crt.pem" "private/**ipsec_radius1.example.com**.key.pem"; lifetime time 24 hours; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method rsasig; dh_group 2; } proposal_check claim; } Sekce s ''listen {...}'' je volitelná a je na zvážení administrátora. Nastavení ''proposal_check'' na ''claim'' znamená, že PFS group protějšku musí být shodná s lokální a z lifetime se použije buď lokální nebo návrh protějšku podle toho, která z hodnot je kratší. Jesliže vaše verze racoona nerozumí ''subnet'', tak ho změnte na ''address''. Zbytek direktiv je asi vcelku jasný, manuál k ''racoon.conf'' mohu doporučit, je poměrně kvalitní. Jestliže používáte IPsec-Tool z distribuce, tak pravděpodobně máte vhodný startovací skript. Racoon se občas odmítá ukončit a potřebuje zvýšenou motivaci v podobě signálu 9. V přílohách máte k dispozici [[cs:spravce:pripojovani:ipsec:linux:racoon|osvědčený skript]], který dokáže racoona spolehlivě ukončit. Pro první pokus ale spusťe racoon v popředí v terminálu, ať můžete pohodlně zkontrolovat výstup, a v druhém okně spusťe ''ping radius1.eduroam.cz'', aby měl racoon důvod začít pracovat: radius1:~# racoon -F -4 -f /etc/racoon.conf Pro ukázku uvádím komunikaci s ''radius1.eduoram.cz'': @(#)ipsec-tools 0.6.4 (ipsec-tools.sourceforge.net) @(#)This product linked OpenSSL 0.9.7e 25 Oct 2004 (www.openssl.org) **10.0.0.1**[500] used as isakmp port (fd=5) IPsec-SA request for 195.113.187.22 queued due to no phase1 found. initiate new phase 1 negotiation: **10.0.0.1**[500]<=>195.113.187.22[500] begin Identity Protection mode. ISAKMP-SA established **10.0.0.1**[500]-195.113.187.22[500] spi:05ef9e13fa5fefa8:6fefbe1bf1a1584a initiate new phase 2 negotiation: **10.0.0.1**[0]<=>195.113.187.22[0] respond new phase 2 negotiation: **10.0.0.1**[0]<=>195.113.187.22[0] IPsec-SA established: ESP/Transport 195.113.187.22[0]->**10.0.0.1**[0] spi=45612402(0x2b7fd72) IPsec-SA established: ESP/Transport **10.0.0.1**[0]->195.113.187.22[0] spi=98598645(0x5e07ef5) IPsec-SA established: ESP/Transport 195.113.187.22[0]->**10.0.0.1**[0] spi=48516199(0x2e44c67) IPsec-SA established: ESP/Transport **10.0.0.1**[0]->195.113.187.22[0] spi=107434508(0x667520c) Další možností kontroly funkce racoona je výpis SA pomocí příkazu ''setkey -D''. Racoon začne spojení navazovat až když vznikne potřeba komunikace. Národní RADIUS server se sice snaží posílat ping na všechny definované RADIUS servery, ale vněkterých případech je nutné aby bylo IPsec spojení navázáno z druhé strany. Pro tyto případy se hodí skript [[#skript_eduroam-ping.sh|eduroam-ping.sh]]. ===== Udržování aktivního IPsec spojení ===== Každé SA má omezenou dobu platnosti, po vypršení racoon s protějškem nedohaduje nové, ale čeká, až vznikne potřeba komunikace. Sestavení nového SA někdy trvá i minutu nebo dvě. Aby byla zajištěna vysoká dostupnost služby, tak se národní RADIUS server častými ping pakety snaží udržovat IPsec spojení aktivní. [[cs:spravce:monitoring:statistiky_dostupnosti_ipsec|Statistiky odezev]] jsou zaznamenávány a jsou správcům k dispozici v grafické podobě. Skript který použávám na národním RADIUS serveru je k [[cs:spravce:pripojovani:ipsec:linux:eduroam-ping|dispozici]] pro ty správce, kteří chtějí mít vlastní záznamy. Skript automaticky zjistí, jaká IPsec spojení jsou nadefinována. Potom pro každé jednotlivé IPčko vygeneruje podproces, který zajistí, aby se ping nespouštěl paralelně pro tu samou adresu, zpracuje výsledky a zaarchivuje do systémových logů. Loguje se na ''local5.info''. ===== Některé chybovky a jejich řešení ===== ==== ERROR: pfkey UPDATE failed: Protocol not supported ==== V kernelu chybí některý z důležitých modulů. Zkontrolujte přítomnost **esp4**, **des**, **sha1**, **af_key**. ==== WARNING: unable to get certificate CRL(3) at depth:1 SubjectName:... ==== Dooinstalujte si [[cs:spravce:pripojovani:ipsec:linux#stahovani_revokacniho_listu|statahování revokačního listu]]. ===== Přílohy ===== ==== Skript ipsec-policies ==== Skript [[cs:spravce:pripojovani:ipsec:linux:ipsec-policies|ipsec-policies]] slouží k nastavení/odstranění IPsec politik. ==== Skripty getcrl.sh a getcrls.sh ==== Skripty souží ke stahování a ověřování revokačních listů, jsou distribuovány z adresy [[http://tools.cesnet-ca.cz/getcrl/]]. ==== Startovací skript pro racoon ==== Osvědčený [[cs:spravce:pripojovani:ipsec:linux:racoon|startovací skript]], který si s racoonem poradí, i když nereaguje na signály k ukončení. ==== Skript eduroam-ping.sh ==== Skript [[cs:spravce:pripojovani:ipsec:linux:eduroam-ping|eduroam-ping.sh]] je používán k udržování aktivního IPsec spojení. ====== ====== --- //[[http://staff.cesnet.cz/~semik/|Jan Tomášek]] 11.09.2006 13:40// dokument převeden z www.eduroam.cz\\ --- //[[http://staff.cesnet.cz/~semik/|Jan Tomášek]] 23.01.2008 10:39// doplnil jsem informace o řešení dvou častých chyb v logu racoona