OpenVPN serveri kasutamine OpenBSD'ga

Allikas: Kuutõrvaja

Sissejuhatus

Käesolevas tekstis kirjeldatakse OpenVPN tarkvara kasutamist OpenBSD operatsioonisüsteemil, et võimaldada paljudele OpenVPN klientidele juurdepääsu OpenVPN serverist ligipääsetavatele võrkudele. Kusjuures teatud mõttes erijuhuna on võimalik, et kliendid kasutavad ka avalikku võrku üle OpenVPN serveri. Üldiselt võiks asjakorraldust illustreerida sellise skeemiga


                  klient1 
     klient 0                         klient2
 
                avalik võrk
                     .
                     .
                    ...
                     |   
                   __|__ em0 192.168.99.90/30
                  |     |
          server  |     | 
                  |_____|
               em1  | |  em2
                    | | testkeskkond 10.0.7.1/24
                    |
                    | arenduskeskkond 10.0.13.1/24

kus

  • 192.168.99.90 - OpenVPN teenuse ip aadress, mille poole OpenVPN kliendid pöörduvad
  • testkeskkond, arenduskeskkond - võrgud, mille ressursse kliendid üle VPNi kasutama asuvad

Kui ressurssi on kasutada mõõtukalt, siis OpenVPN tarkvara on suhteliselt praktiline kasutada OpenBSD tulemüüris. Tulemüüris OpenVPN serveri pidamise puudusteks on

  • turvalisuse seisukohast oleks parem hoida tulemüüri kui väga kriitilist infrastruktuuri sõlme vaba teenustest, mida saab pidada ka mujal
  • kui tulemüür on realiseeritud klustrina, siis õlgade ümberlülitamisel katkevad kasutajate OpenVPN ühendused

OpenVPN serveris seadistamisel tuleb töötada kahe ülesandega

  • ruutingud - kliendid peavad saama pöörduda OpenVPN serveri kaudu vajalike ressursside poole
  • paketifiltri reeglid - kliendid tohivad saada pöörduda OpenVPN serveri kaudu ainult nende ressurssidre poole, mida neil on õigus kasutada

Seejuures on tuleb süsteemi ehitamisel arvestada sellega, et erinevatel klientidel erinevad vajadused ressursside kasutamise osas.

Ruuditud ja sillatud ühendused

OpenVPN kasutab OpenBSD poolel virtuaalset tun võrguseadet, mis tähendab, et see on realiseeritud tarkvaraliselt võimaldades neid kasutaval programmil saata andmeid operatsioonisüsteemi võrgu pinnu (ingl. k. networking stack) ning vastupidi, võtta sealt andmeid vastu.

OpenBSD tun seade võib töötada kahes kihis võimaldades kahte erinevat OpenVPN kasutusjuhtu

  • ruuditud ühendus - tun seade töötab ip kihis (layer 3) ja andmevahetuses osalevate arvutite ip aadressid on jaotatud erinevate ip subnettide vahel
  • sillatud ühendus - tun seade töötab etherneti kihis (layer 2) ja andmevahetuses osalevad arvutid asuvad samas ip subnetis ning nn ip broadcast domeenis

Ruuditud ühendus

Ruuditud ühendust kirjeldab selline skeem

                   _____ 
                  |     |
       klient     |     |  tun0: 172.19.0.5 <--- P2P ---> 172.19.0.6
                  |_____|
                     |   fxp0: 192.168.96.138/30
                     |
                     
                  avalik võrk               
 
                     |
                     |    
                   __|__  
                  |     |  em0: 192.168.99.90/30
       server     |     |  
                  |_____| 
                    | |    tun0: 172.19.0.1 <--- P2P ---> 172.19.0.2
                    | |
                    | |--------- testkeskkond 10.0.7.0/24
                    |
                    |--- arenduskeskkond 10.0.13.0/24

OpenVPN tulemusena moodustub mõlemasse arvutisse ruutivas režiimis tun seade (st point-to-point), mille ühest otsast saab pöörduda teise otsa poole. P2P ühendustega seotud ip aadressid on selles mõttes pisut eksitavad, et serveri poolt vaadatest on server ip aadress .0.1 ja tunneli teine ots on .0.2; samal ajal kliendi poolt vaadates on kliendi ots .0.5 ja server .0.6. Sellesse tuleb suhtuda abstraktselt ja loominguliselt.

