Základy bezpečnosti Java

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

V tomto tutoriáli si prejdeme základné informácie o zabezpečení na platforme Java. Zameriame sa tiež na to, čo máme k dispozícii na písanie zabezpečených aplikácií.

Bezpečnosť je rozsiahla téma, ktorá zahŕňa mnoho oblastí. Niektoré z nich sú súčasťou samotného jazyka, napríklad modifikátory prístupu a zavádzače tried. Okrem toho sú ďalšie dostupné ako služby, ktoré zahŕňajú šifrovanie údajov, bezpečnú komunikáciu, autentifikáciu a autorizáciu.

Preto nie je praktické v tomto výučbe získať zmysluplný prehľad o všetkých týchto veciach. Pokúsime sa však získať aspoň zmysluplný slovník.

2. Jazykové vlastnosti

Nad všetkým, bezpečnosť v prostredí Java začína už na úrovni jazykových funkcií. To nám umožňuje písať zabezpečený kód a využívať výhody mnohých implicitných bezpečnostných funkcií:

  • Typické statické údaje: Java je staticky napísaný jazyk, ktorý znižuje možnosti detekcie chodu typu-run chýb za behu
  • Modifikátory prístupu: Java nám umožňuje používať rôzne modifikátory prístupu, napríklad verejné a súkromné, na riadenie prístupu k poliam, metódam a triedam
  • Automatická správa pamäte: Java má správa pamäte založená na zbieraní odpadu, čo vývojárov oslobodzuje od manuálnej správy
  • Overenie bytecode: Java je kompilovaný jazyk, čo znamená, že prevádza kód na platformovo-agnostický bytecode a runtime overí každý bytecode, ktorý načíta na vykonanie

Toto nie je úplný zoznam bezpečnostných funkcií, ktoré poskytuje Java, ale je dosť dobrý na to, aby ste nám poskytli istotu!

3. Bezpečnostná architektúra v Jave

Predtým, ako začneme skúmať konkrétne oblasti, venujme trochu času pochopeniu základnej architektúry bezpečnosti v Jave.

Základné princípy bezpečnosti v Jave sú riadené interoperabilné a rozšíriteľné Poskytovateľ implementácie. Konkrétna implementácia Poskytovateľ môže implementovať niektoré alebo všetky bezpečnostné služby.

Napríklad niektoré typické služby a Poskytovateľ môžu implementovať:

  • Kryptografické algoritmy (napríklad DSA, RSA alebo SHA-256)
  • Generovanie, prevod a správa kľúčov (napríklad pre kľúče špecifické pre algoritmus)

Java sa dodáva s veľa zabudovaných poskytovateľov. Je tiež možné, aby aplikácia konfigurovala viacerých poskytovateľov s preferenčným poradím.

V dôsledku toho rámec poskytovateľa v Java vyhľadáva konkrétnu implementáciu služby u všetkých poskytovateľov v poradí podľa preferencie nastaviť na ne.

Navyše je v tejto architektúre vždy možné implementovať vlastných poskytovateľov s pripojiteľnými bezpečnostnými funkciami.

4. Kryptografia

Kryptografia je základným kameňom bezpečnostných prvkov všeobecne a v prostredí Java. Toto sa vzťahuje na nástroje a techniky na bezpečnú komunikáciu za prítomnosti protivníkov.

4.1. Java kryptografia

Java Cryptographic Architecture (JCA) poskytuje rámec pre prístup a implementáciu kryptografických funkcií v Jave, vrátane:

  • Digitálne podpisy
  • Súhrny správ
  • Symetrické a asymetrické šifry
  • Kódy na overenie správy
  • Generátory kľúčov a kľúčové továrne

Najdôležitejšie je, že Java využíva Poskytovateľimplementácie založené na kryptografických funkciách.

Okrem toho obsahuje Java zabudovaných poskytovateľov bežne používaných kryptografických algoritmov, ako sú RSA, DSA a AES. Môžeme používajú tieto algoritmy na zvýšenie bezpečnosti údajov v pokoji, v prevádzke alebo v pohybe.

4.2. Kryptografia v praxi

Veľmi častým prípadom použitia v aplikáciách je ukladanie hesiel používateľov. Používame to na autentifikáciu v neskoršom čase. Teraz je zrejmé, že ukladanie hesiel vo formáte obyčajného textu ohrozuje bezpečnosť.

Jedným z riešení je teda zašifrovanie hesiel takým spôsobom, aby bol proces opakovateľný, avšak iba jednosmerný. Tento proces je známy ako kryptografická hašovacia funkcia a SHA1 je jedným z takých populárnych algoritmov.

Pozrime sa teda, ako to môžeme urobiť v prostredí Java:

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

Tu, MessageDigest je kryptografická služba, ktorá nás zaujíma. Sme pomocou metódy getInstance() požiadať o túto službu od ktoréhokoľvek z dostupných poskytovateľov zabezpečenia.

