NetworkManager a připojení k 802.1x síti s EAP-TLS

Aneb jak se s NetworkManagerem připojit do sítě (lhostejno zda WiFi nebo po kabelu) s RADIUS serverem a ověřování certifikátem. A jak k certifikátu přijít.

Pokud je na 802.1x síti vyžadováno ověření pomocí EAP-TLS, budeme potřebovat certifikát (a samozřejmě k němu patřící privátní klíč). Tyto sítě obvykle fungují na tom, že v nich existuje nějaká vlastní, neveřejná, certifikační autorita. Ta za prvé vydává certifikáty pro RADIUS server(y) - tím je zajištěno zabezpečení komunikace mezi RADIUS serverem a klientem, který se zrovna do sítě připojuje a klient tedy ví, že se přihlašuje do té správné sítě a ne do hotspotu, který mu někdo zrovna teď podstrčil. A za druhé vydává certifikáty pro jednotlivé uživatele - RADIUS server potom tedy zkontroluje, že certifikát vydala tahle interní CA, které on důvěřuje a případně podle certifikátu identifikuje uživatele a přiřadí mu příslušná oprávnění (VLAN, atd.).

Takže, potřebujeme napřed získat ten certifikát od té interní CA. To samozřejmě záleží na tom, co se v dané síti používá... Nicméně, relativně častý případ bude podniková síť s Active Directory pro Windowsí stanice, jejíž součástí je právě i CA. Je to taky asi jedna z mála věcí, co na tomhle systému docela dobře funguje - počítače připojené do AD si totiž od téhle CA mohou žádat o certifikáty, ta je celkem dobře vystavuje a prakticky tedy celý enrollment proces ceritifkátů funguje automaticky, aniž by do něj uživatel musel nějak zasahovat. Tenhle luxus nemáme, ale přes to existuje způsob, jak certifikát získat. Na začátku potřebujeme klasické CSR, tedy žádost o certifikát a vezmeme na to standardně OpenSSL. Takže, vytvoříme si konfigurační soubor třeba ad_config a do něj dáme tenhle obsah:

  1. [req]
  2. default_bits = 2048
  3. prompt = no
  4. default_md = sha256
  5. req_extensions = req_ext
  6. distinguished_name = dn
  7. [ dn ]
  8. DC=local
  9. DC=domain
  10. OU=users
  11. CN=Jaa
  12. emailAddress=<a href="mailto:muj@mail.cz">muj@mail.cz</a>
  13. [ req_ext ]
  14. subjectAltName = @alt_names
  15. [ alt_names ]
  16. email=<a href="mailto:muj@mail.cz">muj@mail.cz</a>
  17. otherName=1.3.6.1.4.1.311.20.2.3;UTF8:<a href="mailto:jaa@domain.local">jaa@domain.local</a>
Patřičné sekce upravíme tak, aby to sedělo na firemní doménu, cestu v ní a náš uživatelský účet. V položce otherName je login s AD doménou (tedy to, co v certifikátu Windows ukazují jako principal name). Když to máme, tak si vytvoříme CSR:
  1. openssl req -new -sha256 -nodes -days 365 -out jaa.csr -newkey rsa:2048 -keyout jaa.key -config ad_config

A teď potřebujeme certifikát. Pokud máme štěstí a naše AD certifikační autorita má otevřené webové rozhraní, tak si jej otevřeme (pokud ne, tak z Windows admina budeme muset dostat jiný způsob, jak certifikát získat) - autorita je obvykle na URL /certsrv u serveru s CA (dost často domain controller); tedy něco jako http://ad.local/certsrv). Tam nás za prvé bude zajímat odkaz Download CA certificate, kde stáhneme CA certifikát lokální autority. A následně Request a certificate - submit an advanced certificate request. V template vybereme User nebo jinou šablonu, kterou používají ostatní počítače. A do saved request copy pastneme obsah csr souboru, který vygenerovalo OpenSSL. Dáme Submit a budeme-li mít štěstí na další stránce si stáhneme náš podepsaný certifikát. Dohromady tedy máme CA certifikát, náš privátní klíč (.key) a nově stažený certifikát.

