Minule jsme nakonfigurovali OpenVPN v PtP rezimu. Tedy dve zarizeni mezi sebou. Vetsinou vsak potrebujeme pripojit hodne klientu k jednomu serveru. Slo by opet pouzit sdileny klic (konfiguracni soubor by se musel upravit), ale je to neefektivni. Proto si ukazeme, jak vydavat, podepisovat a spravovat SSL certifikaty. Ziskame naprostou kontrolu nad klienty a kdykoliv muzeme komukoliv zakazat pristup.
Prace s certifikaty
Na praci s certifikaty pouzijeme zname a siroce pouzivane OpenSSL. Budeme potrebovat vytvorit certifikacni autoritu a vygenerovat certifikaty pro server a klienty. Autorita je nasledne musi podepsat. Jiste jde pouzit samotne OpenSSL, ale je potreba ho nastavit. OpenVPN obsahuje v prikladech ukazkove skripty na kompletni praci s certifikaty. Urcite je vhodne je pouzit.
Nejdrive zkopirujeme skripty z ukazek do adresare k OpenVPN a nastavime mu prava, aby do nej nemohl kazdy lezt (jsou v nem tajne klice):
1 2 3 4 5 6 7 8 9 10 11 |
root@eu:/# cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa root@eu:/# cd /etc/openvpn/easy-rsa/ root@eu:/# chmod 0700 /etc/openvpn/easy-rsa root@eu:/etc/openvpn/easy-rsa# ls build-ca build-key-server Makefile README.gz build-dh build-req openssl-0.9.6.cnf revoke-full build-inter build-req-pass openssl-0.9.8.cnf sign-req build-key clean-all openssl-1.0.0.cnf tmp build-key-pass inherit-inter openssl-1.0.0.cnf-old-copy vars build-key-pkcs12 list-crl pkitool whichopensslcnf root@eu:/etc/openvpn/easy-rsa# |
Veskera konfigurace je umistena v souboru vars, ktery musime upravit. Dulezita jsou nize uvedene parametry, zbytek muzeme ponechat ve vychozim stavu:
1 2 3 4 5 6 7 8 9 |
export KEY_SIZE=2048 export KEY_COUNTRY="CZ" export KEY_PROVINCE="Czech Republic" export KEY_CITY="Mesto" export KEY_ORG="Firma" export KEY_EMAIL="mail.spravce@firma.cz" export KEY_CN=changeme export KEY_NAME=changeme export KEY_OU=changeme |
obsah je samovysvetlujici. Expiraci klice pro autoritu je vhodne nechat na dlouho, 10 let je optimalni. Pro klienty je to na zvazeni kazdeho, ale v pripade potreby je mozne klientsky certifikat kdykoliv zneplatnit, takze o nic nejde (a nebudeme muset kazdy rok klientovi nastavovat vsechny pc).
Protoze je nastaveni resene formou promennych, vzdy pred praci s certifikaty musime tyto promenne nacist:
1 2 |
cd /etc/openvpn/easy-rsa . ./vars |
Tecka na zacatku musi byt! Protoze easyrsa obsahuje vzorove klice smazeme je. Nasledne vytvorime klice certifikacni autority a Diffie Hellman parametry:
1 2 3 4 |
./clean-all ./build-ca ./build-dh ./build-key-server server |
Clean-all smaze vsechny klice, proto ho spustime pouze poprve a potom uz nikdy, jinak prijdeme o certifiakty!
Generovani Diffie Hellman muze trvat hodne dlouho, zalezi na dostupne entropii. Posledni radek vygeneruje certifikat pro OpenVPN server.
A konecne muzeme pristoupit ke generovani certifikatu pro klienty. Muzeme vygenerovat klice s heslem, nebo bez hesla. Z hlediska bezpecnosti klientum (lidem) vzdy vytvorime heslo. Naopak pro bezobsluzne prihlaseni, napr. na nejakem routeru heslo nepouzijeme – jinak se behem bootovani tunel sam nesestavi, protoze se bude cekat na rucni zadani hesla. Heslo jde pozdeji z certifikatu odstranit, nebo naopak pridat. Budu predpokladat, ze je budeme generovat pozdeji, proto uvedu kompletni navod pro pozdejsi pouziti:
1 2 3 4 |
cd /etc/openvpn/easy-rsa . ./vars ./build-key-pass pepa ./build-key martin |
Prvni certifikat bude pro uzivatele pepa s heslem a druhy pro uzivatele martin bez hesla.
Po vygenerovani certifikatu se pruvodce pta na pripadnou zmenu voleb ze souboru vars. Pokud budeme jen slepe mlatit do enteru, budeme mit problem. Uplne na konci se totiz pruvodce pta, zda chcete vytvoreny certifikat podepsat certifikacni autoritou a pridat ho do databaze certifikatu. Pokud rucne nenapiseme y a nepotvrdime, klient se nebude moci s certifikatem pripojit! Certifikaty jde podepsat i dodatecne, ale je to prace navic 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# SPATNE: Certificate is to be certified until Jun 6 22:00:16 2025 GMT (3650 days) Sign the certificate? [y/n]: CERTIFICATE WILL NOT BE CERTIFIED # DOBRE: Certificate is to be certified until Jun 6 22:01:02 2025 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated |
Vsechny vytvorene klice jsou v /etc/openvpn/easy-rsa:
1 2 3 4 5 |
# ls /etc/openvpn/easy-rsa/keys/ ca.crt index.txt pepa.crt serial server.csr tux.csr ca.key index.txt.attr pepa.csr serial.old server.key tux.key dh2048.pem index.txt.old pepa.key server.crt tux.crt 01.pem # |
OpenVPN server ke svemu behu potrebuje tucne oznacene soubory. Jedna se o verejny certifikat certifikacni autority, proti kteremu se budou kontrolovat klientske certifikaty. Dale o certifikat a klic serveru. Soubor ca.key hlidame jako oko v hlave, pomoci nej je mozne podepisovat certifikaty novych klientu! ca.key nikdo nikdy nesmi dostat!
Klientum budeme distribouvat certifikat autority, vlastni certifikat a vlastni klic. Priklad pro klienta martin: dame mu soubory: ca.crt, martin.crt a martin.key.
Certifikaty pro server nakopirujeme do /etc/openvpn. Jde to elegantne jednim prikazem, nebo treba pomoci mc. Je to jedno.
1 |
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,server.crt,server.key,dh2048.pem} /etc/openvpn/ |
Nastaveni serveru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# PC bude jako server mode server # rezim TLS server tls-server port 1194 proto udp dev tun1 # Adresa serveru. Parametry jsou "network netmask"! server 192.168.3.0 255.255.255.0 # Vychozi je "net30", alokuje /30 subnet pro kazdeho klienta. # "subnet" funguje podobne jako u tap, vytvori spolecny subnet # pro vsechny klient. Kazdy klient ma jednu IP. topology subnet # Vsichni klienti muzou pouzivat jeden stejny certifikat, ztraci se tim ale kontrola nad uzivateli. # Doporuciji nepouzivat, to uz je pak lepsi staticky klic. #duplicate-cn # pripojeni klienti na VPN se uvidi client-to-client # certifikat certifikacni autority ca /etc/openvpn/ca.crt # certifikat serveru cert /etc/openvpn/server.crt # klic serveru key /etc/openvpn/server.key # parametry pro Diffie-Hellman protokol dh /etc/openvpn/dh2048.pem # logy serveru log-append /var/log/openvpn_UDP1194 # status serveru status /var/run/vpn_UDP1194.status 10 # uzivatel pod kterym bezi server user nobody # skupina pod kterou bezi server group nogroup # udrzuje spojeni nazivu, 10 (ping) a 120 (ping-restart) keepalive 10 120 # komprese prenasenych dat comp-lzo # ukecanost serveru verb 3 persist-key persist-tun # posle na klienta routy na zpristupneni lan za VPN serverem # prvni jsou IP site za serverem, maska, a nakonec IP tun0 OpenVPN sitovky push "route 192.168.1.0 255.255.255.0 192.168.3.1" push "route 192.168.2.0 255.255.255.0 192.168.3.1" push "dhcp-option DNS 192.168.3.1" #push "dhcp-option NTP 192.168.3.1" push "route-gateway 192.168.3.1" # server si bude pamatovat klienty a prideli jim vzdy stejnou IP ifconfig-pool-persist ip_pool_udp1194.txt # Pokud chceme overovat zneplatnele certifikaty. Je potreba zkopirovat soubor revokacemi z easy-ra/keys do /etc/openvpn a odkomentovat: #crl-verify crl.pem # maximalni pocet pripojenych klientu max-clients 10 |
Popis zbyvajicich parametru je v minulem dile, pripadne se da dohledat v dokumetnaci k OpenVPN.
Nastaveni klienta
/etc/openvpn/firma_server_cz.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
remote firma.server.cz port 1194 proto udp dev tun tls-client pull ca ca.crt cert martin.crt key martin.key comp-lzo verb 3 persist-key persist-tun |
Za zminku stoji hlavne parametr pull. Ten povoli prijeti push od serveru. Jinak bude klient ignorovat routovaci pravidla a dhcp parametry ziskane od serveru.
Zjednoduseni nastaveni klienta
Jak je videt, klient potrebuje certifikat ca, svuj certifikat a svuj klic. Nekdy muze byt obtezujici mit samostatny soubor s nastavenim a samostatne soubory s klici. V novych verzich OpenVPN je mozne zapsat certifikaty a klic primo do souboru s nastavenim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
remote firma.server.cz client port 1194 proto udp tls-client dev tun pull comp-lzo verb 3 persist-key persist-tun <ca> -----BEGIN CERTIFICATE----- MIIE3zCCA8egAwIBAgIJAJv7ZbxxfB9NMA0GCSqGSIb3DQEBBQUAMIGlMQswCQYD ... VHNi0j46odTTkQipFsil40J0GymwoZOtk5ivKHrGA5UisxRLW/cTkalwn0dE7MOh ytC3 -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- MIIFIzCCBAugAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBpTELMAkGA1UEBhMCQ1ox ... PePUPh/lq2QQlHJU1b5gTKi7HLs3LNI= -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8EPY4o60k6oYy ... iJcYzoHL8rcRMqOZSmogwVHADDbB9JuNrjHpA078PBYS11epCYXoik19aTQNaEJ8 nmTbqcStt5hNLQbjnJQn5GA= -----END PRIVATE KEY----- </key> |
Jde o takzvany inline zapis. Radky ca, cert a key nahradime primo obsahem daneho souboru.
Jeste vetsi zjednoduseni klienta
V ramci pohodlnosti nam muze zacit vadit mit tri soubory s certifikaty/klicem. Vse muzeme dat do jednoho souboru typu PKCS 12. Je to specialni format archivu, ktery v sobe obsahuje dalsi kryptograficke objekty.
Pri generovani certifiktu pro klienta na server nepouzijeme build-key-pass, ale build-key-pkcs12:
1 2 3 |
cd /etc/openvpn/easy-rsa . ./vars ./build-key-pkcs12 martin |
Adresar keys i nadale bude obsahovat soubory martin.crt, martin.csr a martin.key. Navic pribude archiv martin.p12 a prave ten dame klientovi spolu se souborem client.conf:
1 2 3 4 5 6 7 8 9 10 11 12 |
remote firma.server.cz client port 1194 proto udp tls-client dev tun pull comp-lzo verb 3 persist-key persist-tun pkcs12 martin.p12 |
Pokud budeme chtit pouzit inline zapis pro PKCS12, musime ho nejdrive prevest do base64. PKCS12 soubory jsou totiz binarni. Jde to treba pomoci OpenSSL:
1 |
openssl base64 -in martin.p12 |
V souboru s nastavenim nahradime cestu inline zapisem:
1 2 3 4 5 6 |
<pkcs12> MIIQcQIBAzCCEDcGCSqGSIb3DQEHAaCCECgEghAkMIIQIDCCCtcGCSqGSIb3DQEH ... CSqGSIb3DQEJFTEWBBR+DLZgoGqn13MTXJD3ppLzcVwUyjAxMCEwCQYFKw4DAhoF AAQUn8Hixh0iOHNNbkmgwXKDOhwWIToECMsWHT94b545AgIIAA== </pkcs12> |
Pokud uz mame vygenerovane klice pro klienty pomoci build-key-pass a chceme ze souboru udelat PKC12 soubor, nebo naopak z PKCS12 chceme udelat samostatne soubory, jde to opet pomoci OpenSSL. Je take mozne jenom vypsat informace:
1 2 3 4 5 |
openssl pkcs12 -info -in martin.p12 openssl pkcs12 -export -out martin.p12 -inkey martin.key -in martin.crt -certfile ca.crt openssl pkcs12 -in martin.p12 -out martin.pem -nodes |
Prvni dva prikazy funguji naproste skvele. Mensi problem je s poslednim. Sice rozbali PKCS12, ale vytvori jeden PEM (ASCII) soubor martin.cer, ve kterem jsou certifikaty uzivatele, certifikacni autority a klic uzivatele. I to se da resit, ale jsou na to potreba tri samostatne prikazy:
1 2 3 |
openssl pkcs12 -cacerts -nokeys -out ca.crt -in martin.p12 openssl pkcs12 -clcerts -nokeys -out martin.crt -in martin.p12 openssl pkcs12 -nocerts -nodes -out martin.key -in martin.p12 |
Zneplatneni / revokace klientskych certifikatu
Cas od casu nastane pripad, kdy je potreba certifikat urciteho klienta zneplatnit. Klientovi ukradnou notebook, propustime zamestnance,…
Pro revokaci certifikatu slouzi nastroje:
- list-crl – zobrazi vypis revokovanych certifiaktu. Pokud pri vytvareni certifikatu zadavame inteligentni jmena, hned vidime, o koho jde (Issuer: /C=CZ/ST=Czech Republic/L=Mesto/O=Firma/OU=changeme/CN=changeme/name=changeme/emailAddress=mail.spravce@firma.cz)
- revoke-full martin – znaplatni certifikat uzivateli martin. Pozor: prikaz se nepta na potvrzeni! Po spusteni ihned provede revokaci!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# cd /etc/openvpn/easy-rsa # . ./vars # ./revoke-full martin Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Revoking Certificate 02. Data Base Updated Using configuration from /<span style="font-size: 11.3620004653931px; line-height: 20.6720008850098px; font-family: Verdana, sans-serif;">etc/openvpn</span><span style="font-size: 11.3620004653931px; font-family: Verdana, sans-serif; line-height: 20.6720008850098px;">/easy-rsa/openssl-1.0.0.cnf</span> martin.crt: C = CZ, ST = Czech Republic, L = Mesto, O = Firma, OU = changeme, CN = martin, name = changeme, emailAddress = mail.spravce@firma.cz error 23 at 0 depth lookup:certificate revoked # ./list-crl Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=CZ/ST=Czech Republic/L=Mesto/O=Firma/OU=changeme/CN=changeme/name=changeme/emailAddress=mail.spravce@firma.cz Last Update: Jun 9 23:38:59 2015 GMT Next Update: Jul 9 23:38:59 2015 GMT Revoked Certificates: Serial Number: 02 Revocation Date: Jun 9 23:38:59 2015 GMT Signature Algorithm: md5WithRSAEncryption 81:ef:20:d4:70:27:2d:9b:d5:32:1e:a6:02:c0:ff:14:56:5e: ... f2:e5:64:f1:9e:3f:41:d5:bb:24:1f:b3:b1:ea:a2:e5:8c:27: d4:6c:31:f4 root@eu:/<span style="font-size: 11.3620004653931px; line-height: 20.6720008850098px; font-family: Verdana, sans-serif;">etc/openvpn</span><span style="font-size: 11.3620004653931px; font-family: Verdana, sans-serif; line-height: 20.6720008850098px;">/easy-rsa# </span> # cat keys/crl.pem -----BEGIN X509 CRL----- MIICAjCB6zANBgkqhkiG9w0BAQQFADCBpTELMAkGA1UEBhMCQ1oxFzAVBgNVBAgT ... NhL3ODtDOvcYiGmDuRVowvLlZPGeP0HVuyQfs7HqouWMJ9RsMfQ= -----END X509 CRL----- # cp -f keys/crl.pem /etc/openvpn/crl.pem |
Po revokaci vznikne v adresari keys soubor crl.pem, ktery obsahuje informace o revokovanych certifikatech. Prave ten musi mit OpenVPN server k dispozici, aby mohl kontrolovat, jestli neni certifikat revokovany. Po revokaci je vzdy nutne soubor zkopirovat, pripadne si „kopirovaci prikaz“ dopsat do souboru revoke-full a predejit tak zapomeni. Muzeme take vytvorit odkaz na soubor a nastavit potreba prava. Reseni je vice.
Pro infomaci o aktualnim stavu certifikatu se staci podivat do souboru index.txt v adresari keys:
1 2 3 4 |
V 250606224913Z 01 unknown /C=CZ/ST=Czech Republic/L=Mesto/O=Firma/OU=changeme/CN=server/name=changeme/emailAddress=mail.spravce@firma.cz R 250606224944Z 150609233859Z 02 unknown /C=CZ/ST=Czech Republic/L=Mesto/O=Firma/OU=changeme/CN=martin/name=changeme/emailAddress=mail.spravce@firma.cz V 250606225008Z 03 unknown /C=CZ/ST=Czech Republic/L=Mesto/O=Firma/OU=changeme/CN=pepa/name=changeme/emailAddress=mail.spravce@firma.cz V 250606235054Z 04 unknown /C=CZ/ST=Czech Republic/L=Jicin/O=-/OU=changeme/CN=mvancl/name=Martin Vancl/emailAddress=mvancl@example.net |
Zde je krasne videt potreba vyplnovat pri generovani realne udaje. Pouze z posledniho certifikatu je jasne patrne, komu patri. Druhy certifiakt s „R“ na zacatku radku byl revekovany a uz neplati.
Priste si ukazeme, jak vytvorit VPN pro pouziti na nezabezpecenych sitich (free WiFi), ktera projde temer vsemi firewally.
Dalsi clanky o OpenVPN.