====== 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