Olgugi, et üle tunneli, aga siiski sama OpenVPN serveri poole, mille poole saaks ka niisamagi pöörduda ei pakuks praktilist suuremat kasu. Oluline on aga, et lisaks saab läbi selliselt moodustatud ühenduse ruutida ka alamvõrke, näiteks

  • kui OpenVPN kliendi ruutingutableisse lisada, et 10.0.13.0/24 võrgu lüüsiks on 172.19.0.6, siis saab ta suhelda serveri taga 10.0.13 võrgus olevate arvutitega üle OpenVPN ühenduse
  • äärmisel juhul on võimalik kogu kliendi liiklus internetiga seadistada käima üle tunneli, seejuures peab kliendi ruutingutabelisse tegema siiski mõne erandi, et see ühendus, millel tunnel käib ise alles jääks, st punktide 192.168.96.138/30 ja 192.168.99.90/30 vahel.

Ruuditud ühenduse puhul paistavad kliendi pöördumised sealtkaudu ligipääsetavatele arvutitele lähtuvat aadressilt 172.19.0.5.

Sillatud ühendust kirjeldab selline skeem

              -------|-------- wire - 192.168.3.0/24 -----
                     |
                     |   
                   __|__ em0 192.168.3.254/24
                  |     |
       TUVIKE     |     |  tulemüür, bridge0: ip aadressi ei ole, tun0 ja em0 on sillaga kokku ühendatud
                  |_____|
                     |   fxp0 172.16.2.1/28
                     |
                     
                  internet               
 
                     |
                     |    172.16.5.15/30
                   __|__ 
                  |     |  
       KALAKE     |     |  nö üksik arvuti
                  |_____| 
                           tap0: Tuvikese OpenVPN serveri poolt omistatud mac aadress ja ip aadress

Sillatud režiimi puhul omistab Tuvikeses töötav OpenVPN Kalakese tun seadmele genereeritud mac aadressi ning 192.168.3.0/24 võrgust IP aadressi. Kalakese tap0 seade on üle tuvikese tun0 ja em0 seadmetest moodustatud silla ühendatud 192.168.3.0/24 võrku.

Seda kui palju Kalakesest väljuvat liiklust käib otse avalikku võrku läbi füüsilise seadme ja kui palju liigub läbi tunneli saab korraldada Kalakese ruutingutabli abil. Näiteks, et 10.0.100.0/24 võrgu suhtlemine toimuks läbi Tuvikese tuleb öelda Kalakeses

 # route add -net 10.0.100.0 netmask 255.255.255.0 gw 192.168.3.254

OpenVPN tarkvara paigaldamine

OpenBSD v. 4.7 sisaldab paketihalduses OpenVPN tarkvara versiooni 2.1.0, paigaldamiseks tuleb öelda

# pkg_add openvpn
--- +openvpn-2.1.0 -------------------
OpenVPN re-creates the tun(4) interface at startup; compatibility
with PF is improved by starting it from hostname.if(5). For example:

# cat << EOF > /etc/hostname.tun0
up
!/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
EOF

Pakett sisaldab pisikest sertifikaatide haldusprogrammi easy-rsa.

OpenVPN ruuditud ühenduse katsetamine

Katsetamine võib olla vajalik veendumaks, et arvutitesse on OpenVPN tarkvara paigaldamine õnnestunud, operatsioonisüsteemi tasemel ei ole mingeid takistusi, nt tun seadmete moodustamisel ning serveri ja kliendi versioonid omavahel sobivad.

Katsetada tuleks OpenBSD serveri ja mõne kliendiga, mida kavatsetakse kasutama hakata, antud juhul on katse tehtud Debiani kliendi abil.

Krüptimata ühendus

Lihtsamal juhul, kus andmevahetust ei krüptita pole vaja midagi ettevalmistada, vajalikud parameetrid näidatakse käsureal öeldes Tuvikeses

 tuvike-openbsd# openvpn --remote 172.16.5.15 --dev tun0 --ifconfig 10.8.0.1 10.8.0.2 --verb 3
 Sat Jul 26 12:43:33 2008 OpenVPN 2.0.9 i386-unknown-openbsd4.3 [SSL] [LZO] built on Mar 13 2008
 Sat Jul 26 12:43:33 2008 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA.  OpenVPN 2.  0-beta16 and earlier used 5000 as the default port.
 Sat Jul 26 12:43:33 2008 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
 Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 destroy
 Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 create
 Sat Jul 26 12:43:33 2008 NOTE: Tried to delete pre-existing tun/tap instance -- No Problem if failure
 Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 10.8.0.2 10.8.0.1 mtu 1500 netmask 255.255.255.255 up
 Sat Jul 26 12:43:33 2008 TUN/TAP device /dev/tun0 opened
 Sat Jul 26 12:43:33 2008 Data Channel MTU parms [ L:1500 D:1450 EF:0 EB:4 ET:0 EL:0 ]
 Sat Jul 26 12:43:33 2008 Local Options hash (VER=V4): '08b6a7d0'
 Sat Jul 26 12:43:33 2008 Expected Remote Options hash (VER=V4): '7d01953d'
 Sat Jul 26 12:43:33 2008 UDPv4 link local (bound): [undef]:1194
 Sat Jul 26 12:43:33 2008 UDPv4 link remote: 172.16.5.15:1194
 Sat Jul 26 12:43:43 2008 Peer Connection Initiated with 172.16.5.15:1194
 Sat Jul 26 12:43:44 2008 Initialization Sequence Completed

