Radiator je používán na národních RADIUS serverech zodpovědných za řízení komunikace eduroam.cz se zbytkem světa. Na CESNETu a několika univerzitách je používán v roli RADIUS serveru obsluhujícího uživatele. Jeho konfigurace je snažší a podstatně flexibilnější než freeRADIUSu, především díky velmi dobře propracovanému systému „hook“ů, pomocí kterých můžete vlastním kódem napsaným v Perlu ovlivnit chování serveru. Radiator lze provozovat nejen na Linuxu a Windows, ale i na řadě dalších platforem.
Konfigurace, která zde bude popsána, je používána na CESNETím RADIUS serveru, který slouží k ověřování uživatelů. Narozdíl od [konfigrace IPsec na linuxu ji pravděpodobně budete muset upravovat o něco více, aby vyhověla Vašim potřebám.
Kompletní konfigurace je uvedena v přílohách. V textu jsou uvedeny jen části nutné pro objasnění funkce.
V konfiguraci je třeba uvést definici klientů, se kterými bude RADIUS server komunikovat:
StartupHook sub { require "/etc/radiator/CUI.pm" ; }; include %D/cui.cfg <Client DEFAULT> Secret tajemstvi </Client> <Client **10.0.1.1**> #AP01 Secret **tajemstvi123** </Client> <Client **10.0.1.2**> #AP02 Secret **tajemstvi213** </Client> <Client **10.0.1.3**> #AP03 Secret **tajemstvi321** </Client> # . # . # . <Client radius1.eduroam.cz> # narodni radius server Secret **tajemstvi231** //**DupInterval 0**// </Client> <Client ermon.cesnet.cz> # monitoring Secret **tajemstvi132** //**DupInterval 0**// </Client> <Client **accounting.cesnet.cz**> Secret **TAJEMSTVI** </Client>
Je třeba uvést nejen AP, která jsou přirozeným klientem pro server, ale i národní RADIUS servery, které vystupují v roli klienta, když některý z Vašich uživatelů využije roamingu.
Klienty lze vyjmenovat jejich DNS jménem, IP adresou, rozsahem IP adres, případně lze také použít řetězec „DEFAULT“. Taková definice bude použita pro všechny klienty, pro něž nebude k dispozici jiná přesnější.
Aby bez problémů fungoval monitoring je třeba pro radius1.eduroam.cz a ermon.cesnet.cz nastavit DupInterval 0
jinak dochází k zahazování některých dotazů a následně k jejich chybnému vyhodocení. Při defaultní hodnotě 2 se v log souborech objevuje hlášení INFO: Duplicate request id 87 received from xxx.xxx.xxx.xxx
.
RadSec otevírá dvě TCP spojení. Jedno je realizováno z národního RADIUS serveru na RADIUS server instituce a druhé ze serveru instituce na národní server. Komunikace probíhá na port TCP/2083. Zde se definuje port na kterém bude očekáváno spojení z národního RADIUS serveru.
<ServerRADSEC> Secret radsec UseTLS TLS_CAPath /etc/ssl/certs TLS_CertificateFile /etc/ssl/certs/ipsec_**certifikat**.crt.pem TLS_CertificateType PEM TLS_PrivateKeyFile /etc/ssl/private/ipsec_**certifikat**.key.pem TLS_RequireClientCert TLS_CRLCheck TLS_CRLFile /etc/ssl/certs/9b59ecad.r0 TLS_ExpectedPeerName radius1.eduroam.cz </ServerRADSEC>
Radiator má možnost zpracovávat požadavky podle realmu díky konstrukci:
<Realm cesnet.cz> . . . </Realm>
Anebo podle jakékoliv hodnoty z požadavku konstrukcí:
<Handler attribute=value,attribute=value, ....> . . . </Handler>
Druhá alternativa je podstatně flexibilnější, proto je také použita ve zde prezentované konfiguraci.
Požadavky o autentizaci bez realmu je vhodné zamítat s Access-Reject aby si domací uživatelé zvykali i v domácí síti používat realm a něměli tak zbytečně potíže když budou chtít eduroam použít jinde.
<Handler Realm=/^$/> <AuthBy INTERNAL> DefaultResult REJECT </AuthBy> </Handler>
Accounting týkající se našich domácích uživatelů může přijít nejen z našich AP, ale teoreticky také z národního RADIUSu. V současnosti ale platí, že hostitelské organizace by neměli accounting posílat s ohledem na soukromí uživatelů.
Veškerý acounting ukládáme do lokálního souboru na každém jednom lokálním RADIUS
serveru, ale také ho přeposíláme na stroj se jménem accounting.cesnet.cz
. Tam dochází
ke spojování dat z druhého RADIUS servereru a DHCP serveru, abychom v případě problémů
byli schopni uživatele identifikovat na základě IP adresy která mu byla přidělena.
<Handler Request-Type=Accounting-Request, Realm=/^**cesnet\.cz**$|^**radius1\.cesnet\.cz**$/i> AcctLogFileName /var/log/arch/radiator/radiator.**cesnet.cz**.%Y_%m_%d.acc <AuthBy RADIUS> <Host **accounting.cesnet.cz**> AuthPort 1812 AcctPort 1813 Secret **TAJEMSTVI** </Host> </AuthBy> PreProcessingHook sub { CUI::add(@_); }; #AccountingHandled </Handler>
Ověření identity a hesla uživatelů s realmem cesnet.cz, případně
radius1.cesnet.cz se děje v sekci AuthBy
jménem
CheckLDAP
, která je uvedena dále. Je podstatné, aby realmy byly
zpracovávány bez ohledu na velikost písmen, jinak to vede zmatení
uživatelů.
<Handler Realm=/^**cesnet\.cz**$|^**radius1\.cesnet\.cz**$/i> AuthBy CheckLDAP AuthLog authlogger PostProcessingHook sub { CUI::add(@_); }; </Realm>
Následující dva handlery jsou pro požadavky tunelované skrz TTLS
respektive PEAP, tato konstrukce je vynucena vnitřní architekturou
Radiatoru. Volání skriptu eap_acct_username.pl,
slouží k tomu, aby se v Access-Accept
paketech
neobjevovala vnější anonymní identita.
<Handler TunnelledByTTLS=1> AuthBy CheckLDAP AuthLog authlogger PostProcessingHook file:"/etc/radiator/eap_acct_username.pl" PostAuthHook sub { CUI::add(@_); }; </Handler> <Handler TunnelledByPEAP=1> AuthBy CheckLDAP AuthLog authlogger PostProcessingHook file:"/etc/radiator/eap_acct_username.pl" PostAuthHook sub { CUI::add(@_); }; </Handler>
Accouting týkající se našich návštěvníků může přijít jen z našich AP. Opět ho ukládáme lokálně, jen do jiného souboru:
<Handler Request-Type=Accounting-Request> AcctLogFileName /var/log/arch/radiator/radiator.global.%Y_%m_%d.acc
a také ho posíláme našemu centrálnímu accounting systému:
<AuthBy RADIUS> <Host **accounting.cesnet.cz**> AuthPort 1812 AcctPort 1813 Secret **TAJEMSTVI** </Host> </AuthBy> PreProcessingHook sub { CUI::add(@_); }; </Handler>
Než k nám může od našich AP doputovat nějaký accounting o návštěvníkovi, tak musí předcházet ověření jeho identity. O to se postará národní RADIUS server. Pomocí atributu Operator-Name předáme národnímu RADIUSu a domovské organizaci informaci o tom kterou organizaci návštěvník navštívil, znak 1 musí být před realmem uveden, viz syntaxe atributu.
<Handler Realm=/^.+$/> <AuthBy RADSEC> Host radius1.eduroam.cz Secret radsec MaxFailedRequests 2 MaxFailedGraceTime 0 FailureBackoffTime 0 UseTLS TLS_CAPath /etc/ssl/certs TLS_CertificateFile /etc/ssl/certs/ipsec_**certifikat**.crt.pem TLS_CertificateType PEM TLS_PrivateKeyFile /etc/ssl/private/ipsec_**certifikat**.key.pem TLS_CRLCheck TLS_CRLFile /etc/ssl/certs/9b59ecad.r0 TLS_ExpectedPeerName radius1.eduroam.cz
Odpověď na ověření návštěvníkovy identity ale musí být zkontrolována, jestli neobsahuje zakázané AV páry od návštěvníkova domovského RADIUS serveru, také jestli se nejedná o testovací účet. Jde tedy o kontrolu a úpravu AV párů, o to se stará skript check_reply.pl.
ReplyHook file:"/etc/radiator/check_reply.pl" </AuthBy> AddToReplyIfNotExist Tunnel-Private-Group-ID=1:1000 AddToReply Tunnel-Type=1:VLAN,\ Tunnel-Medium-Type=1:Ether_802 AddToRequestIfNotExists Operator-Name=1**cesnet.cz** AddToRequest Chargeable-User-Identity=\000 </Handler>
Uživatelské účty jsou ukládány v LDAPu. Každý uživatel si musí před
tím, než může eduroam používat, nastavit sekundární heslo určené
jen pro tento účel. To, že tak může učinit, společně s tím, že nemá
nastaven specielní atribut radiusDisabled
, definuje jeho
oprávnění eduroam používat.
<AuthBy LDAP2> Identifier CheckLDAP
Radiator má implementovány dva mechanizmy, pomocí kterých se vyrovnává
s tím, že uživatelské jméno obsahuje realm. Prvním je příkaz
RewriteUsername
, který umožňuje definovat regulární výraz
určený k přepisu uživatelského jména. To bohužel působí problémy
autentikačním mechanizmům jako je MSCHAP, které uživatelské jméno
používají v chalenge-response mechanizmu při výpočtu otisku hesla.
Druhou možností je příkaz UsernameMatchesWithoutRealm
,
který způsobí, že se hledá uživatel jen na základě uživatelského
jména, ale informace o realmu se neztrácí. Toto je správná funkce pro použití v eduroamu.
UsernameMatchesWithoutRealm yes
LDAP je provozován na tom samém počítači jako RADIUS server. Má
dedikovaného uživatele, který má oprávnění číst sekundární uživatelská
hesla (uložená v atributu radiusPassword
), ale současně nemá oprávnění číst uživatele, kteří mají
eduroam zablokován atributem radiusDisabled
(toto se
děje na straně LDAP serveru prostřednictvím ACL).
Každý uživatel dále může mít definován atribut
radiusTunnelPrivateGroupID
určený k umístění uživatele do
specifické VLAN. Tato funkce se používá pouze pro testovací účty.
Host localhost AuthDN **uid=rad,ou=Special Users,dc=cesnet,dc=cz** AuthPassword **Tajemstvi** BaseDN **dc=cesnet,dc=cz** UsernameAttr uid PasswordAttr **radiusPassword** AuthAttrDef radiusTunnelPrivateGroupID, \ Tunnel-Private-Group-ID, reply
Jsou podporovány různé typy EAP metod. S ohledem na chybu v software bezdrátových telefonů Cisco… musí být LEAP uveden jako první, protože jinak tyto nejsou schopny se ověřit.
V případě, že nechcete používate EAP-TLS tak je dobré nastavit EAPTLS_CAPath tak aby ukazoval na prázdný adreář. Uživatelům je pak znemožněno experimentovat s ověřovaním pomocí certifikátů.
Pokud používáte SureServer EDU, CESNET TCS anebo jinou CA která používá několik mezilehlých CA, tak místo EAPTLS_CertificateFile použijte EAPTLS_CertificateChainFile který musí obsahovat certifikát certifikátu následovaný řetězem mezilehlých CA. Viz diskuze v listu eduroam-admin.
EAPType LEAP,PEAP,TTLS,MSCHAP-V2,MD5,MD5-Challenge EAPTLS_CAPath /etc/ssl/certs/prazdny-adresar EAPTLS_CertificateFile /etc/ssl/certs/radius1.cesnet.cz.crt EAPTLS_CertificateType PEM EAPTLS_PrivateKeyFile /etc/ssl/private/radius1.cesnet.cz.key EAPTLS_MaxFragmentSize 1000 EAPTLS_CRLCheck EAPTLS_CRLFile /etc/ssl/9b59ecad.r0 AutoMPPEKeys EAPTLS_PEAPVersion 0 //**EAPAnonymous %n**// SSLeayTrace 1
Skript search_hook.pl zajištuje, aby uživatelé nemohli být příliš kreativní při vymýšlení vnější EAP identity, dovolená hodnota je jen anonymous@cesnet.cz
.
PostSearchHook file:"/etc/radiator/search_hook.pl"
V případě, že uživatel nemá nadefinován atribut
radiusTunnelPrivateGroupID
, tak
je do odpovědi přidán AV pár
Tunnel-Private-Group-ID=1:100
. Pokud ho definován má,
hodnota je 1:666
, tudíž se jedná o testovací účet.
Další atributy jsou k odpovědi přidány vždy.
AddToReplyIfNotExist Tunnel-Private-Group-ID=1:100 AddToReply Tunnel-Type=1:VLAN,\ Tunnel-Medium-Type=1:Ether_802 </AuthBy>
Chargeable-User-Identity (CUI) je unikátní identifikátor uživatele který IdP počítá pro každé SP. Pro výpočet se používá hash funkce, jejím vstupem je atribut Operator-Name, uživatelské jméno a sůl. CUI je implemntováno jako perlovský modul a je k dispozici na githubu.
Krom volání funkce CUI::add() pomocí správných hooků, jak je uvedeno výše. Je ještě třeba připravit mysql databázi a uvést její konfiguraci v souboru cui.cfg a v souboru cui_definitions_file nastavit vlastní hodnotu do proměné CUI_salt.
Databáze je využívána k dočasnému ukládání CUI a jejich doplňování do accounting paketů.
Kompletni konfigurace z tohoto clanku pro Raditator: radius.cfg.
Konfigurace Radiatoru používaná na TUL: tul-radius.tgz (27. 3. 2006). Za poskytnutí děkuji Petrovi Adamcovi.
Implemnetace CUI na githubu.
Skript search_hook.pl zajištuje aby uživatelé mohli jako vnější anonymní identitu použít pouze anonymous@cesnet.cz
.
Skript check_reply.pl odstraňuje z odpovědí AV páry které by mohli ovlivnit chování AP. Odpovědi od národního RADIUS serveru musí být kontrolovány jestli neobsahují AV páry, které by mohly ovlivnit funkci našich AP. Současně také probíhá kontrola, jestli návštěvník není na našem blacklistu.
Skript eap_acct_username.pl zajištuje aby v Access-Accept
paketech v User-Name
byla skutečná identita uživatele nikoliv anonymní vnější identita.
Skript patch_accounting.pl je další zajímavá ukázka hooku Radiatoru. Slouží na národním serveru k přidávání realmu do Access-Accept
paketů.
CESNET, z. s. p. o.
Generála Píky 26
160 00 Praha 6
info@cesnet.cz
Tel: +420 234 680 222
GSM: +420 602 252 531
support@cesnet.cz