A Java biztonságának alapjai

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben az oktatóanyagban áttekintjük a Java alapú biztonság alapjait. Arra is összpontosítunk, hogy mi áll rendelkezésünkre a biztonságos alkalmazások megírásához.

A biztonság az hatalmas téma, amely számos területet átfog. Ezek egy része maga a nyelv része, például a hozzáférés-módosítók és az osztályterhelők. Ezenkívül mások is elérhetők szolgáltatásként, amelyek magukban foglalják az adatok titkosítását, a biztonságos kommunikációt, a hitelesítést és az engedélyezést, néhány néven.

Ezért nem célszerű értelmes betekintést nyerni ezekbe az oktatóanyagokba. Megpróbálunk azonban legalább értelmes szókincset szerezni.

2. Nyelvi jellemzők

Mindenek felett, a Java biztonsága a nyelvi funkciók szintjén kezdődik. Ez lehetővé teszi számunkra a biztonságos kód írását, valamint számos implicit biztonsági funkció előnyeit élvezhetjük:

  • Statikus adattípus: A Java egy statikusan beírt nyelv, amely csökkenti a típushoz kapcsolódó hibák futásidejű észlelésének lehetőségeit
  • Hozzáférés-módosítók: A Java lehetővé teszi számunkra a használatát különböző hozzáférés-módosítók, például nyilvános és magán hozzáférés a mezőkhöz, módszerekhez és osztályokhoz való hozzáférés szabályozásához
  • Automatikus memóriakezelés: A Java rendelkezik szemétgyűjtés alapú memóriakezelés, amely mentesíti a fejlesztőket a kézi kezeléstől
  • Bytecode Verification: A Java egy lefordított nyelv, ami azt jelenti, hogy a kódot platform-agnosztikus bytecoddá alakítja, és futásidejű ellenőrzi minden bájtkódot, amelyet betölt

Ez nem egy teljes lista a Java által biztosított biztonsági funkciókról, de elég jó ahhoz, hogy bizonyos biztonságot nyújtson nekünk!

3. Biztonsági architektúra Java-ban

Mielőtt elkezdenénk vizsgálni bizonyos területeket, töltsünk el egy kis időt a Java biztonságának alapvető architektúrájának megértésével.

A Java biztonságának alapelveit az vezérli átjárható és bővíthető Szolgáltató megvalósítások. A Szolgáltató megvalósíthatja a biztonsági szolgálatok egy részét vagy egészét.

Például néhány tipikus szolgáltatás a Szolgáltató megvalósíthatják:

  • Kriptográfiai algoritmusok (például DSA, RSA vagy SHA-256)
  • Kulcsgeneráló, -konvertáló és -kezelő lehetőségek (például algoritmus-specifikus kulcsokhoz)

Java szállít sok beépített szolgáltató. Ezenkívül lehetséges, hogy egy alkalmazás több szolgáltatót konfiguráljon preferencia sorrendben.

Következésképpen a szolgáltatói keretrendszer A Java az összes szolgáltatónál egy adott szolgáltatás megvalósítását keresi preferencia sorrendben rájuk állítva.

Sőt, ebben az architektúrában mindig lehetséges beépíthető biztonsági funkciókkal rendelkező egyedi szolgáltatókat megvalósítani.

4. Titkosítás

A kriptográfia általában és a Java biztonsági funkcióinak sarokköve. Ez arra utal eszközök és technikák a biztonságos kommunikációhoz az ellenfelek jelenlétében.

4.1. Java titkosítás

A Java kriptográfiai architektúra (JCA) keretet biztosít a kriptográfiai funkciók Java-alapú eléréséhez és megvalósításához, beleértve:

  • Digitális aláírások
  • Az üzenet emésztése
  • Szimmetrikus és aszimmetrikus rejtjelek
  • Üzenet-hitelesítési kódok
  • Kulcsgenerátorok és kulcsgyárak

A legfontosabb, hogy a Java használja Szolgáltatókriptográfiai funkciók alapú megvalósításai.

Ezenkívül a Java beépített szolgáltatókat tartalmaz az általánosan használt kriptográfiai algoritmusokhoz, például az RSA, a DSA és az AES, hogy csak néhányat említsünk. Tudunk ezen algoritmusok segítségével növelheti az adatok biztonságát nyugalomban, használatban vagy mozgásban.