ning öeldes Kalakeses

 kalake-debian# openvpn --remote 172.16.2.1 --dev tun0 --ifconfig 10.8.0.2 10.8.0.1 --verb 3
 Sat Jul 26 12:44:34 2008 OpenVPN 2.1_rc7 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] built on Jun 16 2008
 Sat Jul 26 12:44:34 2008 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA.  OpenVPN 2.0-beta16 and earlier used 5000 as the default port.
 Sat Jul 26 12:44:34 2008 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
 Sat Jul 26 12:44:34 2008 TUN/TAP device tun0 opened
 Sat Jul 26 12:44:34 2008 TUN/TAP TX queue length set to 100
 Sat Jul 26 12:44:34 2008 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
 Sat Jul 26 12:44:34 2008 Data Channel MTU parms [ L:1500 D:1450 EF:0 EB:4 ET:0 EL:0 ]
 Sat Jul 26 12:44:34 2008 Local Options hash (VER=V4): '7d01953d'
 Sat Jul 26 12:44:34 2008 Expected Remote Options hash (VER=V4): '08b6a7d0'
 Sat Jul 26 12:44:34 2008 Socket Buffers: R=[109568->131072] S=[109568->131072]
 Sat Jul 26 12:44:34 2008 UDPv4 link local (bound): [undef]:1194
 Sat Jul 26 12:44:34 2008 UDPv4 link remote: 172.16.2.1:1194
 Sat Jul 26 12:44:40 2008 Peer Connection Initiated with 172.16.2.1:1194
 Sat Jul 26 12:44:40 2008 Initialization Sequence Completed

Kummassegi arvutiss moodustatakse automaatselt tun seade ning seadistatakse vastavalt käsureal näidatud parameetritele, OpenBSD poolel

 tuvike-openbsd# ifconfig tun0 
 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
       groups: tun
       inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff

ning Debiani poolel

 kalake-debian# ifconfig tun0
 tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
           inet addr:10.8.0.2  P-t-P:10.8.0.1  Mask:255.255.255.255
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
           RX packets:31 errors:0 dropped:0 overruns:0 frame:0
           TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:100 
           RX bytes:4604 (4.4 KiB)  TX bytes:5508 (5.3 KiB)

Ühenduse kontrollimisel peab saama teise arvutisse üle võrgu ligi, nt pingida või ssh abil sisse logida pöördudes tunneli teise otsa aadressiga. Millegipärast OpenBSD poolel ei saa nö omapoolse otsa poole pöörduda, aga praktiliselt ei ole see ka oluline.

Staatilise võtmega krüptitud ühendus

Sarnane eelmisele, kuid ühenduse krüptimiseks kasutavad osalised ühist saladust staatilise võtme kujul. Esmalt tuleb moodustada saladus öeldes

 # cd /etc/openvpn
 # openvpn --genkey --secret saladus.key

Seejärel kopeerida teisele osalisele ning öelda

 tuvike-openbsd# openvpn --remote 172.16.5.15 --dev tun0 --ifconfig 10.8.0.1 10.8.0.2 --verb 3 --secret saladus.key
 kalake-debian# openvpn --remote 172.16.2.1 --dev tun0 --ifconfig 10.8.0.2 10.8.0.1 --verb 3 --secret saladus.key

Sertifikaatide haldamine Easy-RSA tarkvara abil

Lisaks krüptimita ja staatilise võtmega krüptitud ühendusele saab OpenVPNi seadistada kasutama avaliku võtme sertifikaate ja seda tulekski OpenVPNi nö tootmises kasutamisel eelistada. OpenVPN pakett sisaldab avaliku võtmega krüptimisel vajalike sertifikaatide halduseks pisikest CA programmide kompleti. Käesolevas punktis kirjeldatakse selle CA kasutamist OpenBSD platvormil, eesmärgiks on moodustada sertifikaadid ning need seejärel osa neist klientidesse kopeerida.

Esmalt tuleb moodustada mõned kataloogid ja failid

 # mkdir /etc/openvpn /etc/openvpn/keys
 # touch /etc/openvpn/keys/index.txt
 # echo 01 > /etc/openvpn/keys/serial
 # cp /usr/local/share/examples/openvpn/easy-rsa/openssl.cnf /etc/openvpn

Seada sobivab keskkonnamuutujad

 # . /usr/local/share/examples/openvpn/easy-rsa/vars