5. Infraštruktúra verejných kľúčov

Infraštruktúra verejného kľúča (PKI) označuje nastavenie, ktoré umožňuje bezpečnú výmenu informácií po sieti pomocou šifrovania pomocou verejného kľúča. Toto nastavenie sa spolieha na dôveru, ktorá sa vytvára medzi stranami zapojenými do komunikácie. Táto dôvera je založená na digitálnych certifikátoch vydaných neutrálnym a dôveryhodným orgánom známym ako Certifikačná autorita (CA).

5.1. Podpora PKI v Jave

Platforma Java má rozhrania API na uľahčenie vytvárania, ukladania a overovania digitálnych certifikátov:

  • KeyStore: Java poskytuje KeyStore trieda na trvalé ukladanie kryptografických kľúčov a dôveryhodných certifikátov. Tu, KeyStore môže predstavovať súbory na ukladanie kľúčov aj na ukladanie dôvery. Tieto súbory majú podobný obsah, ale líšia sa v použití.
  • CertStore: Java má navyše CertStore triedy, ktorá predstavuje verejné úložisko potenciálne nedôveryhodných certifikátov a zoznamov odvolaní. Musíme získať certifikáty a zoznamy odvolaní na budovanie cesty certifikátu okrem iného.

Java má a vstavaný dôveryhodný obchod s názvom „cacerts“ ktorý obsahuje certifikáty pre dobre známe CA.

5.2. Nástroje Java pre PKI

Java má niekoľko skutočne šikovných nástrojov na uľahčenie dôveryhodnej komunikácie:

  • Existuje zabudovaný nástroj s názvom „keytool“ na vytváranie a správu úložiska kľúčov a úložiska dôvery
  • Existuje aj ďalší nástroj „jarsigner“, ktorý môžeme použiť na podpisovanie a overovanie súborov JAR

5.3. Práca s certifikátmi v Jave

Pozrime sa, ako môžeme pomocou certifikátov v Jave nadviazať bezpečné pripojenie pomocou SSL. Vzájomne overené pripojenie SSL vyžaduje, aby sme vykonali dve veci:

  • Predložiť certifikát - Musíme pri komunikácii predložiť platný certifikát inej strane. Na to musíme načítať súbor s úložiskom kľúčov, kde musíme mať naše verejné kľúče:
KeyStore keyStore = KeyStore.getInstance (KeyStore.getDefaultType ()); char [] keyStorePassword = "changeit" .toCharArray (); try (InputStream keyStoreData = new FileInputStream ("keystore.jks")) {keyStore.load (keyStoreData, keyStorePassword); }
  • Overiť certifikát - Musíme tiež overiť certifikát predložený inou stranou v komunikácii. Za týmto účelom musíme načítať trust-store, kde musíme mať predtým dôveryhodné certifikáty od iných strán:
KeyStore trustStore = KeyStore.getInstance (KeyStore.getDefaultType ()); // Načítajte úložisko dôveryhodnosti zo súborového systému ako predtým

Málokedy to musíme urobiť programovo a za normálnych okolností odovzdáme systémové parametre do Java za behu:

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

6. Autentifikácia

Autentifikácia je proces overovania predloženej identity používateľa alebo zariadenie založené na ďalších údajoch, ako sú heslo, token alebo množstvo ďalších prihlasovacích údajov, ktoré sú dnes k dispozícii.

6.1. Autentifikácia v Jave

Rozhranie Java API využíva zásuvné prihlasovacie moduly na zabezpečenie rôznych a často viacerých mechanizmov autentifikácie aplikácií. LoginContext poskytuje túto abstrakciu, ktorá zase odkazuje na konfiguráciu a načíta vhodnú Prihlasovací modul.

Zatiaľ čo viacerí poskytovatelia sprístupňujú svoje prihlasovacie moduly, Java má k dispozícii niektoré predvolené na použitie:

  • Modul Krb5Login, pre autentifikáciu na základe protokolu Kerberos
  • Modul JndiLogin, pre autentifikáciu založenú na používateľskom mene a hesle podporovanú obchodom LDAP
  • KeyStoreLoginModule, na autentifikáciu na základe kryptografického kľúča

6.2. Prihláste sa príkladom

Jedným z najbežnejších mechanizmov autentifikácie je používateľské meno a heslo. Pozrime sa, ako to môžeme dosiahnuť Modul JndiLogin.

Tento modul je zodpovedný za získanie používateľského mena a hesla od používateľa a jeho overenie oproti adresárovej službe nakonfigurovanej v JNDI:

LoginContext loginContext = nový LoginContext ("Ukážka", nový SampleCallbackHandler ()); loginContext.login ();

