Postavili bomo certifikatno agencijo in jo uporabili za avtentikacijo na VPN.

Na prejšnjih vajah ste s sosedom vzpostavili navidezno lokalno omrežje. Pri tem ste si morali s sosedom izmenjati ključ, s katerim ste potem kodirali ves promet. Slabost tovrstne izmenjave ključev je predvsem v tem, da lahko napadalec, ki je zajel kriptiran promet, nato pa pridobil še ključ, dekodira vse zajete podatke, tudi tiste, ki jih je dobil v preteklosti. Včasih je tudi težko vzpostaviti varen kanal, po katerem bi lahko prenesli ključ.

Prenašanju ključev po varnih kanalih se lahko izognemo z uporabo asimetrične kriptografije. Kot bonus dobimo možnost vzpostavitve VPN med več kot dvema računalnikoma.

Predpriprava

  • Imejte pripravljeno rešitev prejšnje naloge.
  • Preberite, kako se lahko uporabnik predstavi z javnim ključem in kaj je algoritem Diffie-ja in Hellmana

Naloga

Spravite se v trojke. Določite, kdo bo strežnik za VPN (imenujmo ga a); preostala dva člana skupine bosta odjemalca b in c. Odjemalec c naj postavi certifikatno agencijo (CA, angl. certificate authority).

  • Poskrbite, da bodo vaši računalniki lahko dostopali drug do drugega.
  • c ustvari certifikatno agencijo.
  • a postavi strežnik VPN, na katerega se povežeta b in c.

Nato s sošolci v drugih skupinah:

  • Kot odjemalec se povežite na strežnik v drugi skupini.
  • Postavite omrežje z najmanj dvema hopoma, ki bo v celoti delovalo.

Navodila

Navodila v tej nalogi so povzeta po dveh dokumentih z domače strani OpenVPN:

Če ste manjkali na prejšnjih vajah, namestite openvpn:

# apt install openvpn

Če bi radi pogledali, katere datoteke na sistemu pripadajo paketu openvpn, lahko poizkusite z:

# dpkg -L openvpn

Certifikatna agencija

Pri namestitvi openvpn dobimo paket easy-rsa, ki vsebuje nekaj skript za lažje ustvarjanje in podpisovanje ključev. Nahajajo se v /usr/share/easy-rsa. Z uporabo teh skript boste najprej ustvarili CA, da boste lahko podpisovali ključe odjemalcev. Najprej naredite nov imenik in vanj skopirajte skripte:

c$ mkdir openvpn-ca
c$ cp -R /usr/share/easy-rsa/* openvpn-ca
c$ cd openpvn-ca

Nato v ukazno lupino naložite datoteko z nastavitvami vars in ustvarite CA:

c$ source ./vars
c$ ./clean-all
c$ ./build-ca

Državo, mesto, organizacijo in ostale podatke nastavite po lastni presoji. V podimeniku keys boste dobili nekaj datotek, med drugim ca.crt. To je certifikat zasebnega ključa agencije, ki ga boste morali prenesti na ostale računalnike v skupini, da bodo lahko zaupali podpisom vaše CA.

Ustvarite ključ in certifikat za strežnik OpenVPN:

c$ ./bulid-key-server streznik

Geslo lahko pustite prazno. Zgenerirajte še parametre za izmenjavo skrivnosti po protokolu, ki sta si ga izmislila Diffie in Hellman:

c$ ./build-dh

Datoteke ca.crt, dh2048.pem, streznik.crt in streznik.key skopirajte na računalnik, kjer boste poganjali strežnik VPN:

c$ scp ca.crt dh2048.pem streznik.crt streznik.key <username>@<a>:

Strežnik

Ustvarite imenik openvpn-server, vanj skopirajte datoteko s primerom konfiguracije strežnika OpenVPN in jo popravite:

a$ mkdir openvpn-server
a$ zcat /usr/share/doc/openvpn/exapmles/sample-config-files/server.conf.gz > server.conf
a$ vi server.conf

V tej datoteki:

  • odkomentirajte nastavitev client-to-client;
  • zakomentirajte nastavitev tls-auth;
  • popravite nastavitvi key in cert, da bosta kazali na streznik.key in streznik.crt; in
  • popravite nastavitvi ca in dh, da kažeta na datoteki ca.crt in dh2048.pem.

Bravo! Skonfigurirali ste strežnik. Zaženite ga:

a# openvpn --config server.conf

Odjemalec

Vsak odjemalec mora ustvariti zasebni ključ, s katerim bo strežniku izkazal svojo istovetnost. Odjemalec, na katerem je CA, lahko ključ ustvari in podpiše neposredno:

c$ cd openvpn-ca
c$ ./build-key <ime>

Po tem se ključ in podpisan certifikat nahajata v datotekah keys/<ime>.key oziroma keys/<ime>.crt.

Ostali odjemalci najprej skopirajo skripte easy-rsa v nov imenik, naložijo spremenljivke v datoteki vars in pripravijo okolje:

b$ mkdir openvpn-client
b$ cp -R /usr/share/easy-rsa/* openvpn-client
b$ cd openpvn-client
b$ source ./vars
b$ ./clean-all

Nato ustvarite zasebni ključ in zahtevek za podpis certifikata (angl. certificate signing request):

b$ ./build-req <ime>

Ta ukaz v podimeniku keys ustvari datoteki <ime>.key (zasebni ključ) in <ime>.csr (zahtevek za podpis). Slednjo datoteko spravite na računalnik c. Tam podpišite zahtevo, da ustvarite končni certifikat:

c$ ./sign-req <ime>

Zdaj imate v imeniku keys datoteko <ime>.crt, ki jo skopirajte nazaj na odjemalca. Uporaba zahtevkov za podpis omogoča, da CA podpiše ključ, ne da bi zasebni del ključa kadarkoli zapustil odjemalčev računalnik – c dobi le zahtevek, ne pa zasebnega ključa, in vrne certifikat.

Na obeh odjemalcih skopirajte datoteko s primerom nastavitev za OpenVPN client.conf, ki jo najdete poleg server.conf.gz. Datoteko popravite tako, da nastavite:

  • zakomentirajte nastavitev tls-auth;
  • remote nastavite na IP strežnika;
  • cert nastavite na <ime>.crt; in
  • key nastavite na <ime>.key.

Potem zaženete openvpn:

# openvpn --config client.conf

Možne težave

Če gre nekaj narobe pri podpisovanju odjemalčevega certifikata, je mogoče, da boste morali iz datoteke keys/index.txt odstraniti vnos s ključem odjemalca. Probleme imate lahko tudi, če niste lastnik datoteke ~/.rnd - v tem primeru pač izvedite

# chown jazst.jazst ~/.rnd
Zadnja sprememba: četrtek, 10. januar 2019, 13.42