Seejärel tuleb genereerida sertifikaadid

  • Süsteemi CA sertifikaat
 # /usr/local/share/examples/openvpn/easy-rsa/build-ca

Oluline on, et CA ja järgneval serveri sertifikaadil oleks sama organisatsiooni nimi, sisestage mõistlikud andmed, näiteks

 ...
 Country Name (2 letter code) [KG]:EE
 State or Province Name (full name) [NA]:Tartu
 Locality Name (eg, city) [BISHKEK]:Tartu
 Organization Name (eg, company) [OpenVPN-TEST]:LOOMAAED
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) []:ca.loomaaed.tartu.ee
 Email Address [me@myhost.mydomain]: ca@ca.loomaaed.tartu.ee
 ..

Tekivad failid

 /etc/openvpn/keys/ca.key
 /etc/openvpn/keys/ca.crt
  • OpenVPN serveri sertifikaat
 # /usr/local/share/examples/openvpn/easy-rsa/build-key-server server
 ...
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'EE'
 stateOrProvinceName   :PRINTABLE:'Tartu'
 localityName          :PRINTABLE:'Tartu'
 organizationName      :PRINTABLE:'LOOMAAED'
 commonName            :PRINTABLE:'tuvike.loomaaed.tartu.ee'
 emailAddress          :IA5STRING:'ca@ca.loomaaed.tartu.ee'
 Certificate is to be certified until Jul 23 18:03:58 2018 GMT (3650 days)
 Sign the certificate? [y/n]:y
 ..

Tekivad failid

 /etc/openvpn/keys/server.key
 /etc/openvpn/keys/server.crt
  • OpenVPN kliendi sertifikaat, erinevatel klientidel peavad olema erinevad commonName'id
 # /usr/local/share/examples/openvpn/easy-rsa/build-key kalake
 ..
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'EE'
 stateOrProvinceName   :PRINTABLE:'Tartu'
 localityName          :PRINTABLE:'Tartu'
 organizationName      :PRINTABLE:'LOOMAAED'
 commonName            :PRINTABLE:'kalake.loomaaed.tartu.ee'
 emailAddress          :IA5STRING:'ca@ca.loomaaed.tartu.ee'
 Certificate is to be certified until Jul 23 18:11:25 2018 GMT (3650 days)
 Sign the certificate? [y/n]:y
 ..

Tekivad failid

 /etc/openvpn/keys/kalake.key
 /etc/openvpn/keys/kalake.crt

Süsteemi CA sertifikaat ning kliendi sertifikaat ning salajane võti tuleb kopeerida kliendi arvutisse kasutades mõnda turvalist vahendit, nt SSH

 # scp /etc/openvpn/keys/kalake.crt /etc/openvpn/keys/kalake.key /etc/openvpn/keys/ca.crt root@kalake:/etc/openvpn/keys
  • Diffie-Hellmani asjad
 # /usr/local/share/examples/openvpn/easy-rsa/build-dh

või sisuliselt samaväärne on öelda

 # openssl dhparam -out dh2048.pem 2048


Tekib fail

 /etc/openvpn/keys/dh1024.pem

Sertifikaatide haldamine TinyCA tarkvara abil

Tundub, et TinyCA on suhteliselt sobiv praktiliseks kasutamiseks, lisaks muudab kasutamise mugavamaks graafiline haldusliides. TinyCA kasutamist on kirjeldatud palas http://kuutorvaja.eenet.ee/wiki/TinyCA_kasutamine

OpenVPN ruuditud lahenduse serveri seadistamine

Olgu eesmärgiks seada käima sellistele tingimustele vastav OpenVPN lahendus

  • OpenVPN kliendid kasutavad personaalseid sertifikaate, iga kasutaja kasutab talle usaldatud privaatset ip aadressi, mis on seotud sertifikaadiga
  • OpenVPN serveri aadress on 192.168.99.90
  • OpenVPN kasutajate jaoks kasutatakse alamvõrku 172.19.0.0/16, serveri vpn seadmel on aadress 172.19.0.1/30
  • kasutaja tla-martkask.vpn.loomaaed.tartu.ee kasutab vpn aadress 172.19.0.5/30 ja seadistatakse võrgu 10.0.13.0/24 ruuting
  • kasutaja tla-priitkask.vpn.loomaaed.tartu.ee kasutab vpn aadresi 172.19.0.9/30 ja seadistatakse kogu liiklus käima läbi VPN serveri, kusjuures ta kasutab serveri küljes olevast alamvõrgust nimeserverit 192.168.2.49
local 192.168.99.90
port 1194
proto udp
dev tun0
ca /etc/openvpn/keys/VPN-TLA-ca.pem
cert /etc/openvpn/keys/server.vpn.loomaaed.tartu.ee-cert.pem
key /etc/openvpn/keys/server.vpn.loomaaed.tartu.ee-key.pem
dh /etc/openvpn/keys/dh2048.pem

