Pendahuluan tentang Java SecurityManager

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Dalam tutorial ini, kita akan melihat infrastruktur keamanan bawaan Java, yang dinonaktifkan secara default. Secara khusus, kami akan memeriksa komponen utamanya, titik ekstensi, dan konfigurasi.

2. Manajer Keamanan Beraksi

Ini mungkin mengejutkan, tetapi pengaturan SecurityManager default melarang banyak operasi standar :

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

Di sini, kami secara terprogram mengaktifkan pengawasan keamanan dengan setelan default dan mencoba menyambung ke google.com.

Kemudian kami mendapatkan pengecualian berikut:

java.security.AccessControlException: access denied ("java.net.SocketPermission" "www.google.com:80" "connect,resolve")

Ada banyak kasus penggunaan lain di pustaka standar - misalnya, membaca properti sistem, membaca variabel lingkungan, membuka file, refleksi, dan mengubah lokal, untuk beberapa nama.

3. Kasus Penggunaan

Infrastruktur keamanan ini telah tersedia sejak Java 1.0. Ini adalah masa di mana applet - aplikasi Java yang disematkan ke browser - cukup umum. Secara alami, akses mereka ke sumber daya sistem perlu dibatasi.

Saat ini, applet sudah usang. Namun, penegakan keamanan masih merupakan konsep aktual ketika ada situasi di mana kode pihak ketiga dieksekusi di lingkungan yang dilindungi .

Misalnya, pertimbangkan bahwa kami memiliki instance Tomcat tempat klien pihak ketiga dapat menghosting aplikasi web mereka. Kami tidak ingin mengizinkan mereka untuk menjalankan operasi seperti System.exit () karena itu akan memengaruhi aplikasi lain dan mungkin seluruh lingkungan.

4. Desain

4.1. Manajer keamanan

Salah satu komponen utama dalam infrastruktur keamanan bawaan adalah java.lang SecurityManager . Ini memiliki beberapa metode checkXxx seperti checkConnect , yang mengizinkan upaya kami untuk terhubung ke Google dalam pengujian di atas. Semuanya mendelegasikan ke metode checkPermission (java.security.Permission) .

4.2. Izin

Contoh java.security.Permission berdiri untuk permintaan otorisasi. Kelas JDK standar membuatnya untuk semua operasi yang berpotensi berbahaya (seperti membaca / menulis file, membuka soket, dll.) Dan memberikannya ke SecurityManager untuk otorisasi yang tepat.

4.3. Konfigurasi

Kami mendefinisikan izin dalam format kebijakan khusus. Izin ini berbentuk entri hibah :

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

The basis kode Aturan di atas adalah opsional. Kita tidak dapat menentukan kolom sama sekali di sana atau menggunakan signedBy (terintegrasi dengan sertifikat terkait di keystore) atau principal ( java.security.Principal yang dilampirkan ke thread saat ini melalui javax.security.auth.Subject ). Kita dapat menggunakan kombinasi apapun dari aturan tersebut .

Secara default, JVM memuat file kebijakan sistem umum yang terletak di < java.home> /lib/security/java.policy . Jika kita telah menentukan kebijakan lokal-pengguna di /.java.policy , JVM akan menambahkannya ke kebijakan sistem.

Ini juga memungkinkan untuk menentukan file kebijakan melalui baris perintah: - Djava.security.policy = / my / policy-file . Dengan cara itu kami dapat menambahkan kebijakan ke sistem dan kebijakan pengguna yang dimuat sebelumnya.

Ada sintaks khusus untuk mengganti semua sistem dan kebijakan pengguna (jika ada) - tanda sama dengan ganda: - Djava.security.policy == / my / policy-file

5. Contoh

Mari tentukan izin khusus:

public class CustomPermission extends BasicPermission { public CustomPermission(String name) { super(name); } public CustomPermission(String name, String actions) { super(name, actions); } }

dan layanan bersama yang harus dilindungi:

public class Service { public static final String OPERATION = "my-operation"; public void operation() { SecurityManager securityManager = System.getSecurityManager(); if (securityManager != null) { securityManager.checkPermission(new CustomPermission(OPERATION)); } System.out.println("Operation is executed"); } }

Jika kami mencoba menjalankannya dengan pengelola keamanan diaktifkan, pengecualian akan muncul:

java.security.AccessControlException: access denied ("com.baeldung.security.manager.CustomPermission" "my-operation") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at com.baeldung.security.manager.Service.operation(Service.java:10)

Kita dapat membuat file /.java.policy kita dengan konten berikut dan mencoba menjalankan kembali aplikasi:

grant codeBase "file:" { permission com.baeldung.security.manager.CustomPermission "my-operation"; };

Ini bekerja dengan baik sekarang.

6. Kesimpulan

Pada artikel ini, kami memeriksa bagaimana sistem keamanan JDK bawaan diatur dan bagaimana kami dapat memperluasnya. Meskipun kasus penggunaan target relatif jarang, ada baiknya Anda menyadarinya.

Seperti biasa, kode sumber lengkap untuk artikel ini tersedia di GitHub.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya