Az OpenVpn

Az OpenVPN az egyik legelterjedtebb VPN típus a PPtP és az L2TP mellett.

Wireles ("Drótnélküli") router
A routerek egy része is kezeli az OpenVPN-t. Az OenVRT az arra alkalmas eszközökön lehetővé teszi a használatát

Jellemzője, hogy nyílt forráskódú, a beállításainak a száma a csillagokéval vetekszik.
Ez a jellemzője egyfelől hatalmas előny, hiszen ha bármely használt technikai részmegoldás kompromittálódik, egyszerűen választhatunk helyette másikat (ette jó példa a BlowFish cipher esete). Ugyan ez hatalmas hátrány, hiszen a jó beállítás jelentősen nagyobb felkészültséget igényel, mint a másik két említett versenyző esetén.

Az OpenVPN sokáig a BlowFish 1 titkosítási eljárást favorizálta, azonban az kompromittálódott. Szerencsére a készítők nem annak az utódját a Twofish 2-t választották, hanem a szabványos AESt 3 kódolás családot, bár konkrét megvalósítástól függően sok más ciphetrt is használhatunk.
Ugyan publikáltak az AES-re több részlegesen sikeres törési eljárást, a polgári életben megfelelő biztonságot nyújt. Az ismert törési eljárások a törés nehézségét nem csökkentik a gyakorlatban elfogadható mértékűre. Ha a hozzáértők nem köveznek meg, azt mondom, hogy 1-3 bittel csökkentik az effektív kulcshosszat, ami azt jelenti, hogy 256 bit helyett „csak” 253 bit kulcsot kell törni.

Az OpenVPN több chipert támogat, a konkrét lista azonban az adott telepítés paraméterezésétől függ. A mintaként használt LEDE rendszeren ezt a listát kapjuk az openvpn --show-ciphers utasításra:

AES-128-CBC (128 bit key, 128 bit block)
AES-128-CFB (128 bit key, 128 bit block, TLS client/server mode only)
AES-128-CFB1 (128 bit key, 128 bit block, TLS client/server mode only)
AES-128-CFB8 (128 bit key, 128 bit block, TLS client/server mode only)
AES-128-GCM (128 bit key, 128 bit block, TLS client/server mode only)
AES-128-OFB (128 bit key, 128 bit block, TLS client/server mode only)
AES-192-CBC (192 bit key, 128 bit block)
AES-192-CFB (192 bit key, 128 bit block, TLS client/server mode only)
AES-192-CFB1 (192 bit key, 128 bit block, TLS client/server mode only)
AES-192-CFB8 (192 bit key, 128 bit block, TLS client/server mode only)
AES-192-GCM (192 bit key, 128 bit block, TLS client/server mode only)
AES-192-OFB (192 bit key, 128 bit block, TLS client/server mode only)
AES-256-CBC (256 bit key, 128 bit block)
AES-256-CFB (256 bit key, 128 bit block, TLS client/server mode only)
AES-256-CFB1 (256 bit key, 128 bit block, TLS client/server mode only)
AES-256-CFB8 (256 bit key, 128 bit block, TLS client/server mode only)
AES-256-GCM (256 bit key, 128 bit block, TLS client/server mode only)
AES-256-OFB (256 bit key, 128 bit block, TLS client/server mode only)

The following ciphers have a block size of less than 128 bits,
and are therefore deprecated. Do not use unless you have to.

BF-CBC (128 bit key by default, 64 bit block)
BF-CFB (128 bit key by default, 64 bit block, TLS client/server mode only)
BF-OFB (128 bit key by default, 64 bit block, TLS client/server mode only)
CAST5-CBC (128 bit key by default, 64 bit block)
CAST5-CFB (128 bit key by default, 64 bit block, TLS client/server mode only)
CAST5-OFB (128 bit key by default, 64 bit block, TLS client/server mode only)
DES-CBC (64 bit key, 64 bit block)
DES-CFB (64 bit key, 64 bit block, TLS client/server mode only)
DES-CFB1 (64 bit key, 64 bit block, TLS client/server mode only)
DES-CFB8 (64 bit key, 64 bit block, TLS client/server mode only)
DES-EDE-CBC (128 bit key, 64 bit block)
DES-EDE-CFB (128 bit key, 64 bit block, TLS client/server mode only)
DES-EDE-OFB (128 bit key, 64 bit block, TLS client/server mode only)
DES-EDE3-CBC (192 bit key, 64 bit block)
DES-EDE3-CFB (192 bit key, 64 bit block, TLS client/server mode only)
DES-EDE3-CFB1 (192 bit key, 64 bit block, TLS client/server mode only)
DES-EDE3-CFB8 (192 bit key, 64 bit block, TLS client/server mode only)
DES-EDE3-OFB (192 bit key, 64 bit block, TLS client/server mode only)
DES-OFB (64 bit key, 64 bit block, TLS client/server mode only)
DESX-CBC (192 bit key, 64 bit block)
RC2-40-CBC (40 bit key by default, 64 bit block)
RC2-64-CBC (64 bit key by default, 64 bit block)
RC2-CBC (128 bit key by default, 64 bit block)
RC2-CFB (128 bit key by default, 64 bit block, TLS client/server mode only)
RC2-OFB (128 bit key by default, 64 bit block, TLS client/server mode only)