mode server
tls-server
ifconfig 172.19.0.1 172.19.0.2
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3

client-config-dir /etc/openvpn/ccd
route 172.19.0.0 255.255.0.0

kus

  • ca - juurmised sertifikaadid, mille abil kasutajate sertifikaate kontrollitakse
  • cert, key - OpenVPN serveri sertifikaadid, mille abil saab server klientidega turvaliselt suhelda

Kataloogi /etc/openvpn/ccd tuleb moodutada kasutajate personaalsed seadistusfailid. Kasutaja Mart Kask jaoks sellise sisuga

 # cat /etc/openvpn/ccd/tla-martkask.vpn.loomaaed.tartu.ee
 ifconfig-push 172.19.0.5 172.19.0.6
 push "route 10.0.13.0 255.255.255.0"

ning kasutaja Priit Kask jaoks selline

 # cat /etc/openvpn/ccd/tla-priitkask.vpn.loomaaed.tartu.ee
 ifconfig-push 172.19.0.9 172.19.0.10
 push "dhcp-option DNS 192.168.2.49"
 push "redirect-gateway def1"

Tulemusena tekib vpn serverisse tun0 seade

 # ifconfig tun0
 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
         priority: 0
         groups: tun
         inet 172.19.0.1 --> 172.19.0.2 netmask 0xffffffff

ning tekivad seoses vpn'iga serverisse juurde sellised ruutingud

 server# route -n show | grep tun 
 172.19/16          172.19.0.2         UGS        0       75     -     8 tun0
 172.19.0.2         172.19.0.1         UH         1        1     -     4 tun0

Palas http://kuutorvaja.eenet.ee/wiki/OpenVPN_kliendi_kasutamine_OpenBSD%27ga on kirjeldatud ruuditud ühendusega OpenBSD kliendi vastavat seadistamist ja seda milline tun seade ning ruutingud kliendi poolel on.

VPN ühenduste juures on oluline tähele panna, et andmevahetuse korraldamisel peavad olema sobivalt seadistatud

  • ruutingud
  • paketifilter

Selleks, et olla kindel, et katsetamisel paketifilter ei eksitaks saab paketifiltri seadistusfailis lubada üle tun0 seadme igasugust liiklust kasutades rida, peale katsetamist tuleb kindlasti sellel seadmel liiklust kontrollida

 set skip on tun0

OpenVPN serveri käivitamine

OpenVPN serveri käsurealt käivitamiseks ja nii, et protsess jääb terminalile käima, sobib öelda

 # openvpn --config /etc/openvpn/openvpn.conf

openvpn protsessi nn juhtterminalist (ingl. k. controlling terminal) lahtiühendamiseks st nö deemonina käivitamiseks tuleb lisada parameeter --daemon.

Serveri töö lõpetamiseks tuleb saata protsessile SIGTERM (vaikesignaal), kui PID on openvpn protsessi number

 # kill PID

Selleks, et OpenVPN server käivituks arvuti alglaadimisel automaatselt tuleb kasutada /etc/rc.local failis nt rida

 /usr/local/sbin/openvpn --config /etc/openvpn/openvpn.conf --daemon

OpenVPN sillatud lahenduse serveri seadistamine

Vajalik on moodustada sild füüsilise ja tun seadme vahele, kusjuures link0 lipuga määratakse, et tun seade töötab layer 2 kihis

 # ifconfig bridge0 create
 # ifconfig tun0 link0 up
 # brconfig bridge0 add em0 add tun0
 # ifconfig bridge0 up

Serveri poolel sobib kasutada sellist seadistusfaili sillatud režiimis

 # cat /etc/openvpn/openvpn.conf
 local 172.16.2.1
 port 1194
 proto udp
 dev-type tap
 dev tun0
 ca keys/ca.crt
 cert keys/server.crt
 key keys/server.key
 dh keys/dh1024.pem
 server-bridge 192.168.3.254 255.255.255.0 192.168.3.210 192.168.3.220
 ifconfig-pool-persist /tmp/ipp.txt
 push "redirect-gateway local def1"
 keepalive 10 120
 comp-lzo
 user nobody
 group nobody
 persist-key
 persist-tun
 status /var/log/openvpn-status.log
 verb 3

Kasutaja sertifikaadi kontroll

Kui CA on väljastanud paljudele kasutajatele sertifikaate ja soovitakse OpenVPN kasutajate hulka piirata, siis tuleb täiendavalt kontrollida, millised kasutajad sertifikaatide omanike hulgast on õigustatud ligipääsusema OpenVPN serverile. See võiks olla nt aktuaalne kui OpenVPN server on seadistatud käima nii, et kasutajaid autenditakse Eesti ID-kaardi sertifikaatidega.

