Uvod u Java SecurityManager

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom ćemo uputstvu pogledati ugrađenu Javinu sigurnosnu infrastrukturu koja je prema zadanim postavkama onemogućena. Konkretno, ispitat ćemo njegove glavne komponente, točke proširenja i konfiguracije.

2. SecurityManager na djelu

Moglo bi biti iznenađenje, ali zadano SecurityManager postavke zabranitimnoge standardne operacije:

System.setSecurityManager (novi SecurityManager ()); novi URL ("// www.google.com"). openConnection (). connect ();

Ovdje programski omogućujemo nadzor sigurnosti sa zadanim postavkama i pokušavamo se povezati s google.com.

Tada dobivamo sljedeću iznimku:

java.security.AccessControlException: pristup odbijen ("java.net.SocketPermission" "www.google.com:80" "poveži, riješi")

Postoje brojni drugi slučajevi upotrebe u standardnoj knjižnici - na primjer, svojstva sustava za čitanje, varijable okruženja za čitanje, otvaranje datoteke, odraz i promjena jezika, da nabrojimo samo neke.

3. Slučaj upotrebe

Ova sigurnosna infrastruktura dostupna je od Jave 1.0. Bilo je to vrijeme kada su apleti - Java programi ugrađeni u preglednik - bili prilično česti. Naravno, bilo im je potrebno ograničiti pristup resursima sustava.

U današnje vrijeme apleti su zastarjeli. Međutim, sigurnosna provedba i dalje je stvarni koncept kada postoji situacija u kojoj se kod treće strane izvršava u zaštićenom okruženju.

Na primjer, uzmite u obzir da imamo Tomcat instancu u kojoj klijenti treće strane mogu hostirati svoje web aplikacije. Ne želimo im dopustiti da izvršavaju takve operacije System.exit () jer bi to utjecalo na druge aplikacije i možda na cijelo okruženje.

4. Dizajn

4.1. SecurityManager

Jedna od glavnih komponenti ugrađene sigurnosne infrastrukture je java.lang SecurityManager. Ima ih nekoliko checkXxx metode poput checkConnect, koji je autorizirao naš pokušaj povezivanja s Googleom u gore navedenom testu. Svi su oni delegati u checkPermission (java.security.Permission) metoda.

4.2. Dopuštenje

java.sigurnost.Dozvola instance predstavljaju zahtjeve za autorizaciju. Standardne JDK klase stvaraju ih za sve potencijalno opasne operacije (poput čitanja / pisanja datoteke, otvaranja utičnice itd.) I predaju ih SecurityManager za pravilno ovlaštenje.

4.3. Konfiguracija

Dopuštenja definiramo u posebnom formatu pravila. Ta dopuštenja imaju oblik dodijeliti unosi:

grant codeBase "datoteka: $ {{java.ext.dirs}} / *" {dozvola java.security.AllPermission; };

The codeBase gornje pravilo nije obavezno. Tamo uopće ne možemo navesti niti koristiti polje potpisaoBy (integrirano s odgovarajućim certifikatima u pohrani ključeva) ili glavni (java.sigurnost.Glavni pričvršćen na trenutnu nit putem javax.security.auth.Subject). Možemo koristiti bilo koju kombinaciju tih pravila.

Prema zadanim postavkama, JVM učitava zajedničku datoteku sistemskih pravila koja se nalazi na <java.home> /lib/security/java.policy. Ako smo definirali bilo koja lokalno-korisnička pravila u /.java.policy, JVM ga dodaje sistemskoj politici.

Također je moguće odrediti datoteku pravila putem naredbenog retka: -Djava.security.policy = / moja / datoteka-politike. Na taj način možemo dodati politike prethodno učitanom sustavu i korisničkim pravilima.

Postoji posebna sintaksa za zamjenu svih sistemskih i korisničkih pravila (ako postoje) - dvostruki znak jednakosti: -Djava.security.policy == / my / policy-file

5. Primjer

Definirajmo prilagođeno dopuštenje:

javna klasa CustomPermission proširuje BasicPermission {public CustomPermission (naziv niza) {super (ime); } javna CustomPermission (naziv niza, niz radnji) {super (ime, radnje); }}

i zajednička usluga koju treba zaštititi:

usluga javne klase {public static final String OPERATION = "my-operation"; javna void operacija () {SecurityManager securityManager = System.getSecurityManager (); if (securityManager! = null) {securityManager.checkPermission (nova CustomPermission (OPERATION)); } System.out.println ("Operacija je izvršena"); }}

Ako ga pokušamo pokrenuti s omogućenim upraviteljem sigurnosti, pojavit će se izuzetak:

java.security.AccessControlException: pristup odbijen ("com.baeldung.security.manager.CustomPermission" "moja-operacija") na java.security.AccessControlContext.checkPermission (AccessControlContext.java:472) na java.security.AccessPercontrol AccessController.java:884) na java.lang.SecurityManager.checkPermission (SecurityManager.java:549) na com.baeldung.security.manager.Service.operation (Service.java:10)

Možemo stvoriti svoje /.java.policy datoteku sa sljedećim sadržajem i pokušajte ponovno pokrenuti aplikaciju:

grant codeBase "datoteka:" {dozvola com.baeldung.security.manager.CustomPermission "moja operacija"; };

Sad to sasvim dobro funkcionira.

6. Zaključak

U ovom smo članku provjerili kako je ugrađeni JDK sigurnosni sustav organiziran i kako ga možemo proširiti. Iako je ciljni slučaj upotrebe relativno rijedak, dobro je toga biti svjestan.

Kao i obično, cjeloviti izvorni kod za ovaj članak dostupan je na GitHubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