Pengenalan Java SecurityManager

Java Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat infrastruktur keselamatan bawaan Java, yang dilumpuhkan secara lalai. Secara khusus, kami akan memeriksa komponen utamanya, titik peluasan, dan konfigurasi.

2. SecurityManager dalam Tindakan

Mungkin mengejutkan, tetapi tetapan SecurityManager lalai tidak membenarkan banyak operasi standard :

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

Di sini, kami mengaktifkan pengawasan keselamatan secara teratur dengan tetapan lalai dan cuba menyambung ke google.com.

Kemudian kami mendapat pengecualian berikut:

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

Terdapat banyak kes penggunaan lain di perpustakaan standard - contohnya, sifat sistem membaca, pemboleh ubah persekitaran membaca, membuka fail, refleksi, dan mengubah lokasi, untuk menamakan beberapa.

3. Kes Penggunaan

Infrastruktur keselamatan ini telah tersedia sejak Java 1.0. Ini adalah masa di mana applet - aplikasi Java yang dimasukkan ke dalam penyemak imbas - sangat umum. Secara semula jadi, adalah perlu untuk membatasi akses mereka ke sumber sistem.

Pada masa ini, applet sudah usang. Walau bagaimanapun, penguatkuasaan keselamatan masih merupakan konsep yang sebenarnya apabila terdapat situasi di mana kod pihak ketiga dilaksanakan dalam lingkungan yang dilindungi .

Sebagai contoh, pertimbangkan bahawa kita mempunyai contoh Tomcat di mana pelanggan pihak ketiga boleh menjadi tuan rumah aplikasi web mereka. Kami tidak mahu membiarkan mereka menjalankan operasi seperti System.exit () kerana ini akan mempengaruhi aplikasi lain dan mungkin seluruh persekitaran.

4. Reka bentuk

4.1. Pengurus Keselamatan

Salah satu komponen utama dalam infrastruktur keselamatan terbina dalam adalah java.lang SecurityManager . Ia mempunyai beberapa kaedah checkXxx seperti checkConnect , yang membenarkan percubaan kami untuk menyambung ke Google dalam ujian di atas. Kesemua mereka mendelegasikan kaedah checkPermission (java.security.Permission) .

4.2. Kebenaran

java.security.Contoh penangguhan bermaksud permintaan kebenaran. Kelas JDK standard membuatnya untuk semua operasi yang berpotensi berbahaya (seperti membaca / menulis fail, membuka soket, dll.) Dan menyerahkannya kepada SecurityManager untuk mendapatkan kebenaran yang betul.

4.3. Konfigurasi

Kami menentukan kebenaran dalam format dasar khas. Kebenaran ini berbentuk penyertaan geran :

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

The pangkalan kod peraturan di atas adalah pilihan. Kami tidak dapat menentukan bidang sama sekali atau menggunakan signBy (disatukan dengan sijil yang sesuai di kedai kunci) atau prinsipal ( java.security.Prinsipal yang dilampirkan pada utas semasa melalui javax.security.auth.Subject ). Kita boleh menggunakan gabungan peraturan tersebut .

Secara lalai, JVM memuat fail dasar sistem umum yang terdapat di < java.home> /lib/security/java.policy . Sekiranya kami telah menentukan mana-mana dasar pengguna-tempatan di /.java.policy , JVM menambahkannya ke dasar sistem.

Anda juga boleh menentukan fail polisi melalui baris arahan: - Djava.security.policy = / my / polisi-fail . Dengan cara itu kita dapat menambahkan polisi ke sistem sistem dan pengguna yang dimuat sebelumnya.

Terdapat sintaks khas untuk menggantikan semua sistem dan dasar pengguna (jika ada) - tanda sama dengan dua kali ganda: - Djava.security.policy == / my / polisi-fail

5. Contoh

Mari tentukan kebenaran tersuai:

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

dan perkhidmatan 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"); } }

Sekiranya kami cuba menjalankannya dengan pengurus keselamatan diaktifkan, pengecualian dilemparkan:

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)

Kami boleh membuat fail /.java.policy kami dengan kandungan berikut dan cuba jalankan semula aplikasi:

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

Ia berfungsi dengan baik sekarang.

6. Kesimpulannya

Dalam artikel ini, kami memeriksa bagaimana sistem keselamatan JDK terbina dalam disusun dan bagaimana kami dapat memperluasnya. Walaupun kes penggunaan sasaran agak jarang berlaku, ada baiknya kita menyadarinya.

Seperti biasa, kod sumber lengkap untuk artikel ini terdapat di GitHub.

Bahagian bawah Java

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

>> SEMAK KURSUS