Sellise kontrolli tegemiseks on ettenähtud OpenVPN serveri seadistusfailis parameetr tls-verify, nt

 tls-verify /etc/openvpn/tls-verify-esteid.pl

kus skript tls-verify-esteid.pl sisu on selline

 # cat /etc/openvpn/tls-verify-esteid.pl
 #!/usr/bin/perl
 ($depth, $x509) = @ARGV;
 if ($depth == 0) {
   if ($ENV{X509_0_serialNumber} eq "37003212713") {
     exit 0;
   }
   exit 1;
 }
 exit 0;

Kasutaja pöördumisel kutsutakse seda skript välja nii mitu korda kuni on ahelas elemente, Eesti ID-kaardi puhul kolm korda, kusjuures automaatselt väärtustatakse väljakutsumisel kaks nn argumenti

  • $depth - ahela number, mis igal järgmisel korra väheneb ühe võrra
  • $x509 - sertifikaadi Subject (antud juhul selle väärtust ei kasutata)

Eesti ID-kaardi puhul on argumendid sellised

 2 /emailAddress=pki@sk.ee/C=EE/O=AS_Sertifitseerimiskeskus/CN=Juur-SK
 1 /C=EE/O=AS_Sertifitseerimiskeskus/OU=ESTEID/CN=ESTEID-SK_2007
 0 /C=EE/O=ESTEID/OU=authentication/CN=OOLBERG_IMRE_37003212713/SN=OOLBERG/GN=IMRE/serialNumber=37003212713

Lisaks argumentidele saab skript sees kasutada keskkonnamuutujate väärtusi, toodud näites on kasutatud $ENV{X509_0_serialNumber} väärtust, milleks on kasutaja isikukood.

Toodud näide ei ole praktiliselt eriti kasutatav, kuid on vaid tehnika küsimus konstrueerida juurde OpenVPN serveri teenuse ligi pääsema peavate kasutajate isikukoodide kontroll nt andmebaasist või LDAP kataloogist.

CA tühistusnimekirja kasutamine

TODO

Mitme CA suhtes väljastatud sertifikaatide kasutamine

Ühe ja sama OpenVPN serveriga (protsessiga) saab teenindada mite CA poolt väljaantud sertifikaatide kasutajaid, nt nö kohalik CA ning Eesti ID-kaardi kasutajad. Selles tuleb kopeerida kõik kasutaja sertifikaatidest nö üles poole jäävad sertifikaadid kokku ühte faili ja näidata see ca parameetrina, nt kuhu on kokku ühendatud SK ja Tartu Loomaaia juur ja kesmise taseme sertifikaadid

 ca sk-tla-ca.pem

Paketifiltri seadistamine

Kuna tun võrguseade käitub operatsioonisüsteemi suhtes tavalise võrguseadmena, siis tuleb paketifiltri seadistamisel arvestada asjaolusid ning kirjutada reeglid tavalisel moel. Tun seadmel on liiklus kürptimata st sobiv koht debugimiseks.

Kasutajagruppide haldamine

Üks levinud nõudeid VPN-lahenduse juures on jagada kasutajaid gruppidesse ja neile gruppidele anda ligipääse nö VPN serveri tagusele territooriumile, erinevatele gruppide erineval määral ligipääse. Kui OpenVPN serverina kasutatakse OpenBSD tulemüüri, siis võiks seda korraldada hõlpsasti paketifiltri (PF) abil, seejuures on eelduseks, et kasutajatele on omistatud fikseeritud ip aadressid. Sedasi saab erinevate gruppide piiranguid kehtestada sihtpunkti protokolli, ip aadress ja pordi täpsusega.

OpenVPN parameeteri client-config-dir (ccd) abil saab konkreetse kasutaja jaoks täpsustada tema seadistusi. Selleks peab OpenVPN seadistusfail sisaldama rida, mis näitab kus asub failisüsteemis ccd kataloog

 client-config-dir /etc/openvpn/ccd

ccd kataloogis on kliendi-spetsiifilised seadistusfailid, mille nimedena kasutatakse kliendi sertifikaadis näidatud domeenime, nt

 # cat /etc/openvpn/ccd/martkask.vpn.loomaaed.tartu.ee
 ifconfig-push 172.17.1.5 172.17.1.6
 push "route 192.168.2.0 255.255.255.0"
 push "route 10.0.5.0 255.255.255.0"

Antud juhul on täpsustatud kliendi Mart Kask fikseeritud ip aadress ja talle ruutingu andmete saatmine, mida vpn klient kasutab oma ruutingutabelis.

Tundub, et praktiliselt on sobiv igale kliendile planeerida /30 subnet.