4.2. Titkosítás a gyakorlatban

Az alkalmazásokban nagyon gyakori eset a felhasználói jelszavak tárolása. Ezt egy későbbi időpontban használjuk hitelesítésre. Most nyilvánvaló, hogy az egyszerű szöveges jelszavak tárolása veszélyezteti a biztonságot.

Tehát az egyik megoldás a jelszavak összekeverése oly módon, hogy a folyamat megismételhető legyen, mégis csak egyirányú. Ez a folyamat kriptográfiai hash függvényként ismert, és az SHA1 ilyen népszerű algoritmus.

Tehát nézzük meg, hogyan tudjuk ezt megtenni a Java-ban:

MessageDigest md = MessageDigest.getInstance ("SHA-1"); byte [] hashedPassword = md.digest ("jelszó" .getBytes ());

Itt, Üzenet feldolgozása egy kriptográfiai szolgáltatás, amely érdekel minket a módszer alkalmazásával getInstance() kérheti ezt a szolgáltatást az elérhető biztonsági szolgáltatók bármelyikétől.

5. Nyilvános kulcsú infrastruktúra

A nyilvános kulcsú infrastruktúra (PKI) a beállítás, amely lehetővé teszi a biztonságos információcserét a hálózaton nyilvános kulcsú titkosítással. Ez a beállítás a kommunikációban részt vevő felek közötti bizalomra épül. Ez a bizalom digitális tanúsítványokon alapul, amelyeket egy semleges és megbízható hatóság, hitelesítésszolgáltató (CA) nevez ki.

5.1. PKI támogatás Java-ban

A Java platform API-kat tartalmaz a digitális tanúsítványok létrehozásának, tárolásának és érvényesítésének megkönnyítésére:

  • KeyStore: A Java biztosítja a KeyStore osztály a kriptográfiai kulcsok és megbízható tanúsítványok tartós tárolására. Itt, KeyStore képviselhet kulcstároló és bizalmi tár fájlokat is. Ezeknek a fájloknak hasonló a tartalmuk, de felhasználásuk eltér.
  • CertStore: Ezenkívül a Java rendelkezik a CertStore osztály, amely a potenciálisan nem megbízható tanúsítványok és visszavonási listák nyilvános tárházát jelenti. Be kell szereznünk a tanúsítványokat és a visszavonási listákat tanúsítvány útvonal kiépítéséhez a többi felhasználás mellett.

A Java-nak van egy beépített „cacerts” nevű bizalmi bolt amely jól ismert CA-k tanúsítványait tartalmazza.

5.2. Java eszközök a PKI-hez

A Java néhány nagyon praktikus eszközzel rendelkezik a megbízható kommunikáció megkönnyítésére:

  • Van egy beépített „kulcseszköz” nevű eszköz a kulcstár és a bizalmi tár létrehozására és kezelésére
  • Van még egy „jarsigner” eszköz, amellyel aláírhatjuk és ellenőrizhetjük a JAR fájlokat

5.3. Java tanúsítványokkal való munka

Nézzük meg, hogyan működhetünk együtt a Java tanúsítványokkal biztonságos kapcsolat létrehozásához az SSL használatával. A kölcsönösen hitelesített SSL-kapcsolat két dolgot követel meg tőlünk:

  • Jelenlegi tanúsítvány - Érvényes tanúsítványt kell bemutatnunk egy másik félnek a kommunikáció során. Ehhez be kell töltenünk a kulcstárfájlt, ahol rendelkeznünk kell a nyilvános kulcsokkal:
KeyStore keyStore = KeyStore.getInstance (KeyStore.getDefaultType ()); char [] keyStorePassword = "changeit" .toCharArray (); try (InputStream keyStoreData = new FileInputStream ("keystore.jks")) {keyStore.load (keyStoreData, keyStorePassword); }
  • Tanúsítvány ellenőrzése - A másik fél által a kommunikáció során bemutatott tanúsítványt is ellenőriznünk kell. Ehhez be kell töltenünk a trust-store-ot, ahol korábban megbízható tanúsítványokkal kell rendelkeznünk más felektől:
