Vážení kolegové turisté,
posledních pár dní jsem se intenzivně zabýval tím, zda by šlo na Turrisu rozběhat podnikové zabezpečení bezdrátové sítě bez externího serveru a zjistil jsem, že šlo
.
Pokusím se poskytnout tutoriál, jak na to. Jsem si vědom, že jako v každém návodu, i zde se budou vyskitovat chyby, a proto uvítám jakékoliv připomínky a opravy. Nebráním se ani přenesení na wiki.
Začněme tím, že si ujasníme o co jde.
Nyní existují různé způsoby zabezpečení WiFi sítí. Mezi ty, které připadají v úvahu pro zkušeného správce se řadí WPA2-PSK s protokolem AES; pouze pokud by to vyžadovalo nějaké zařízení kvůli kompatibilitě, je možné povolit zpětnou kompatibilitu se starším protokolem TKIP, který je ale považován za prolomitelný.
WPA2-PSK je založené na myšlence, že všichni uživatelé bezdrátové sítě sdílejí stejné heslo a jím je také zašifrována komunikace v rámci bezdrátového přenosu.
Mezi výhody patří naprosto jednoduché nasazení, kdy se na routeru nastaví heslo, které se pak distribuuje mezi členy rodiny, přátele a další. Pro malý počet osob je tak toto zabezpečení naprosto dostačující. Profil k WPA-PSK síti lze distribuovat například pomocí QR kódu a instalaci tak zvládne i laik bez opisování složitého hesla a to tak může být patřičně dlouhé.
Mezi nevýhody se totiž řadí fakt, že moment, kdy se bezdrátový klient identifikuje s přístupovým bodem lze bezpečně zachytit a útočník pak na takto zachyceném záznamu může aplikovat útok hrubou silou a pokud máte na WiFi síti slabé / slovníkové heslo, je schopný jej prolomit. Další bezpečnostní díry skrývá protokol WPS, pomocí kterého je možné u některých routerů prolomit přístup za relativně krátkou dobu, tj. v řádech hodin.
Mezi další bezpečnostní riziko, které byste měli mít na paměti je, že kdo je připojen ke stejné síti, jako vy, vidí vaši bezdrátovou komunikaci nezabezpečeně. Proto může nastat problém s více připojenými lidmi, kteří se navíc mohou měnit. Nastane-li případ, že potřebujete někomu odebrat přístup, můžete pak v zásadě učinit dvěma způsoby.
a) Změnit heslo sítě. Heslo pak budete muset změnit u všech dosud připojených zařízení, kromě těch, které chcete nechat odpojené, což může být pracné a nepohodlné.
b) Zablokovat MAC adresu vyřazeného stroje. Ta lze však snadno změnit.
Alternativou k tomuto přístupu je podnikové zabezpečení, které se velmi často používá ve firmách, školách atp. Příkladem budiž například mezinárodní projekt eduroam.
Princip spočívá v tom, že klient naváže spojení s Access Pointem a provede ověření 1. fáze. To udělá tak, že se připojí na tzv. RADIUS server, který mu specifikuje AP. Pomocí otisku veřejného klíče, který musí mít uložený, ověří identitu RADIUS serveru a přejde k fázi 2. V té buď zabezpečeným tunelem pošle serveru své uživatelské jméno a heslo, popřípadě se ověří privátním klíčem, který je podepsaný certifikační autoritou RADIUS serveru.
Tyto způsoby připojení v rámci EAP (Extensible Authentication Protocol) se dělí na LEAP, PEAP, TLS, TTLS a další. LEAP byl vyvinutý firmou Cisco a z bezpečnostních důvodů už se nyní nedoporučuje jeho nasazení.
Podstatou 2 fázového šifrování je, že i když se podaří prolomit zabezpeční u klienta a unikne jeho heslo, komunikace je stále zašifrována.
V rámci EAP-TLS se uživatel identifikuje certifikátem a v PEAP je certifikát nahrazen uživatelským jménem a heslem.
TODO: Popsat TTLS.
Nutno poznamenat, že nakonfigurování EAP sítě na klientech je mnohem složitější a obzvlášť problémové je přenesení certifikáty na zařízení, které chceme připojit.
Nyní se konečně můžeme pustit do práce.
Jako první věc bude třeba nainstalovat freeradius. My využijeme balíkovacího systému Turrisu a pouze spustíme:
opkg update
opkg install freeradius2 freeradius2-common freeradius2-mod-chap freeradius2-mod-detail freeradius2-mod-eap freeradius2-mod-eap-md5 freeradius2-mod-eap-mschapv2 freeradius2-mod-eap-peap freeradius2-mod-eap-tls freeradius2-mod-eap-ttls freeradius2-mod-exec freeradius2-mod-files freeradius2-mod-logintime freeradius2-mod-mschap freeradius2-mod-pap freeradius2-mod-passwd freeradius2-mod-preprocess freeradius2-mod-radutmp freeradius2-utils
Dále je potřeba vygenerovat certifikáty. To lze udělat několika způsoby. Buďto přímo pomocí openssl, nebo využijeme utilitu easyrsa od OpenVPN.
opkg install openvpn-easy-rsa
cd /etc/easy-rsa
nano vars
Soubor upravíme dle našich preferencí. Obvzáště se zaměřte na EXPIRE část, která říká, jak dlouho budou jednotlivé certifikáty platit. Například u certifikační autority je vhodné délku prodloužit na 10 let. Je také nutné, aby hodnota proměnné KEY_SIZE odpovídala hodnotě v eap.conf, který budeme konfigurovat později.
Je také možné upravit soubor openssl-1.0.0.cnf, pro modifikaci cest a dalších proměnných.
#clean-all
# pozor, smaže obsah adresáře
/etc/easy-rsa/keys
! ujistěte se, že tam nemáte nějaké své klíče
build-ca --pass
#Vygeneruje certifikační autoritu. Volbou pass zajistíme, že generování nových klíčů bude podmíněno zadáním hesla.
build-key-server --pass
# Vygeneruje certifikát a privátní klíč serveru. Jako pass můžete nastavit složitou změť znaků (nyní to označíme jako 'heslo1'. Tu si poznamenejte, následně ji budeme uvádět v konfiguraci RADIUS serveru.
build-dh
# vygeneruje soubor, který umožní Diffieho-Hellmanovu výměnu klíčů
build-key-pkcs12 --pass bob
#Vygeneruje certifikát pro klienta jménem bob. Bob bude muset při instalaci certifikátu zadat toto heslo. Soubor je ve formátu bob.p12, který v sobě kombinuje privátní klíč a certifikát.
Poslední krok je nutné opakovat pro každého klienta s unikátním jménem (např tereza, bob2 atd). Heslo pro certifikáty si klienti mohou zadat sami, je důležité, aby ho znali.
Některé programy pro správu sítě (například Network Manager) nedovolí použití certifikátu bez hesla.
Je čas na konfigurace freeradius.
cd /etc/freeradius2
V souboru
radiusd.conf
zakomentujte řádek
interface = br-lan
.
V souboru
clients.conf
se definují parametry připojení k radiusserveru pro klienty. Tak například pro celou vnitřní síť za Turrisem bude konfigurace vypadat takto:
client 192.168.1.0/24 {
secret = sup€rBezpecneHesl0KtereJeNutnePrenestdoAP
shortname = TurrisLAN
}
Toto je ta nejjednodušší konfigurace. I zde je možné definovat rozhraní a další.
vzhledem k tomu, že jsme certifikáty vytvářeli pomocí easy-rsa, je možné freeradiusu pomoci symbolickým odkazem:
ln -s /etc/easy-rsa/keys /etc/freeradius2/keys
Nyní editujeme soubor
eap.conf
:
V části eap:
default_eap_type = tls
V části tls:
certdir = ${confdir}/keys
cadir = ${confdir}/keys
private_key_password = heslo1
private_key_file = ${certdir}/server.key
certificate_file = ${certdir}/server.crt
CA_file = ${cadir}/ca.crt
dh_file = ${certdir}/dh1024.pem
fragment_size = 1024
#toto musí odpovídat nastavení KEY_SIZE ze souboru vars
#check_crl = yes
#Zde si dovolím poznámku pod čarou*
Pomalu se začínáme dostávat do finále:
Nyní máme server připravený a při jeho spuštění by se měli klienti úspěšně ověřit pomocí EAP-TLS.
Je třeba, aby byl na klienta přenesen soubor
ca.crt
pro ověření komunikace s pravým RADIUS severem a pak jeho klíč, např
bob.p12
.
Pokud chceme uživatele ověřovat pomocí uživatelského jména a hesla, není třeba generovat uživatelům certifikáty a klíče, ale místo toho editovat soubor
/etc/freeradius2/users
a uživatele tam dopsat.
Buď lze použít nezabezpečené heslo, nebo MSCHAPv2.
"bob" Cleartext-Password := "heslo3"
"adela" NT-Password := "AA8E249F681BCBDCE22941D24CD3B2E8"
k vygenerování NT hashe si půjčíme skript ze stránek
http://wiki.openwrt.org/inbox/daloradius:#!/bin/bash
PWD=$1
DUMMYUSER="smbencrypt_dummy"
# if there is no user $DUMMYUSER, we have to add it to /etc/passwd using the nobody group
grep -q smbencrypt_dummy /etc/passwd || echo "$DUMMYUSER:*:65533:65534:dummy_user_for_fake_smbencrypt:/var:/bin/false" >> /etc/passwd
# add entry to /etc/samba/smbpasswd
cat <<EOF | smbpasswd -s -a $DUMMYUSER
$1
$1
EOF
# get entry
NTHASH=`grep $DUMMYUSER /etc/samba/smbpasswd | cut -d':' -f4`
# remove $DUMMYUSER from /etc/samba/smbpasswd
smbpasswd -x $DUMMYUSER
#remove $DUMMYUSER from /etc/passwd
sed -i "/$DUMMYUSER/d" /etc/passwd
# output results
cat <<EOF
NT Hash
--------------------------------
$NTHASH
EOF
Po každé změně souboru users musíme radius restartovat. Doporučuji vše vyzkoušet v debugovacím režimu spuštěním příkazu
radiusd -XX
Nyní by mělo být vše funkční a my se můžeme pustit do nastavení Access Pointu. Toto již v pohodě zvládneme pouze s pomocí LuCi.
Můžeme buď změnit stávající nastavení, nebo přidat další SSID.
ESSID TurrisEAP
Mód Přístupový bod
Zabezpečení bezdrátové sítě: WPA2-EAP
Šifra: Vynutit CCMP (AES)
Server Radius-Authentication: 192.168.1.1 (nebo adresa Turrisu)
Tajný klíč pro Radius-Authentication: sup€rBezpecneHesl0KtereJeNutnePrenestdoAP
A můžete testovat.
Po každé změně konfiguračních souborů je třeba radius restartovat. Přidání nového certifikátu restart nevyžaduje, ale odebrání ano. A zde se právě dostávám k poslednímu kroku našeho tutoriálu.
*V případě, že totiž chcete odebrat certifikát, není to tak jednoduché, jak by se mohlo zdát, protože certifikát je už jednou naší certifikační autoritou podepsaný a my určitě nechceme generovat všechny znovu. Proto existují tzv. CRL soubory, neboli certificate revocation list, seznam revokovaných certifikátů, takových, které již nejsou platné. Představme si, že bob dělá v naší síti potíže a chceme mu odebrat přístup. V případě, že se ověřuje uživatelským jménem a heslem, je postup jednoduchý. Prostě mu udebereme účet vymazáním příslušného řádku v souboru users a je vystaráno.
Pokud se ale ověřuje svým privátním klíčem, musíme jeho certifikát revokovat a poté umožnit, aby si to freeradius zjistil. Takové seznamy bývá ve zvyku uvádět veřejně, neb je důležité, aby se CRL v případě, že není prázdný dostal do ruky každému, kdo důvěřuje naší certifikační autoritě.
Bobův certifikát revokujeme příkazem:
revoke-full bob
To však není vše. Freeradius má specifický způsob čtení revokačních záznamů, a proto je nutné v adresáři pustit takzvaný
c_rehash
. Turris přímo tímto příkazem nedisponuje, ale CZ.NIC jej zřejmě v Turrisu nějakým způsobem používá, jak dokládá tento 6 dnů starý záznam z gitu (viz
https://github.com/CZ-NIC/turris-os-packages/tree/test/cznic/c-rehash).
Stačí si tak pouze vytvořit spustitelný soubor
c_rehash
(kdo by nevěděl, tak
chmod +x ./c_rehash
), do něj vložit obsah souboru
https://github.com/CZ-NIC/turris-os-packages/blob/test/cznic/c-rehash/files/openssl-c_rehash.sh a pak ho spustit
./c_rehash /etc/easy-rsa/keys
Tento příkaz proskenuje adresář a vygeneruje symbolické odkazy na soubory, pojmenované podle jejich hashe.
Pak již stačí v souboru
eap.conf
povolit
check_crl = yes
a restartovat radius.
Voila, bob se již nepřipojí.
Jak lze vidět, celý postup správy certifikátů je velmi náročný a těžkopádný. Chce to trochu laborovat, aby si člověk osahal, jak co k čemu pasuje. Samotný management je pak mírně složitější, než pouhá správa uživatelských jmena a hesel.
RADIUS lze samozřejmě napojit na řadu databází, Active Directory atd. Musím se přiznat, že tak daleko jsem ve svém experimentování zatím nepokročil a možná by v tomto momentě bylo vhodnější nainstalovat nějakého správce, jako třeba daloradius. To ale zase až příště.