Tak jdeme klikat do NetworkManageru. Možnosti jsou poměrně přímočaré - WPA/WPA2 Enterprise, ověření TLS, vyplníme náš login a doménu (to by mělo být v zásadě šumák, pač je to v tom certifikátu, nicméně NM trvá na tom, že se to vyplnit musí), CA certifikát, náš certifikát a privátní klíč. Heslo ke klíči by nemělo být potřeba, jelikož předchozí příkaz vygeneroval nezašifrovaný klíč (tedy bez hesla), ale NetworkManager opět trval na nutnosti jej vyplnit... nicméně, stačilo tam dát jakékoliv písmeno (anebo si ten klíč vygenerujte zašifrovaný; je to ostatně lehce bezpečnější, protože to heslo k němu je pak v konfiguraci NetworkManageru, kterou uživatel nemůže číst):

Když dáme teď připojit, tak pokud se něco nezvrtlo, do sítě se připojíme. Takže, je to všechno? No, ne tak úplně... Na začátku jsem psal, že RADIUS server disponuje také certifikátem, kterým se s nám při připojování ověřuje. Jenže když se podíváme na to nastavení, co jsme vyplnili, tak podle čeho jej poznáme? Jediné, co v tuhle chvíli můžeme ověřit je, že RADIUS server nám poslal certifikát od stejné CA, ke které jsme do profilu přidali certifikát. Stačí to? Tak... je to lepší, než bezdrátem do oka. Nicméně v tuhle chvíli je potřeba si uvědomit, že úplně stejná CA nám vydala i ten náš uživatelský certifikát. Takže co tedy brání libovolnému jinému uživateli téhle sítě (nebo komukoliv, kdo z jeho počítače vyhackoval jeho certifikát s klíčem ven), aby mohl vytvořit falešný hotspot s falešným RADIUS serverem, kde nám bude podstrkovat pro ověření RADIUS serveru tenhle jeho uživatelský certifikát? No... maximálně nějaké key usage atributy v tom certifikátu, ale na jejich ověření (a co v nich vlastně je zase záleží na nastavení autority v AD), na které se nedá příliš spolehnout.

Takže... když si otevřeme v prohlížeči libovolnou stránku, která má HTTPS (dnes už většina), tak prohlížeči také úplně nestačí, že dostane certifikát od nějaké CA. Na co tedy kouká prohlížeč? Na doménové jméno... Prohlížeč ví, že když si uživatel otevřel seznam.cz, tak v tom certifikátu by také měl být seznam.cz. Přesně tu samou věc lze udělat i tady. Se dvěma rozdíly: jména RADIUS serverů si musíme zjistit my, jaké se v síti používají, to nám třeba správce prozradí (pokud si to nesprávcujeme sami :-) ). A druhý háček je v tom, že ačkoliv NetworkManager to ověřovat umí, tak vývojářům klikátka do Gnome (a i těm, co dělali klikátko nm-connection-editor) tohle jaksi nepřišlo vůbec důležité a naklikat to v tom profilu nejde (ono to ostatně nepřišlo moc důležité ani těm v Microsoftu: tam sice tenhle parametr naklikat jde, ale ověření je ve výchozím stavu také odškrtnuté a vesele to profil vytvoří a připojí se bez nutnosti to tam zadat). Naštěstí NetworkManager má CLI utilitu, která je chytřejší. Takže rychlé howto:

  1. nmcli c show MojeWiFi
nám vypíše konfiguraci našeho WiFi profilu. MojeWiFi nahrazujeme za název profilu v NetworkManageru (obvykle u WiFi je to pojmenované podle SSID). Ve výpisu nás teď zajímá položka 802-1x.domain-match, ve které nyní nic nebude. A tak připojení zmodifikujeme:
  1. nmcli c modify MojeWiFi 802-1x.domain-match "radius1.domain.local;radius2.domain.local"
Pro upřesnění: vyplníme adresy (respektive jména, která jsou v certifikátech) všech RADIUS serverů, které na síti ověřují a oddělíme je středníkem. Přes show ověříme, že se nastavení propsalo. V téhle chvíli by se k síti mělo jít stále připojit, ale jen pokud v certifikátu od RADIUS serveru je jedno z uvedených jmen (tedy už by neměl stačit vykradený certifikát ze stanice).