OpenVPN #3: Vydavani a sprava klientskych certifikatu

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):

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:

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:

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:

./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:

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 🙂

   # 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:

# 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.

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,server.crt,server.key,dh2048.pem} /etc/openvpn/

Nastaveni serveru

# 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:

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:

remote firma.server.cz
client
port 1194
proto udp
tls-client
dev tun
pull
comp-lzo
verb 3
persist-key
persist-tun


-----BEGIN CERTIFICATE-----
MIIE3zCCA8egAwIBAgIJAJv7ZbxxfB9NMA0GCSqGSIb3DQEBBQUAMIGlMQswCQYD
...
VHNi0j46odTTkQipFsil40J0GymwoZOtk5ivKHrGA5UisxRLW/cTkalwn0dE7MOh
ytC3
-----END CERTIFICATE-----



-----BEGIN CERTIFICATE-----
MIIFIzCCBAugAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBpTELMAkGA1UEBhMCQ1ox
...
PePUPh/lq2QQlHJU1b5gTKi7HLs3LNI=
-----END CERTIFICATE-----



-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8EPY4o60k6oYy
...
iJcYzoHL8rcRMqOZSmogwVHADDbB9JuNrjHpA078PBYS11epCYXoik19aTQNaEJ8
nmTbqcStt5hNLQbjnJQn5GA=
-----END PRIVATE 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:

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:

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:

openssl base64 -in martin.p12

V souboru s nastavenim nahradime cestu inline zapisem:


MIIQcQIBAzCCEDcGCSqGSIb3DQEHAaCCECgEghAkMIIQIDCCCtcGCSqGSIb3DQEH
...
CSqGSIb3DQEJFTEWBBR+DLZgoGqn13MTXJD3ppLzcVwUyjAxMCEwCQYFKw4DAhoF
AAQUn8Hixh0iOHNNbkmgwXKDOhwWIToECMsWHT94b545AgIIAA==

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:

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:

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!
# 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 /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
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:/etc/openvpn/easy-rsa# 

# 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:

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.

 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *