Az OpenVPN az egyik legelterjedtebb VPN típus a PPtP és az L2TP mellett.
A PPtP manapság már csak történelmi jelentőséggel bír,
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 (erre jó példa, hogy amikor a BlowFish cipher kompromittálódott, egy beállítással le lehetett cserélni). Ugyanez 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 BlowFish1 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 Twofish2-t választották, hanem a szabványos AESt3 kódolás családot, bár konkrét megvalósítástól függően sok más ciphert 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 kulcshosszt, ami azt jelenti, hogy 256 bit helyett „csak” 253 bit kulcsot kell törni.
Az OpenVPN több ciphert 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 ugyanezt a parancsot PC-n futó UBUNTU alatt adjuk ki, a lista jelentősen impozánsabb lesz, tartalmazni fog CAMELLIA és SEED alapú ciphereket is4
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 és 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
Ugyanezt 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.crt
server.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 klienskulcsokat 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 ilyet.
Hálózati struktúra
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
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
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érete | Kezdőcím | Végcím | A kiosztható címek száma |
---|---|---|---|
24 bites tömb (/8 prefix) | 10.0.0.0 | 10.255.255.255 | 16 777 216 |
20 bites tömb (/12 prefix) | 172.16.0.0 | 172.31.255.255 | 1 048 576 |
16 bites tömb (/16 prefix) | 192.168.0.0 | 192.168.255.255 | 65 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
- Az angol nyelvű Wikipédia cikk a BlowFish cipherről[↩]
- Az angol nyelvű Wikipédia cikk a Twofish cipherről[↩]
- Az AESről szóló magyar nyelvű Wikipédia cikk[↩]
- az AES japán és koreai alternatívái.[↩]