Paketifiltri abil kontrollitakse klientide ligipääsu OpenVPN serveri taga olevatesse võrkudesse. Tundub, et kõige efektiivsem on jagada klientide ip aadressid gruppidesse ja panna nad kirja paketifiltris vastavatesse tabelitesse, nt <openvpn_arendajad>, <openvpn_testijad>, <openvpn_administraatorid> ning nende tabelite alusel ligipääsemist lubada. Üks ja sama aadress võib seejuures kuuluda samaaegselt mitmesse gruppi ehk paketifiltri tabelisse.

 # arendajad
 pass in quick on $openvpn inet from <openvpn_arendajad> to $arendus_subnet tag FROM_OPENVPN $udpopts (tcp.established 1064000) label "JSopenvpn_from_arendajad"
 
 # testijad
 pass in quick on $openvpn inet from <openvpn_testijad> to $test_subnet tag FROM_OPENVPN $udpopts (tcp.established 1064000) label "JSopenvpn_from_testijad"
 
 # administraatorid
 pass in quick on $openvpn inet from <openvpn_administraatorid> to any tag FROM_OPENVPN $udpopts (tcp.established 1064000) label "JSopenvpn_from_administraatorid"
 
 ...
 
 pass out quick on vorguseadmetegrupp tagged FROM_OPENVPN $udpopts (tcp.established 864000) label "JVsmd_from_openvpn_to_vorgud"

Probleemid

  • Tundub, et OpenVPN abil ei saa kasutada kliendisertifikaatide kehtivuse kontrollimiseks OCSP'd kuna tls-verify skriptile ei edastada kliendi esitatud sertifikaati (vaid ainult sertifikaadist saadud komponente, nt CN).
  • Dünaamiliste ja staatiliste klientide aadresside kasutamise süsteemi vahel valiku tegemisel võiks arvestada selliseid asjaolusid; staatilised aadressid: openvpn kaudu ligipääsetavate serverite logidest on hea otsida kasutaja tegevuse jälgi; dünaamilised: kasutaja saab sama sertifikaadiga mitmest kohast samaaegselt olla sisselogitud

Märkused

4.6 käivitamise võimalus

 --- openvpn-2.1rc15p2 -------------------
 OpenVPN re-creates the tun(4) interface at startup; compatibility
 with PF is improved by starting it from hostname.if(5). For example:
 
 # cat << EOF > /etc/hostname.tun0
 up
 !/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
 EOF

OpenVPN klientide vaheline liiklus läbi OpenVPN serveri

Ruutivas režiimis töötava OpenVPN kliendid saavad omavahel suhelda kahel viisil

  • klientide vaheline liiklus käib üle serveri tun0 seadme - klientide vahelist liiklust saab paketifiltriga kontrollida
  • klientide vaheline liiklus käib nö openvpn protsessi sees - klientide vahelist liiklust ei saa kontrollida OpenVPN serverist

Seda asjaolu, et kliendid saavad üksteise poole pöörduda tuleb tõsiselt arvestada, et kliendi arvutisse OpenVPN kanali kaudu ei pääseks volitamatult sisse ja vajadusel rakendada sobivad paketifiltri reeglid OpenVPN kliendi arvutis.

klientide vaheline liiklus üle tun0 seadme

Kuna kõik OpenVPN kliendid suhtlevad serveriga kasutades ühte ja sama serveri protsessi, siis iseenesest saab OpenVPN server toimida ruuterina klientide jaoks.

  • serveri paketifilter peab lubama tun0 seadmesse sisse ja sealt välja klientide liiklust, nt
pass in quick on tun0 inet from 172.26.0.9 to 172.26.0.25 tag FROM_VPN_TO_VPN
pass out quick on tun0 inet tagged FROM_VPN_TO_VPN
  • klientide jaoks tuleb seadistada ruuting selliselt, et teistel klientide poole suunduvad paketid väljuksid kliendi tun0 seadmest

klientide vaheline liiklus läbi openvpn protsessi

Kuna kõik OpenVPN kliendid suhtlevad serveriga kasutades ühte ja sama serveri protsessi, siis iseenesest saab OpenVPN server toimida ruuterina klientide jaoks. Sellise openvpn protsessi sees toimiva ruutimise sisselülitamiseks tuleb

  • serveri seadisusfailis kasutada rida
client-to-client
  • klientide jaoks seadistada ruuting selliselt, et teistel klientide poole suunduvad paketid väljuksid kliendi tun0 seadmest

OpenVPN serverite vaheline liiklus läbi OpenVPN kliendi

Tehniliselt on võimalik korraldada, et kahe OpenVPN serveri taga olevate võrkude vahel toimub liiklus läbi OpenVPN kliendi. Tõenäoliselt on sellest võimalusest kasulik aru saada, mitte eesmärgiga seda teha, vaid eesmärgiga seda ära hoida.

                                ______
                               |      |  OpenVPN klient
                               |______|
                          tun0   |  |  tun1 
                                 |  |
                                 |  |