Tu sme pomocou inštancie LoginContext vykonať prihlásenie. LoginContext prevezme názov položky v konfigurácii prihlásenia - v tomto prípade je to „Ukážka“. Musíme uviesť aj príklad CallbackHandlerpomocou Prihlasovací modul ktorý interaguje s používateľom a získava podrobnosti, ako napríklad používateľské meno a heslo.

Pozrime sa na našu konfiguráciu prihlásenia:

Vyžaduje sa vzorka {com.sun.security.auth.module.JndiLoginModule; };

Je to dosť jednoduché, naznačuje to, že používame Modul JndiLogin ako povinný Prihlasovací modul.

7. Bezpečná komunikácia

Komunikácia cez sieť je zraniteľná voči mnohým útočným vektorom. Napríklad niekto môže klepnúť na sieť a prečítať si naše dátové pakety počas prenosu. V priebehu rokov priemysel vytvoril veľa protokolov na zabezpečenie tejto komunikácie.

7.1. Podpora Java pre bezpečnú komunikáciu

Java poskytuje API na bezpečnú sieťovú komunikáciu s šifrovanie, integrita správy a autentifikácia klienta aj servera:

  • SSL / TLS: SSL a jeho nástupca, TLS, poskytuje bezpečnosť pri nedôveryhodnej sieťovej komunikácii prostredníctvom šifrovania údajov a infraštruktúry verejného kľúča. Java poskytuje podporu SSL / TLS prostredníctvom SSLSocket definované v balíku “java.security.ssl“.
  • SASL: Simple Authentication and Security Layer (SASL) je štandard pre autentizáciu medzi klientom a serverom. Java podporuje SASL ako súčasť balíka “java.security.sasl“.
  • GGS-API / Kerberos: Generic Security Service API (GSS-API) ponúka jednotný prístup k bezpečnostným službám prostredníctvom rôznych bezpečnostných mechanizmov, ako je Kerberos v5. Java podporuje GSS-API ako súčasť balíka “java.security.jgss“.

7.2. Komunikácia SSL v akcii

Poďme sa teraz pozrieť, ako môžeme pomocou Java vytvoriť bezpečné spojenie s ostatnými stranami v prostredí Java SSLSocket:

SocketFactory factory = SSLSocketFactory.getDefault (); try (Socket connection = factory.createSocket (hostiteľ, port)) {BufferedReader input = new BufferedReader (new InputStreamReader (connection.getInputStream ())); návrat input.readLine (); }

Tu používame SSLSocketFactory tvoriť SSLSocket. V rámci toho môžeme nastaviť voliteľné parametre, ako sú šifrovacie sady a aký protokol sa má použiť.

Aby to správne fungovalo, určite sme vytvorili a nastavili náš sklad kľúčov a obchod dôvery ako sme videli skôr.

8. Kontrola prístupu

Riadenie prístupu sa týka ochrana citlivých zdrojov, ako je súborový systém alebo codebase z neoprávneného prístupu. To sa obvykle dosahuje obmedzením prístupu k takýmto zdrojom.

8.1. Kontrola prístupu v Jave

Môžeme dosiahnuť riadenie prístupu v Jave pomocou tried Politika a Povolenie sprostredkovaná prostredníctvom SecurityManager trieda. SecurityManager je súčasťou „java.lang”Balíček a je zodpovedný za vynútenie kontrol kontroly prístupu v Jave.

Keď načítač triedy načíta triedu za behu, automaticky udelí nejaké predvolené oprávnenia triede zapuzdrenej v Povolenie objekt. Okrem týchto predvolených povolení môžeme triede poskytnúť väčšiu páku prostredníctvom bezpečnostných politík. Tých predstavuje trieda Politika.

Ak počas sledu vykonávania kódu runtime narazí na požiadavku na chránený prostriedok, SecurityManager overí požadované Povolenie oproti nainštalovaným Politika cez zásobník hovorov. V dôsledku toho buď udelí povolenie, alebo hodí Výnimka zabezpečenia.

8.2. Nástroje Java pre politiku

Java má predvolenú implementáciu Politika ktorý načíta autorizačné údaje zo súboru vlastností. Položky politiky v týchto súboroch politík však musia byť v konkrétnom formáte.

Java sa dodáva s „policytool“, grafickým nástrojom na vytváranie súborov zásad.

8.3. Kontrola prístupu prostredníctvom príkladu

Pozrime sa, ako môžeme obmedziť prístup k prostriedku ako je súbor v Jave:

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

Tu používame SecurityManager aby sme potvrdili našu požiadavku na čítanie súboru zabaleného do FilePermission.

Ale, SecurityManager deleguje túto žiadosť na AccessController. AccessController interne využíva nainštalované Politika dospieť k rozhodnutiu.

Pozrime sa na príklad súboru zásad:

udeliť {povolenie java.security.FilePermission <>, "prečítať"; };