KeyStore trustStore = KeyStore.getInstance (KeyStore.getDefaultType ()); // Töltse be a trust-store fájlt a fájlrendszerből, mint korábban

Ritkán kell ezt programozottan elvégeznünk, és általában a rendszerparamétereket futás közben adjuk át a Java-nak:

-Djavax.net.ssl.trustStore = truststore.jks -Djavax.net.ssl.keyStore = keystore.jks

6. Hitelesítés

A hitelesítés az a felhasználó bemutatott személyazonosságának ellenőrzésének folyamata vagy gép további adatok, például jelszó, token vagy számos más, ma elérhető hitelesítő adat alapján.

6.1. Hitelesítés Java-ban

A Java API-k plug-in bejelentkezési modulokat használnak, hogy különböző és gyakran több hitelesítési mechanizmust biztosítsanak az alkalmazások számára. LoginContext biztosítja ezt az absztrakciót, ami viszont konfigurációra utal, és betölt egy megfelelőt LoginModule.

Míg több szolgáltató elérhetővé teszi bejelentkezési moduljait, A Java rendelkezik néhány alapértelmezettel használatra:

  • Krb5LoginModule, Kerberos-alapú hitelesítéshez
  • JndiLoginModule, a felhasználónév és a jelszó alapú hitelesítéshez, amelyet egy LDAP-áruház támogat
  • KeyStoreLoginModule, kriptográfiai kulcs alapú hitelesítéshez

6.2. Bejelentkezés példával

A hitelesítés egyik leggyakoribb mechanizmusa a felhasználónév és a jelszó. Lássuk, hogyan tudjuk ezt elérni JndiLoginModule.

Ez a modul felelős a felhasználónév és jelszó megszerzéséért a felhasználótól és a JNDI-ben konfigurált címtárszolgáltatással történő ellenőrzéséért:

LoginContext loginContext = new LoginContext ("Minta", új SampleCallbackHandler ()); loginContext.login ();

Itt vagyunk felhasználásával LoginContext a bejelentkezés végrehajtásához. LoginContext felveszi egy bejegyzés nevét a bejelentkezési konfigurációban - ebben az esetben ez a „Minta”. Továbbá meg kell adnunk a CallbackHandler, használni a LoginModule amely interakcióba lép a felhasználóval olyan részletekért, mint a felhasználónév és jelszó.

Vessünk egy pillantást a bejelentkezési konfigurációnkra:

A (z) {com.sun.security.auth.module.JndiLoginModule szükséges minta; };

Elég egyszerű, ez arra utal, hogy használjuk JndiLoginModule mint kötelező LoginModule.

7. Biztonságos kommunikáció

A hálózaton keresztüli kommunikáció számos támadási vektor számára sebezhető. Például valaki bekapcsolódhat a hálózatba, és átolvasás közben elolvassa az adatcsomagjainkat. Az évek során az ipar számos protokollt hozott létre a kommunikáció biztosítása érdekében.

7.1. Java támogatás a biztonságos kommunikációhoz

A Java API-kat biztosít a biztonságos hálózati kommunikációhoz titkosítás, az üzenet integritása, valamint az ügyfél és a szerver hitelesítése:

  • SSL / TLS: Az SSL és annak utódja, a TLS adattitkosítás és nyilvános kulcsú infrastruktúra révén biztonságot nyújt a nem megbízható hálózati kommunikációval szemben. A Java az SSL / TLS protokollt támogatja SSLSocket a csomagban meghatározottjava.security.ssl“.
  • SASL: Az egyszerű hitelesítés és biztonsági réteg (SASL) az ügyfél és a szerver közötti hitelesítés szabványa. A Java támogatja a SASL-t a csomag részekéntjava.security.sasl“.
  • GGS-API / Kerberos: A Generic Security Service API (GSS-API) egységes hozzáférést kínál a biztonsági szolgáltatásokhoz különféle biztonsági mechanizmusok, például a Kerberos v5 révén. A Java támogatja a GSS-API-t a csomag részekéntjava.security.jgss“.

7.2. Az SSL kommunikáció működésben

Most nézzük meg, hogyan nyithatunk meg biztonságos kapcsolatot a többi féllel a Java használatával SSLSocket:

