cs:spravce:pripojovani:ipsec:linux

Připojení k eduroam.cz: konfigurace IPsec na Linuxu

Návod pro IPsec na Linuxu není udržován, použijte 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 Glossary for the Linux FreeS/WAN. FreeS WAN jsme ale netestovali, protože jeho vývoj byl zastaven.

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.

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í IPsec-Tools (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í 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 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 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ů 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 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 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 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í. 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 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:...

Přílohy

Skript ipsec-policies

Skript 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ý startovací skript, který si s racoonem poradí, i když nereaguje na signály k ukončení.

Skript eduroam-ping.sh

Skript eduroam-ping.sh je používán k udržování aktivního IPsec spojení.

Jan Tomášek 11.09.2006 13:40 dokument převeden z www.eduroam.cz
Jan Tomášek 23.01.2008 10:39 doplnil jsem informace o řešení dvou častých chyb v logu racoona

Poslední úprava:: 2022/01/12 13:54