Bevezetés a Java SecurityManagerbe

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 beépített biztonsági infrastruktúráját, amely alapértelmezés szerint le van tiltva. Pontosabban megvizsgáljuk annak fő összetevőit, bővítési pontjait és konfigurációit.

2. SecurityManager akcióban

Lehet, hogy meglepetés, de alapértelmezett SecurityManager beállítások tiltásasok szokásos művelet:

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

Itt programozottan engedélyezzük a biztonsági felügyeletet alapértelmezett beállításokkal, és megpróbálunk csatlakozni a google.com-hoz.

Ezután a következő kivételt kapjuk:

java.security.AccessControlException: a hozzáférés megtagadva ("java.net.SocketPermission" "www.google.com:80" "csatlakozás, megoldás")

Számos egyéb felhasználási eset található a standard könyvtárban - például a rendszer tulajdonságainak olvasása, a környezeti változók leolvasása, a fájl megnyitása, a reflexió és a területi beállítás megváltoztatása, hogy csak néhányat említsünk.

3. Használati eset

Ez a biztonsági infrastruktúra a Java 1.0 óta elérhető. Ez volt az az idő, amikor az appletek - a böngészőbe ágyazott Java-alkalmazások - meglehetősen gyakoriak voltak. Természetesen korlátozni kellett a rendszerszintű erőforrásokhoz való hozzáférésüket.

Manapság a kisalkalmazások elavultak. Azonban, a biztonsági kikényszerítés még mindig tényleges fogalom, amikor olyan helyzet áll fenn, amikor harmadik fél kódja védett környezetben futtatható.

Vegyük például fontolóra, hogy van egy Tomcat-példányunk, ahol külső ügyfelek tárolhatják webalkalmazásaikat. Nem akarjuk megengedni nekik, hogy hasonló műveleteket hajtsanak végre System.exit () mert ez hatással lenne más alkalmazásokra és esetleg az egész környezetre.

4. Tervezés

4.1. SecurityManager

A beépített biztonsági infrastruktúra egyik fő eleme java.lang SecurityManager. Több is van checkXxx módszerek, mint checkConnect, amely a fenti teszt során engedélyezte a Google-hoz való kapcsolódás kísérletét. Mindannyian delegálják a checkPermission (java.security.Permission) módszer.

4.2. Engedély

java.biztonság. Engedély példányok képviselik az engedélyezési kérelmeket. A szokásos JDK osztályok létrehozzák őket minden potenciálisan veszélyes művelethez (például fájlok olvasásához / írásához, socket megnyitásához stb.), És átadják SecurityManager megfelelő engedélyezéshez.

4.3. Konfiguráció

Az engedélyeket egy speciális házirend-formátumban definiáljuk. Ezek az engedélyek a következő formában fordulnak elő támogatás bejegyzés:

grant codeBase "fájl: $ {{java.ext.dirs}} / *" {engedély java.security.AllPermission; };

A codeBase a fenti szabály nem kötelező. Egyáltalán nem adhatunk meg mezőt, vagy használhatunk aláírva ... által (beépítve a kulcstár megfelelő tanúsítványaival) vagy (java.biztonság keresztül csatlakozik az aktuális szálhoz javax.security.auth.Subject). E szabályok bármely kombinációját használhatjuk.

Alapértelmezés szerint a JVM betölti a <rendszeren található közös rendszerházirend-fájltjava.home> /lib/security/java.policy. Ha meghatároztunk bármilyen felhasználói-helyi házirendet a /.java.politika, a JVM hozzáfűzi a rendszer házirendjéhez.

A házirendfájl a parancssoron keresztül is megadható: -Djava.security.policy = / my / policy-file. Így házirendeket csatolhatunk a korábban betöltött rendszer- és felhasználói házirendekhez.

Van egy speciális szintaxis az összes rendszer- és felhasználói házirend (ha van) cseréjére - kettős egyenlőségjel: -Djava.security.policy == / my / policy-file

5. Példa

Adjunk meg egy egyedi engedélyt:

public class CustomPermission kiterjeszti a BasicPermission {public CustomPermission (karakterlánc neve) {super (név); } public CustomPermission (karakterlánc neve, karakterlánc-műveletek) {super (név, műveletek); }}

és egy megosztott szolgáltatás, amelyet védeni kell:

public class Service {public static final String OPERATION = "saját működésem"; public void művelet () {SecurityManager securityManager = System.getSecurityManager (); if (securityManager! = null) {securityManager.checkPermission (új CustomPermission (OPERÁCIÓ)); } System.out.println ("A művelet végrehajtva"); }}

Ha egy biztonsági kezelő engedélyezésével próbáljuk futtatni, kivételt képez:

java.security.AccessControlException: hozzáférés megtagadva ("com.baeldung.security.manager.CustomPermission" "my-operation") a java.security.AccessControlContext.checkPermission (AccessControlContext.java:472) címen a java.secission.checurity AccessController.java:884) a java.lang.SecurityManager.checkPermission (SecurityManager.java:549) oldalon com.baeldung.security.manager.Service.operation (Service.java:10)

Megalkothatjuk a mi /.java.politika fájlt a következő tartalommal, és próbálja újra futtatni az alkalmazást:

grant codeBase "fájl:" {engedély com.baeldung.security.manager.CustomPermission "my-operation"; };

Most nagyon jól működik.

6. Következtetés

Ebben a cikkben azt ellenőriztük, hogy a JDK beépített biztonsági rendszere hogyan szerveződik és hogyan tudjuk kibővíteni. Annak ellenére, hogy a célhasználat viszonylag ritka, jó, ha tisztában vagyunk vele.

Szokás szerint a cikk teljes forráskódja elérhető a GitHubon.

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