SocketFactory gyár = SSLSocketFactory.getDefault (); try (Socket kapcsolat = gyár.createSocket (gazdagép, port)) {BufferedReader input = new BufferedReader (új InputStreamReader (connection.getInputStream ())); return input.readLine (); }

Itt használjuk SSLSocketFactory készíteni SSLSocket. Ennek részeként beállíthatunk opcionális paramétereket, például titkosító csomagokat és azt, hogy melyik protokollt kell használni.

Ahhoz, hogy ez megfelelően működjön, létre kell hoznunk és be kell állítanunk kulcstárunkat és bizalmi tárunkat mint korábban láttuk.

8. Belépés-ellenőrzés

A hozzáférés-vezérlés a olyan érzékeny erőforrások védelme, mint egy fájlrendszer vagy indokolatlan hozzáférésből származó kódbázis. Ezt általában az ilyen forrásokhoz való hozzáférés korlátozásával érik el.

8.1. Hozzáférés-vezérlés Java-ban

Java-ban elérhetjük a hozzáférés-vezérlést osztályok felhasználásával Irányelv és Engedély közvetítette a SecurityManager osztály. SecurityManager része ajava.lang”Csomagot, és felelős a hozzáférés-ellenőrzések végrehajtásáért a Java-ban.

Amikor az osztálybetöltő osztályt futtat futás közben, automatikusan bizonyos alapértelmezett engedélyeket ad az osztályba beágyazott osztálynak Engedély tárgy. Ezen alapértelmezett engedélyeken túlmenően a biztonsági házirendek révén további tőkeáttételt biztosíthatunk egy osztály számára. Ezeket az osztály képviseli Irányelv.

A kódfuttatás sorrendje során, ha a futás során védett erőforrás iránti kérelem lép fel, SecurityManager ellenőrzi a kért Engedély a telepített ellen Irányelv a hívásveremen keresztül. Következésképpen vagy engedélyt ad, vagy dob SecurityException.

8.2. Java eszközök a házirendhez

A Java alapértelmezett megvalósítása Irányelv amely kiolvassa az engedélyezési adatokat a tulajdonságfájlból. Azonban a házirend-bejegyzéseknek ezekben a házirend-fájlokban meghatározott formátumúaknak kell lenniük.

A Java a „policytool” nevű grafikus segédprogrammal szállítja a házirend fájlokat.

8.3. Hozzáférés-vezérlés például

Lássuk, hogyan korlátozhatjuk az olyan erőforrásokhoz való hozzáférést, mint egy fájl a Java-ban:

SecurityManager securityManager = System.getSecurityManager (); if (securityManager! = null) {securityManager.checkPermission (új FilePermission ("/ var / logs", "read")); }

Itt használjuk SecurityManager beillesztett fájl iránti olvasási kérelmünk érvényesítése FilePermission.

De, SecurityManager delegálja ezt a kérést AccessController. AccessController belsőleg használja a telepített programot Irányelv hogy döntésre jusson.

Lássunk egy példát a házirend-fájlra:

adj {engedélyt java.security.FilePermission <>, "olvas"; };

Lényegében olvasási engedélyt adunk az összes fájl számára mindenki számára. De, a biztonsági politikák révén sokkal finomabb ellenőrzést tudunk biztosítani.

Érdemes megjegyezni, hogy a SecurityManager lehet, hogy alapértelmezés szerint nincs telepítve a Java-ban. Ezt úgy tudjuk biztosítani, hogy a Java-t mindig a következő paraméterrel indítjuk:

-Djava.security.manager -Djava.security.policy = / path / to / sample.policy

9. XML aláírás

Az XML aláírások hasznos az adatok biztonságában és az adatok integritásának biztosításában. A W3C ajánlásokat tartalmaz az XML aláírás kezelésére. XML-aláírással bármilyen típusú adatot, például bináris adatot, biztonságossá tehetünk.

9.1. XML-aláírás Java-ban

A Java API támogatja az XML-aláírások előállítását és érvényesítését az ajánlott irányelvek szerint. A Java XML digitális aláírás API-t a „java.xml.crypto“.

Maga az aláírás csak egy XML dokumentum. Az XML-aláírások háromféle lehet:

  • Leválasztva: Ez az típusú aláírás azon adatok felett található, amelyek kívül esnek az Aláírás elemen
  • Borítékolás: Ez az típusú aláírás az aláírás elemen belüli adatok fölött található
  • Borítékolt: Ez az típusú aláírás azon adatok felett található, amelyek maguk az Aláírás elemet tartalmazzák