Tekintélyes lista, még akkor is, ha a gyakorlatban csak a piros sorok feletti rész használata a javasolt (elfogadható).

Ha ugyan ezt a parancsot PC-n futó UBUNTU alatt adjuk ki, a lista jelentősen impozánsabb lesz, tartalmazni fog CAMELLIA és SEED alapú ciphereket is 4

A lista tartalmaz elavult tételeket is, a régebbi rendszerekkel való kompatibilitás miatt . Ilyen például a 3DES, amit arra találtak ki, amikor az 56 bites DES-t megtörték, hogy legyen valami, amíg az új szabvány elterjed (Ez lett az AES). Ez a módszer manapság már elavult is lassú is.

Az Elliptic-curve (vajon hogyan mondják ezt magyarul? Elliptikus görbe?) alapú eljárások korszerűbbek, gyorsabbak és rövidebb kulcsokat igényelnek, mint az RSA.

Természetesen a TLS cipherek között is dúskálhatunk, a listát az openvpn --show-tls utasítással kérhetjük:

Available TLS Ciphers,
listed in order of preference:

TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384
TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA
TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA
TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
TLS-DHE-RSA-WITH-AES-256-CBC-SHA
TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256
TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256
TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA
TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA
TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
TLS-DHE-RSA-WITH-AES-128-CBC-SHA

Az egyes tételek azért ilyen hosszúak, mert felsorolják a kulcscsere_aláírás_WITH_Titkosítási algoritmus_Üzenet-authentikációa_algoritmus Igy egyetlen sorban leírja a teljes adatkezelési folyamatot.

Az egyes rendszereken ez a lista is jelentően eltérhet az itt bemutatottól.

Az AES titkosítás jellegzetessége miatt érdemes elgondolkodni, hogy 256 bites vagy 192 bites titkosítást használunk-e. A 4096 byte RSA kulcs erőssége hozzávetőleg a 192 bit AES kulcsnak felel meg. Itt filozófiai kérdés, hogy AES kulcshossznak 192 bitet választunk, az egyenszilárdságú tervezés elve alapján, vagy a 256-osat, mint legbiztonságosabbat.

Kisebb teljesítményű rendszereken 192 hosszúságot választom, mert valamivel kisebb terhelést jelent és egy minimális számítási teljesítménnyel rendelkező eszköz esetén ez számít.

Egy rendszer összeállításánál gondoljuk végig, hogy kell-e arra számítanunk, hogy nem saját kézben lévő eszközzel VPN kapcsolatot létesíteni. Ha nem, akkor egyszerűen tls-cipher kulcsszó után fel kell azokat a ciphereket sorolni, amire feltétlenül szükségünk van.

tls.cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384

Arra oda kell figyelni, hogy legyen olyan cipher, ami kliens és szerver oldalon is szerepel (ez eltérő verziójú OpenVPN vagy SSL csomagok esetén lehet probléma).

A TLS rendszer ismert hibái miatt a tls-version-min 1.2 beállítása ajánlott. Ez biztosítja, hogy az OpenVPN ne használja a TLS 1.0 verzióját, ami ismert sebezhetőségeket tartalmaz és az elavultnak tekinthető 1.1 verziót sem.

Természetesen a
auth none
cipher none

beállítással elérhető, hogy az OpenVPN se titkosítást se azonosítást ne követeljen meg/szolgáltasson. Nagyon speciális esetekben, amikor biztonságos hálózaton használjuk a VPN-t, ahol csak logikai szerepe van ez a beállítás lehet helyes, azonban a tapasztaltabbak azonnal felteszik a kérdést: Ilyen feladatra miért VPN-t és miért nem VLAN-t használunk.

A man in the middle (közbeékelődéses) támadások elkerülése érdekében célszerű azonosítást beállítani.
Generáljuk le a kulcsot. (általában ta.key néven emlegetik, de a neve tetszőleges lehet)

openvpn --genkey --secret ta.key

Ugyan ezt a kulcsot használjuk a szerveren és az összes kliensen is (Természetesen tartsuk titokban)
A szerveren:
tls-auth ta.key 0