----|----- üks openvpn võrk -----|  |--- teine openvpn võrk -----------------|----
    |                                                                        |            
  __|__   tun0                                                             __|__   tun0
 |     |  172.26.0.25                                                     |     |  172.26.0.9
 |_____|  (site A, OpenVPN server)                                        |_____|  (site B, OpenVPN server)
    |    eth0 (10.125.13.1)                                                  |    eth0 (10.109.13.1)
    |                                                                        |
----|---- 10.125.13.0/24 -----|-------                                   ----|---- 10.109.13.0/24 -----|-------
                              |                                                                        |
                            __|__  eth0                                                              __|__  eth0
                           |     | 10.125.13.25                                                     |     | 10.109.13.9
                           |_____|                                                                  |_____|

kus

  • site A ja B arvutites töötavad OpenVPN serveri protsessid
  • OpenVPN kliendis on käivitatud kaks OpenVPN protsessi, mis peavad ühendust kummagi saidi serveritega, vastavalt seadmed tun0 ja tun1

Tulemuse saavutamiseks tuleb lisaks nö tavalisele OpenVPN kliendi kasutamisele

  • kliendis sisse lülitada IP pakettide forwarding
# sysctl -w net.ipv4.ip_forward=1
  • Ühes OpenVPN serveris kasutada selliseid ruutingud
route 192.168.10.250 255.255.255.255
iroute route ...
  • Teises OpenVPN serveris kasutada selliseid ruutingud
route 192.168.10.250 255.255.255.255
iroute route ...
  • OpenVPN serverite ja OpenVPN kliendi paketifiltrid peavad vastavat liiklust läbi laskma

Site-to-site lahenduse kasutamine

Tavaliselt kasutatakse OpenVPN tarkvara ühe OpenVPN serveri kaudu mingitele nö teenusete võrgudele nt mobiilstest töökohtadest ligipääsu tekitamiseks. OpenVPN abil saab edukalt omavahel ühendada ka mitu arvutivõrku, nt selliselt

                                _____
                               |     |  OpenVPN server
                               |_____|
                                  |    tun0 
                                  |
                                  |
----|-----------------------------|---- openvpn võrk -----------------------|----
    |                                                                       |            
  __|__   tun0                                                            __|__   tun0
 |     |  172.26.0.25                                                    |     |  172.26.0.9
 |_____|  (site A)                                                       |_____|  (site B)
    |    eth0 (10.125.13.1)                                                 |    eth0 (10.109.13.1)
    |                                                                       |
----|---- 10.125.13.0/24 -----|-------                                  ----|---- 10.109.13.0/24 -----|-------
                              |                                                                       |
                            __|__  eth0                                                             __|__  eth0
                           |     | 10.125.13.25                                                    |     | 10.109.13.9
                           |_____|                                                                 |_____|

kus

  • kasutatakse kolmes arvutis töötavaid OpenVPN protsesse, kusjuures site-A ja site-B vaheline liiklus käib läbi OpenVPN serveri
  • omavahel peavad saama andmeid vahetada OpenVPN klientide .0.25 ja .0.9 tagused võrgud, vastavalt 10.125.13/24 ja 10.109.13/24.

Tulemuse saavutamiseks tuleb lisaks nö tavalisele OpenVPN serveri kasutamisele

  • ruutida serveris 10.101.13.0/24 võrk tun0 seadmele kasutades serveri seadistusfailis read
route 10.125.13.0 255.255.255.0
route 10.109.13.0 255.255.255.0
  • selleks, et serveri openvpn protsess teaks, millisele kliendile 10.125.13/24 võrku ja millisele 10.109.13/24 võrku suunata tuleb OpenVPN serveri .0.25 OpenVPN kliendi ccd seadistusfailis kasutada rida (iroute - internal route, st openvpn protsessi sisemine route)
iroute 10.125.13.0 255.255.255.0

ning .0.9 kliendi ccd failis kasutada rida

iroute 10.109.13.0 255.255.255.0
  • .0.25 kliendile tuleb tema ccd faili abil öelda, et 10.109.13/24 ruuditakse OpenVPN serverile (ja sealt ruuditakse edasi)
push "route 10.109.13.0 255.255.255.0"
  • .0.9 kliendile tuleb tema ccd faili abil öelda, et 10.125.13/24 ruuditakse OpenVPN serverile (ja sealt ruuditakse edasi)
push "route 10.125.13.0 255.255.255.0"
  • OpenVPN serveris ning klientides tuleb paketifiltriga vastav liiklus lubada

Kasulikud materjalid