Természetesen a Java támogatja az összes fenti típusú XML-aláírás létrehozását és ellenőrzését.

9.2. XML-aláírás létrehozása

Most feltekerjük az ujjainkat és létrehozunk egy XML aláírást az adatainkhoz. Például készülhetünk XML dokumentumot küldeni a hálózaton keresztül. Ennélfogva, azt szeretnénk, ha címzettünk képes lenne ellenőrizni integritását.

Tehát nézzük meg, hogyan érhetjük el ezt a Java-ban:

XMLSignatureFactory xmlSignatureFactory = XMLSignatureFactory.getInstance ("DOM"); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance (); documentBuilderFactory.setNamespaceAware (true); Dokumentumdokumentum = documentBuilderFactory .newDocumentBuilder (). Parse (új FileInputStream ("data.xml")); DOMSignContext domSignContext = new DOMSignContext (keyEntry.getPrivateKey (), document.getDocumentElement ()); XMLSignature xmlSignature = xmlSignatureFactory.newXMLSignature (SignedInfo, keyInfo); xmlSignature.sign (domSignContext);

Ennek tisztázása érdekében létrehozunk egy XML-aláírást a fájlban lévő adataink számára „Data.xml”. Eközben néhány dolgot érdemes megjegyezni ezzel a kóddarabbal kapcsolatban:

  • Először, XMLSignatureFactory az XML aláírások előállításának gyári osztálya
  • XMLSigntaure megköveteli a SignedInfo objektum, amely felett kiszámítja az aláírást
  • XMLSigntaure is szüksége van KeyInfo, amely az aláíró kulcsot és a tanúsítványt foglalja magában
  • Végül, XMLSignature -ként beágyazott titkos kulccsal írja alá a dokumentumot DOMSignContext

Ennek eredményeként az XML dokumentum tartalmazza az Aláírás elemet, amely felhasználható annak integritásának ellenőrzésére.

10. Biztonság túl a Java Java-on

Amint azt már láttuk, a Java platform rengeteg szükséges funkciót biztosít a biztonságos alkalmazások írásához. Azonban néha ezek meglehetősen alacsony szintűek, és nem közvetlenül alkalmazhatók például a web szabványos biztonsági mechanizmusára.

Például, ha a rendszerünkön dolgozunk, általában nem akarjuk, hogy el kell olvasnunk a teljes OAuth RFC-t, és ezt magunknak kell megvalósítanunk. Gyakran gyorsabb, magasabb szintű módszerekre van szükségünk a biztonság eléréséhez. Itt jönnek képbe az alkalmazási keretrendszerek - ezek sokkal kevesebb kazán kóddal segítenek elérni célkitűzésünket.

És a Java platformon - általában ez a tavaszi biztonságot jelenti. A keretrendszer része a tavaszi ökoszisztémának, de valójában a tiszta tavaszi alkalmazáson kívül is használható.

Egyszerűbben kifejezve, segít elérni a hitelesítést, az engedélyezést és az egyéb biztonsági funkciókat egyszerű, deklaratív, magas szintű módon.

Természetesen a Spring Security széles körűen ismertetésre kerül egy sor oktatóanyagban, valamint irányított módon a Learn Spring Security tanfolyamon.

11. Következtetés

Röviden, ebben az oktatóanyagban áttekintettük a Java magas szintű biztonsági architektúráját. Megértettük azt is, hogy a Java hogyan nyújt számunkra néhány szabványos kriptográfiai szolgáltatás megvalósítását.

Láttunk néhány olyan általános mintát is, amelyeket alkalmazhatunk a kiterjeszthető és bedugható biztonság elérése érdekében olyan területeken, mint a hitelesítés és a hozzáférés-ellenőrzés.

Összegezve: ez csak egy betekintést enged a Java biztonsági szolgáltatásaiba. Következésképpen az ebben az oktatóanyagban tárgyalt területek mindegyike további feltárást érdemel. De remélhetőleg elegendő betekintéssel kell rendelkeznünk ahhoz, hogy elindulhassunk ebben az irányban!

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT