Hálózatbiztonság

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(jelszavas hitelesítés)
(adatkapcsolati réteg eleje)
7. sor: 7. sor:
 
** Hálózati réteg: IP, ICMP, ARP
 
** Hálózati réteg: IP, ICMP, ARP
 
** Szállítási réteg: TCP, UDP
 
** Szállítási réteg: TCP, UDP
** Alkalmazási réteg: SMTP, FTP, HTTP (és webalkalmazások), SSL, SSH
+
** Alkalmazási réteg: [[A DNS működése|DNS]], SMTP, FTP, HTTP (és webalkalmazások), SSL, SSH
 
* Vírusok, férgek, botnetek
 
* Vírusok, férgek, botnetek
 
* Single Sign On
 
* Single Sign On
188. sor: 188. sor:
 
***** Jobb "megsózni" jelszót hash-elés előtt: kiegészíteni egy véletlen sztringgel, és azzal együtt hash-elni, majd a hash mellett ezt a sztringet is tárolni.
 
***** Jobb "megsózni" jelszót hash-elés előtt: kiegészíteni egy véletlen sztringgel, és azzal együtt hash-elni, majd a hash mellett ezt a sztringet is tárolni.
 
* A hash-elt jelszótárolás és a kihívás-válasz alapú hitelesítés elvileg ötvözhető; így működik pl. az [http://en.wikipedia.org/wiki/NTLM#NTLMv2 NTLMv2].
 
* A hash-elt jelszótárolás és a kihívás-válasz alapú hitelesítés elvileg ötvözhető; így működik pl. az [http://en.wikipedia.org/wiki/NTLM#NTLMv2 NTLMv2].
  +
  +
=== Ajánlott irodalom ===
  +
  +
* [http://www.tomshardware.com/news/imperva-rockyou-most-common-passwords,9486.html Your Top 20 Most Common Passwords] -- 32 millió kiszivárgott jelszó vizsgálata.
  +
* [http://www.troyhunt.com/2011/07/science-of-password-selection.html Hogyan választanak jelszót az emberek?]
  +
* [http://www.openwall.com/john/ John the Ripper] -- Az egyik legelterjedtebb szótáralapú jelszótörő (képes a szótár szavait szabályok segítségével átírni, kombinálni, és az így nyert szavakkal is próbálkozni).
  +
* [http://www.baekdal.com/insights/password-security-usability egy cikk arról, mennyire könnyű "biztonságos" jelszót kitalálni], [http://www.troyhunt.com/2011/04/bad-passwords-are-not-fun-and-good.html és cáfolata].
  +
* [http://www.unixwiz.net/techtips/iguide-crypto-hashes.html An Illustrated Guide to Cryptographic Hashes] -- Jó, tömör és szemléletes cikk a kriptográfiában használt hash-ekről.
  +
* [http://www.infoworld.com/t/data-security/amazon-ec2-enables-brute-force-attacks-the-cheap-447 Amazon EC2 enables brute-force attacks on the cheap] -- Az Amazon felhőjén néhány dollárért másodpercenként 400.000 jelszót próbálhatunk egy hash-re illeszteni.
  +
* [http://www.troyhunt.com/search/label/Passwords http://www.troyhunt.com/search/label/Passwords] -- Jó cikksorozat a jelszavakról általában.
  +
* [http://www.troyhunt.com/2011/03/only-secure-password-is-one-you-cant.html The only secure password is the one you can’t remember]
  +
* [http://xkcd.com/936/ webképregény] arról, hogyan válasszunk nehezen feltörhető, de könnyen megjegyezhető jelszót, [http://www.troyhunt.com/2011/08/im-sorry-but-were-you-actually-trying.html és cáfolata] (konklúzió: használjunk véletlenszerű jelszavakat és ezeket tároljuk tikosítva úgy, hogy egyetlen erős jelszót kelljen csak megjegyezni ahhoz, hogy hozzájuk férhessünk).
  +
* [http://xkcd.com/792/ webképregény] arról, hogyan lehet visszaélni azzal, hogy az emberek sok helyen ugyanazt a jelszót használják.
  +
* [http://xkcd.com/538/ webképregény] arról, mennyire mindegy lehet, milyen erős titkosítást használunk - fizikai erőszakkal általában nem nehéz a jelszavak birtokába jutni.
  +
  +
== Az adatkapcsolati (és fizikai) réteg; Ethernet ==
  +
  +
Fogalmak:
  +
  +
* ''Csomópont'': olyan eszköz, amelynek van olyan interfésze, amellyel az adatkapcsolati rétegben kommunikálni tud; például hoszt vagy router.
  +
* ''Kapcsolat'': fizikai összeköttetés két vagy több fizikai interfész között.
  +
* ''Keret'': adatkapcsolati szintű adatcsomag; magasabb rétegbeli protokollok (pl. IP) csomagjait szállít(hat)ja egy ''kapcsolat''nyi távolságra.
  +
** Általában egy keretre jut egy magasabb szintű adatcsomag, de szükség lehet arra, hogy egy-egy csomagot több keretre bontsunk szét.
  +
* ''Adatkapcsolati protokoll'': meghatározza a ''keret''ek formátumát és azt, hogyan kezelik őket ill. a ''kapcsolat''okat a ''csomópont''ok.
  +
** Pl.: adatátviteli hibák észlelése; szükség esetén újraküldés; folyamszabályozás; közeghozzáférés-vezérlés.
  +
  +
Néhány elterjedt adatkapcsolati rétegbeli protokoll:
  +
  +
* Ethernet ([http://en.wikipedia.org/wiki/IEEE_802 IEEE 802.*])
  +
* 802.11 WLAN (WiFi);
  +
* Token Ring (ritka);
  +
* PPP (Point to Point protocol);
  +
* [http://en.wikipedia.org/wiki/LAPB LAPB] (az X.25 adatkapcsolati rétegbeli protokollja);
  +
* [http://en.wikipedia.org/wiki/DOCSIS DOCSIS] (a kábeltévés internetszolgáltatás fizikai és adatkapcsolati rétege);
  +
* [http://en.wikipedia.org/wiki/HDLC HDLC] (egy ősprotokoll; a LAPB pl. ennek a leszármazottja);
  +
* [http://en.wikipedia.org/wiki/ARCnet ARCnet].

A lap 2012. február 20., 15:24-kori változata

Miről lesz szó? (Hozzávetőleges tematika)

  • Elméleti alapok: hitelesítés, hozzáférésvezérlés stb.
  • Elterjedt protokollok működése, hozzájuk kapcsolódó biztonsági problémák, klasszikus támadások
    • ISO/OSI hálózati referenciamodell
    • Fizikai és adatkapcsolati réteg: Ethernet, WiFi
    • Hálózati réteg: IP, ICMP, ARP
    • Szállítási réteg: TCP, UDP
    • Alkalmazási réteg: DNS, SMTP, FTP, HTTP (és webalkalmazások), SSL, SSH
  • Vírusok, férgek, botnetek
  • Single Sign On

Tartalomjegyzék

1 Hitelesítés

1.1 Kriptográfiai alapok

Alapfogalmak:

  • Plaintext: titkosítás nélküli szöveg vagy adat.
  • Ciphertext: titkosított szöveg vagy adat.
  • Cipher: titkosítóalgoritmus (a titkosítás valamely konkrét módszere).
  • Kód és cipher közötti különbség (noha a hétköznapi nyelvben összemosódik a két fogalom):
    • a kód jelentésekhez rendel valamilyen jelsorozatot, általában egy kódkönyv segítségével
      • (pl. a "hajnalban támadunk"-hoz tartozhat mondjuk az "ARVSA5" kód);
    • a titkosítóalgoritmus egyedi jelekhez vagy jelsorozatokhoz rendel másik jelet vagy jelsorozatot.
    • Számítógépes környezetben a titkosítóalgoritmusok használata általában előnyösebb, mert
      • a kódok leginkább csak szöveg kódolására alkalmasak (titkosítani pedig digitalizált képet, hangot vagy mozgóképet is lehet);
      • a kódok töbnnyire csak véges sok különböző jelentést tudnak kódolni;
      • ügyesen megválasztott titkosítóalgoritmusokat a számítógépek rendkívül gyorsan tudnak futtatni.
  • Kulcs: egy titkosítóalgoritmus alkalmazása során felhasznált (általában titkos) adat, amely a plaintexttel együtt meghatározza a ciphertextet.
    • Formálisabban: ciphertext = F(plaintext, kulcs).
  • Szimmetrikus kulcsú titkosítás: a titkosítás és a visszafejtés ugyanazzal a kulccsal történik. Formálisabban:
    • ciphertext = F(plaintext, kulcs)
    • plaintext = F'(ciphertext, kulcs)
    • (Bizonyos titkosítások esetében F és F' ugyanaz a függvény, de ennek nem muszáj így lennie.)
    • A ciphertext és a plaintext között adott szimmetrikus kulcs mellett kölcsönösen egyértelmű a leképezés.
  • Aszimmetrikus vagy nyilvános kulcsú titkosítás:
    • mindenkinek két kulcsa van: egy nyilvános és egy titkos.
      • Ezeket nem tetszőlegesen választjuk; valamilyen matematikai kapcsolat van közöttük és speciális feltételeknek felelnek meg.
    • Amit az egyikkel titkosítunk, azt a másikkal lehet visszafejteni.
    • A nyilvános kulcsokat elvileg mindenki ismerheti (és kívánatos is, hogy ismerje).
    • Ha valakinek olyan üzenetet akarunk küldeni, amelyet csak ő tud elolvasni, az ő nyilvános kulcsával titkosítjuk; a csak általa ismert titkos kulccsal tudja olvashatóvá tenni.
    • Ha azt akarjuk, hogy bizonyítható legyen, hogy egy üzenetet mi küldtünk, a saját titkos kulcsunkkal titkosítjuk; ha a mi nyilvános kulcsunk segítségével dekódolható, abból következik, hogy a mi titkos kulcsunkkal lett titkosítva, és mivel azt csak mi ismerjük, ebből az is következik, hogy mi küldtük.
    • Nyilván fontos, hogy algoritmuselméleti értelemben nehéz legyen egy adott nyilvános kulcshoz tartozó titkos kulcsot előállítani.

1.2 Klasszikus és modern titkosítóalgoritmusok

Klasszikus titkosírás pl. az ABC-eltolás (A helyett D-t írunk, B helyett E-t s.í.t.), vagy saját ABC használata. Itt nem válik el élesen az algoritmus és a kulcs: a titkosított üzenet csak akkor van biztonságban, ha a titkosítás módszerét nem fedjük fel.

A modern titkosítóalgoritmusokat úgy alkotják meg, hogy a titkosított üzeneteket akkor se lehessen a kulcs ismerete nélkül visszafejteni, ha a támadó ismeri az algoritmust. Az algoritmus tehát nyilvános; csak a kulcsot kell titokban tartani. Ha jó az algoritmus, a támadó dolgát nem könnyíti meg az algoritmus ismerete. A támadóról általában feltételezzük, hogy pontosan ismeri azt a titkosítóalgoritmust, amellyel az általa elolvasni kívánt rejtjelezett üzenetet titkosították.

1.3 Mitől jó egy titkosítás?

  • A próbálgatásnál (brute force) ne legyen hatékonyabb módszer a kulcs előállítására.
  • Várhatóan annyi ideig tartson a kulcs próbálgatásos előállítása a támadónak, hogy mire végez, minden olyan titkos üzenet, amelyhez így hozzáfér, aktualitását veszítse.
    • Méretezési kérdés, milyen erőforrások birtoklását feltételezzük a támadó(k)ról.
    • Egy jó szimmetrikus kulcsú titkosítóval manapság legalább 128 bites kulcsot illik használni;
    • nyilvános kulcsú titkosításnál nagyobb (RSA-nál minimum 2048 bites) kulcshosszra van szükség.
  • Létezik elvileg is feltörhetetlen titkosítás (a one-time pad).
    • Itt a kulcs legalább olyan hosszú, mint az üzenet, és minden szakasza csak egyszer hasznosítható.
  • Lavina-effektus: két, akár csak egyetlen bitben különböző plaintexthez gyökeresen eltérő ciphertext tartozik.
    • Vagyis: ránézésre lehetetlen megállapítani, hogy két elfogott titkosított üzenet tartalma hasonló.
  • Teljesség: a ciphertext minden bitje a plaintext minden bitjétől függ.
  • Hatékonyság: a kulcs birtokában a titkosítás és a visszafejtés is legyen gyors és kicsi memóriaigényű.

1.4 Blokktitkosító, folyamtitkosító

  • A blokktitkosítók fix méretű blokkokat képeznek le egymásra.
    • Ha a plaintext hossza nem osztható a blokkmérettel, ki kell egészíteni valahogyan.
    • Általában blokkszinten adott a lavina-effektus és a teljesség.
  • A folyamtitkosító bitenként vagy bájtonként titkosít.
    • Kulcsfolyamra van szükség hozzá.
      • Hosszú kulcs használata nehézkes; gyakori cél rövid kulcsból hosszú kulcsfolyamot generálni.

1.5 Hash (kivonat)

Cél: olyan rövid (96-512 bites) számot előállítani egy üzenetből, amelyre teljesül, hogy

  • algoritmuselméleti értelemben nehéz az üzenetet úgy módosítani, hogy a hash értéke ne változzon.
  • Nehéz adott H hash-hez olyan üzenetet találni, amelyre a hash-függvény a H értéket adja.
  • A véletlen ütközések esélye rendkívül csekély.

1.6 Néhány konkrét titkosító- és kivonatképző algoritmus

(Csak nagyon röviden.)

1.6.1 Vernam-kód

  • Egyfajta one-time pad, vagyis folyamtitkosító.
  • Az amerikai hadsereg számára fejlesztette 1917-ben Gilbert Vernam.
  • Lényege: a kommunikáló feleknek rendelkezésére áll egy titkos, véletlen bitekből álló bitsorozat, amelyet kulcsként használhatnak.
  • Üzeneteiket valahogyan bitekké alakítják, és rendre hozzáadják az üzenetek bitjeihez a kulcs-bitsorozat bitjeit.
    • (Mod2 összeadással, vagyis 0+0=0, 0+1=1, 1+0=1, 1+1=0.)
  • A visszafejtés ugyanígy történik: ugyanazt a kulcs-bitfolyamot ugyanúgy hozzá kell adni a bejövő ciphertexthez, és visszakapjuk a plaintextet.
  • Shannon 1949-ben bizonyította be, hogy a Vernam-kód feltörhetetlen.
  • Nehézség: nagyon nagy kulcs kell, amit előre meg kell osztani egymással és folyamatosan titokban kell tartani.

1.6.2 DES

  • 1976-os USA szabvány ("Digital Encryption Standard").
  • Blokktitkosító, 64 bites blokkokkal, 56 bites kulccsal.
  • Mára nem megfelelő; viszonylag olcsó hardverrel is mindössze órák (vagy legfeljebb napok) alatt feltörthető.
  • Kísérlet a feljavítására: 3DES.
    • Háromszor egymás után alkalmazza a DES-t, többféle kulccsal.
    • Az effektív kulcshossz így 80-168 bit aszerint, hány különböző kulcsot használunk és milyen módon.
    • Egyelőre megfelelő biztonságot nyújt, de lassú.

1.6.3 AES

  • Lánykori nevén Rijndael.
  • A DES-t váltó szabvány (2001-ben fogadták el).
  • 128 bites blokkokat titkosít 128, 192 vagy 256 bites kulccsal.
  • Gyors és egyelőre elegendően biztonságos.

1.6.4 RSA

Az egyik legelterjedtebb nyilvános kulcsú titkosítóalgoritmus.

  • Rivest, Shamir és Adleman nevéhez fűződik, holott egy Clifford Cocks nevű brit már 1973-ban kitalálta - de a britek titkosították és nem használták fel.
  • Rivest, Shamir és Adleman néhány évvel később publikálta saját, lényegében azonos algoritmusát.
  • Feltörésének nehézsége azon alapul, hogy bizonyos számelméleti problémákra (mint pl. nagy egészek prímtényezős felbontására) nem ismertek gyors módszerek.
    • De: ez nem jelenti azt, hogy nincsenek is ilyenek.
  • Az elliptikus görbéken alapuló titkosítás jobbnak számít.
    • Kisebb kulcshosszt igényel az RSA-nál és gyorsabb is.

1.6.5 RC4

  • Folyamtitkosító.
  • 1987-ben dolgozta ki Rivest; 1994-ben szivárgott ki a leírása.
  • Előnye, hogy nagyon egyszerű és gyors.
  • Széles körben elterjedt.
  • Ésszel kell használni, mert különben nem ad jó eredményt.
    • Az RC4 helytelen használata tette sebezhetővé pl. a WEP szabványt (részletesebben később).

1.6.6 MD5

  • 1990-ben megjelent hash algoritmus.
  • Széles körben elterjedt.
  • 128 bites hasht állít elő.
  • 2005-ben hibát találtak benne: aránylag könnyű ütközést generálni (másik olyan üzenetet találni, amelyhez ugyanaz a hash tartozik).
    • Emiatt új kriptográfiai rendszerekben nem szabad használni.

1.6.7 SHA-1

  • 1993-ban publikált hash algoritmus.
  • Széles körben elterjedt.
  • 160 bites hasht állít elő.
  • Biztonságosnak számít.
  • Vetélytársai: RIPEMD-160 (OpenPGP), Tiger (ez 192 bites; főleg fájlcserélők használják).

1.7 Jelszó alapú hitelesítés

  • Ha egy szolgáltatást csak nevesített felhasználóknak akarunk nyújtani, valahogyan meg kell tudnunk, ki próbálja igénybe venni a szolgáltatást.
    • A hitelesítés és a hozzáférésvezérlés két különböző dolog: lehet, hogy egy szolgáltatást bárki használhat, csak tudnunk kell, kicsoda (pl. bankszámlát akárki nyithat, de többnyire csak névvel).

Hogyan állapítsuk meg, ki a felhasználó?

  • Kézenfekvő, egyszerű megoldás: felhasználónév+jelszó.
    • A jelszó önmagában kevés: hozzáférésvezérléshez elegendő, hitelesítéshez viszont csak akkor, ha az üzemeltető osztja ki a garantáltan egyedi jelszavakat a felhasnzálóknak.
    • Ha a felhasználó magának választhatja a jelszót, akkor a jelszó egyedisége nem garantált, tehát kell egy egyedi azonosító is; ez a felhasználónév.
    • Aki egy adott {felhasználónév, jelszó} párost ismer, arról általában elhisszük, hogy az a személy, akihez az adott felhasználónév tartozik.
      • A hozzáférésvezérlés szempontjából ez persze nem feltétlenül elegendő: lehet, hogy csak adott helyről vagy adott időablakban engedjük hozzáférni a szolgáltatáshoz.

Nehézségek a jelszó-alapú hitelesítésnél:

  • A jelszavak a hálózaton lehallgathatók lehetnek. Lehetséges megoldások:
    • titkosított protokoll használata;
    • egyszer használatos jelszavak (OTP, one-time password) használata.
      • Ezzel vigyázzunk; ha a támadó képes karakterenként lehallgatni a jelszót, az utolsó karakter felhasználó általi leütése előtt próbálgatásos támadást indíthat az utolsó karakter kitalálására.
    • Challenge-response ("kihívás-válasz") alapú hitelesítés.
      • Lényege: a jelszót nem utaztatjuk a hálózaton; a hitelesítő a jelszóra vonatkozó, kriptográfián alapuló "találós kérdést" ad fel a kliensnek, amely a jelszó birtokában tud rá helyesen válaszolni.
        • Ez a viszonthitelesítést is lehetővé teszi: megoldható, hogy csak az tudjon érvényes találós kérdést feltenni, aki maga is ismeri a jelszót.
        • Egyszerű példa: "itt van ez a véletlenszerűen generált sztring; fűzd össze a jelszóval és képezz belőle hash-t, majd a hash-t küldd vissza".
      • Hátrány: sok challenge-response protokoll plaintext jelszó tárolását igényli.
  • Márpedig ha a jelszavakat titkosítás nélkül tároljuk a szerveren, onnan egy menetben ellopható az összes.
    • Ráadásul az emberek gyakran ugyanazt a jelszót több helyen is használják.
    • Lehetséges megoldások:
      • Jelszavak "titkosított" tárolása.
        • A sima titkosítás nem sokkal jobb, mint a plaintext, hiszen a hitelesítéshez dekódolni kell a titkosított jelszót, ha pedig a hitelesítő képes erre, akkor még mindig ellopható az összes jelszó.
        • A jelszó helyett csak egy hash-t tárolunk.
          • Gond: két azonos jelszó hash-e is meg fog egyezni;
          • ha valaki már egy csomó szótári szó hash-ét meghatározta, a tőlünk ellopott hash-ek között jó eséllyel talál olyat, amelyhez ismer jelszót.
          • Jobb "megsózni" jelszót hash-elés előtt: kiegészíteni egy véletlen sztringgel, és azzal együtt hash-elni, majd a hash mellett ezt a sztringet is tárolni.
  • A hash-elt jelszótárolás és a kihívás-válasz alapú hitelesítés elvileg ötvözhető; így működik pl. az NTLMv2.

1.8 Ajánlott irodalom

2 Az adatkapcsolati (és fizikai) réteg; Ethernet

Fogalmak:

  • Csomópont: olyan eszköz, amelynek van olyan interfésze, amellyel az adatkapcsolati rétegben kommunikálni tud; például hoszt vagy router.
  • Kapcsolat: fizikai összeköttetés két vagy több fizikai interfész között.
  • Keret: adatkapcsolati szintű adatcsomag; magasabb rétegbeli protokollok (pl. IP) csomagjait szállít(hat)ja egy kapcsolatnyi távolságra.
    • Általában egy keretre jut egy magasabb szintű adatcsomag, de szükség lehet arra, hogy egy-egy csomagot több keretre bontsunk szét.
  • Adatkapcsolati protokoll: meghatározza a keretek formátumát és azt, hogyan kezelik őket ill. a kapcsolatokat a csomópontok.
    • Pl.: adatátviteli hibák észlelése; szükség esetén újraküldés; folyamszabályozás; közeghozzáférés-vezérlés.

Néhány elterjedt adatkapcsolati rétegbeli protokoll:

  • Ethernet (IEEE 802.*)
  • 802.11 WLAN (WiFi);
  • Token Ring (ritka);
  • PPP (Point to Point protocol);
  • LAPB (az X.25 adatkapcsolati rétegbeli protokollja);
  • DOCSIS (a kábeltévés internetszolgáltatás fizikai és adatkapcsolati rétege);
  • HDLC (egy ősprotokoll; a LAPB pl. ennek a leszármazottja);
  • ARCnet.
Személyes eszközök