V podstate udeľujeme povolenie na čítanie všetkým súborom pre všetkých. Ale, môžeme poskytnúť oveľa podrobnejšiu kontrolu prostredníctvom bezpečnostných politík.

Stojí za zmienku, že a SecurityManager nemusí byť v Jave predvolene nainštalovaný. Môžeme to zabezpečiť tak, že vždy spustíme Javu s parametrom:

-Djava.security.manager -Djava.security.policy = / cesta / k / sample.policy

9. Podpis XML

Podpisy XML sú užitočné pri zabezpečení údajov a zabezpečení ich integrity. W3C poskytuje odporúčania pre správu podpisu XML. Podpis XML môžeme použiť na zabezpečenie údajov ľubovoľného typu, napríklad binárnych údajov.

9.1. Podpis XML v Jave

Rozhranie Java API podporuje generovanie a overovanie podpisov XML podľa odporúčaných pokynov. Rozhranie Java XML Digital Signature API je zapuzdrené v balíčku „java.xml.crypto“.

Samotný podpis je iba dokument XML. Podpisy XML môžu byť troch typov:

  • Oddelený: Tento typ podpisu je nad údajmi, ktoré sú externé k prvku podpisu
  • Obálka: Tento typ podpisu je nad údajmi, ktoré sú interné v prvku podpisu
  • Obálka: Tento typ podpisu je nad údajmi, ktoré obsahujú samotný podpisový prvok

Java určite podporuje vytváranie a overovanie všetkých vyššie uvedených typov podpisov XML.

9.2. Vytvorenie podpisu XML

Teraz si vyhrnieme rukávy a vygenerujeme podpis XML pre naše údaje. Možno sa napríklad chystáme poslať dokument XML po sieti. Teda chceli by sme, aby náš príjemca mohol overiť jeho integritu.

Pozrime sa teda, ako to v Jave dosiahneme:

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

Na objasnenie generujeme podpis XML pre naše údaje prítomné v súbore „Data.xml“. O tejto časti kódu si medzitým treba uvedomiť niekoľko vecí:

  • Po prvé, XMLSignatureFactory je továrenská trieda na generovanie podpisov XML
  • XMLSigntaure vyžaduje a SignedInfo objekt, nad ktorým počíta podpis
  • XMLSigntaure tiež potrebuje KeyInfo, ktorý obsahuje podpisový kľúč a certifikát
  • Nakoniec XMLSignature podpíše dokument pomocou súkromného kľúča zapuzdreného ako DOMSignContext

Ako výsledok, dokument XML bude teraz obsahovať prvok Podpis, ktorým je možné overiť jeho integritu.

10. Zabezpečenie nad rámec jadra Java

Ako sme už videli, platforma Java poskytuje veľa potrebných funkcií na písanie zabezpečených aplikácií. Niekedy sú to však dosť nízke úrovne a nie sú priamo použiteľné napríklad pre štandardný bezpečnostný mechanizmus na webe.

Napríklad pri práci na našom systéme všeobecne nechceme, aby sme si museli prečítať celý OAuth RFC a implementovať ho sami. Často potrebujeme rýchlejšie spôsoby na vyššej úrovni, aby sme dosiahli bezpečnosť. To je miesto, kde prichádzajú na scénu aplikačné rámce - tie nám pomáhajú dosiahnuť náš cieľ s oveľa menším počtom štandardných kódov.

A na platforme Java - všeobecne to znamená Jarná bezpečnosť. Rámec je súčasťou jarného ekosystému, ale v skutočnosti sa dá použiť mimo čistej jarnej aplikácie.

Zjednodušene povedané, pomáha to dosiahnuť autentifikáciu, autorizáciu a ďalšie bezpečnostné prvky jednoduchým, deklaratívnym spôsobom na vysokej úrovni.

Jarná bezpečnosť je samozrejme obsiahle obsiahnutá v sérii tutoriálov, ako aj so sprievodcom v kurze Learn Spring Security.

11. Záver

Stručne povedané, v tomto tutoriáli sme si prešli architektúru zabezpečenia na vysokej úrovni v Jave. Tiež sme pochopili, ako nám Java poskytuje implementácie niektorých štandardných kryptografických služieb.

Videli sme tiež niektoré z bežných vzorov, ktoré môžeme použiť na dosiahnutie rozšíriteľného a pripojiteľného zabezpečenia v oblastiach, ako je autentifikácia a kontrola prístupu.

Ak to zhrnieme, poskytuje nám to iba krátku možnosť nahliadnuť do bezpečnostných funkcií jazyka Java. V dôsledku toho si každá z oblastí diskutovaných v tomto tutoriále zaslúži ďalšie skúmanie. Ale dúfajme, že by sme mali mať dostatok informácií, aby sme mohli začať týmto smerom!

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found