A klienseken:
tls-auth ta.key 1

Valamint a szerveren:

remote-cert-tls client

A klienseken:

remote-cert-tls server

paramétert célszerű beállítani.

A kulcsok elosztása

A kulcsokat legeneráljuk. (Az Easy-Rsa csomagban jó lepésről-lépésre utasítás van hozzá). Ha a kulcsok minősége különösen fontos, akkor vizsgáljuk meg az Easy-RSA csomagban található scripteket és utasításokat, ezután pedig a kulcsokat kissé módosított paraméterekkel generáljuk le, vagy találhatóak nagyon biztonságok kulcsok kézi generálására leírások, válasszunk egyet.

A kulcsokat mindig olyan gépen generáljuk, amelyben megbízunk és amelynek az entrópiája magas, hogy jó véletlen számokkal lehessen dolgozni.

Egy lehetséges ellenőrzés:

cat /proc/sys/kernel/random/entropy_avail

Ha a visszaadott érték 200 alatt van, akkor nem nyert.

Egy mérés szerint egy routeren ez az érték 290, egy grafikus felülettel ellátott munkaállomáson 3306.

Ha van lehetőségünk több Linuxos/Unixos géphez is hozzáférni, akkor a legmagasabb értékkel rendelkezőn generáljuk a kulcsokat.
A virtuális gépek, illetve a router ilyen feladatra csak erősen korlátozottan alkalmas, mert az entrópia értéke viszonylag alacsony, ezért az előállított véletlen szám nem lesz eléggé kiszámíthatatlan.

A legenerált kulcsokat a megfelelő helyeken kell elhelyezni.
Legyenek a kulcsaink a következők (Beszélő neveket választottam):
ca.key
ca.crt
server.key
server.crt
kliens.key
kliens.crt
dh.4096.pem
ta.key

A ca.key „megy a fiókba”. Az igazából csak akkor kell, ha újabb kulcsokat szeretnénk generálni

A ca.crtserver.key server.crt dh.4096.pem ta.key kell a szerverre
A ca.crt kliens.key kliens.crt ta.key kell a kliensre. Természetesen, ha egy szerverhez több kliens tartozik, akkor mindegyikhez célszerű saját kliens.key-t és kliens.crt-t generálni (kliens1.key, kliens2.key).

Most nem bonyolítanám, de ha van rá ok, akkor a szerver és a kliens kulcsokat lehet eltérő ca.key-ből származtatni.

A naiv módszer, hogy minden kulcsot mindenhova bemásolunk nagyon komoly biztonsági kockázatokat rejt magában, ezért ne csináljunk ilyent.

Hálózati struktúra

Hálózat-hálózat kapcsolat

A kulcsok és a titkosítási algoritmusok kiválasztásával párhuzamosan a hálózati struktúra megtervezése is alapvető, hiszen azért tervezünk VPN kapcsolatot, hogy azon adatokat mozgassunk.

A hálózati struktúra megtervezése már akkor megkezdődik, amikor megszületik a döntés a VPN használatáról.

Az összekapcsolt egységek szerint:

  • Munkaállomások közötti (eszközök közötti) kapcsolat
  • Munkaállomás és hálózat közötti kapcsolat
  • Hálózatok közötti kapcsolat

Az adatáramlás módja szerint:

  • Routolt
  • Bridgelt
Kliens-hálózat kapcsolat

Az OpenVPN fejlesztői alapesetben a routolt hálózatot ajánlják (amikor az OpenVPN kapvsolatnak saját IP címe van), azonban különleges esetekre lehetővé teszik a bridge üzemmódot is. Ez utóbbit terjedelmi okokból itt nem tárgyaljuk.

A szerver alapértelmezett IP címe:

server 10.8.0.0 255.255.255.0

Ezt érdemes megváltoztatni, például így:

server 172.16.1.0 255.255.255.0

Munkaállomások közötti kapcsolat

A kékkel jelzett (viszonylag ritkán használt) helyi IP tartományt úgy kell megválasztani, hogy eltérjen az összekapcsolt hálózatokban használtaktól.

Egy gyors emléjeztető:

A helyi hálózatokra fenntartott IP tartományok:

A tömb méreteKezdőcímVégcímA kiosztható címek száma
24 bites tömb (/8 prefix)10.0.0.010.255.255.25516 777 216
20 bites tömb (/12 prefix)172.16.0.0172.31.255.2551 048 576
16 bites tömb (/16 prefix)192.168.0.0192.168.255.25565 536

A kapcsolat felépítése után már csak a routolási beállításokat kell korrekt módon elkészíteni.

Kapcsolódó cikkek