Evolusi dan konsep keamanan Java, Bagian 3: Keamanan applet

Pertumbuhan awal Java didorong oleh kode yang dapat diunduh melalui jaringan, yang lebih dikenal sebagai applet. Keamanan applet telah berkembang seiring dengan pertumbuhan Java, dan saat ini sering menjadi sumber kebingungan karena variasi versi Java, browser yang tersedia secara komersial, dan plug-in.

Artikel ini, yang ketiga dari seri ini, akan membahas berbagai persyaratan untuk menjalankan kode Java yang diunduh dari jaringan dengan aman. Meskipun kode seluler bukanlah konsep revolusioner, Java dan Internet menghadirkan beberapa tantangan unik pada keamanan komputer. Evolusi arsitektur Java dan dampaknya pada keamanan inti Java telah dibahas di Bagian 1 dan 2. Artikel ini membahas cara yang berbeda: pendekatan langsung untuk menyatukan semua konsep dengan menggunakan applet sederhana yang menulis ke sistem file lokal .

Evolusi dan konsep keamanan Java: Baca seluruh seri!

  • Bagian 1: Pelajari konsep dan istilah keamanan komputer dalam ikhtisar pengantar ini
  • Bagian 2: Temukan seluk beluk keamanan Java
  • Bagian 3: Tangani keamanan applet Java dengan percaya diri
  • Bagian 4: Pelajari bagaimana paket opsional memperluas dan meningkatkan keamanan Java
  • Bagian 5: J2SE 1.4 menawarkan banyak peningkatan pada keamanan Java

Contoh inti applet adalah kriptografi kunci publik, yang diperkenalkan sebelumnya dalam seri ini. Kode yang ditandatangani menggunakan kunci pribadi penanda tangan dapat dijalankan pada mesin klien setelah kunci publik yang sesuai dengan penanda tangan dianggap terpercaya pada mesin masing-masing. Kami juga akan membahas bagaimana file kebijakan, yang memberikan izin dan keystore, dapat digunakan sebagai repositori untuk kunci publik dan pribadi. Selain itu, kami akan menyoroti alat keamanan Java 2 SDK dan Netscape signtool, karena keduanya memungkinkan penerapan.

Artikel ini menelusuri evolusi keamanan Java, dimulai dengan keamanan aplikasi di rilis awal Java 2 dan berlanjut ke versi terbaru Java 2, versi 1.3. Pendekatan ini membantu memperkenalkan konsep secara bertahap, dimulai dengan konsep yang sangat sederhana dan berpuncak pada contoh yang cukup canggih.

Seri ini tidak bermaksud untuk memberikan panduan lengkap tentang keamanan komputer. Keamanan komputer adalah masalah multifaset yang menyentuh beberapa disiplin ilmu, departemen, dan budaya. Investasi dalam teknologi harus ditindaklanjuti dengan investasi dalam pelatihan personel, penegakan kebijakan yang ketat, dan tinjauan berkala terhadap kebijakan keamanan secara keseluruhan.

Catatan: Artikel ini menampilkan applet Java yang sedang berjalan yang dirancang untuk mendemonstrasikan masalah keamanan applet. Baca di bawah untuk lebih jelasnya.

Keamanan aplikasi

Mari kita mulai penyelidikan kita dengan melihat keamanan aplikasi. Di Bagian 2 kita melihat bagaimana keamanan Java telah berevolusi dari model kotak pasir menjadi model keamanan yang sangat rinci. Kami juga melihat bahwa aplikasi (kode lokal) secara default mendapatkan pemerintahan bebas dan tidak tunduk pada kontrol yang sama seperti applet (kode yang dapat diunduh jaringan), yang biasanya dianggap tidak tepercaya. Dalam perubahan dari masa lalu, di Java 2 aplikasi keamanan dapat secara opsional tunduk pada tingkat kontrol yang sama seperti applet.

Pertama, catatan singkat tentang writeFile.java, kode yang digunakan dalam artikel ini untuk menggambarkan fitur keamanan di Java 2. Program ini adalah versi sedikit modifikasi dari kode applet yang disediakan oleh Sun, tersedia melalui Web untuk menggambarkan beberapa fitur Java 2 keamanan. Program, dimodifikasi untuk memberikan dukungan aplikasi, mencoba membuat dan menulis file pada sistem file lokal. Akses ke sistem file lokal disaring oleh manajer keamanan. Kami akan melihat di seluruh artikel ini bagaimana operasi khusus ini dapat diizinkan dengan cara yang aman.

/ ** * Secara default, ini memunculkan pengecualian keamanan sebagai applet. * * Dengan appletviewer JDK 1.2, * jika Anda mengonfigurasi sistem untuk memberikan applet yang ditandatangani oleh "Duke" * dan diunduh dari Situs Web Perangkat Lunak Java untuk menulis file * ke direktori / tmp Anda (atau ke file bernama "C: \ tmpfoo "di sistem * Windows), maka applet ini dapat berjalan. * * @version JDK 1.2 * @author Marianne Mueller * @Modifikasi oleh Raghavan Srinivas [Rags] * / import java.awt. *; impor java.io. *; import java.lang. *; import java.applet. *; public class writeFile meluas Applet {String myFile = "/ tmp / foo"; File f = File baru (myFile); Dos DataOutputStream; public void init () {String osname = System.getProperty ("os.name"); if (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo";}} public void paint (Grafik g) {coba {dos = DataOutputStream baru (BufferedOutputStream baru (FileOutputStream baru (myFile), 128)); dos.writeBytes ("Kucing dapat menghipnotis Anda saat Anda tidak menduganya \ n"); dos.flush (); dos.close (); g.drawString ("Berhasil menulis ke file bernama" + myFile + "- lihatlah!", 10, 10); } menangkap (SecurityException e) {g.drawString ("writeFile: menangkap pengecualian keamanan", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o exception", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Center", writefile); f. setSize (300, 100); f.show (); }}}}}}Kucing dapat menghipnotis Anda saat Anda tidak menduganya \ n "); dos.flush (); dos.close (); g.drawString (" Berhasil menulis ke file bernama "+ myFile +" - lihatlah ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: catch security exception ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o pengecualian ", 10, 10);}} public static void main (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Center", writefile); f.setSize (300, 100); f.show ();}}Kucing dapat menghipnotis Anda saat Anda tidak menduganya \ n "); dos.flush (); dos.close (); g.drawString (" Berhasil menulis ke file bernama "+ myFile +" - lihatlah ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: catch security exception ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o pengecualian ", 10, 10);}} public static void main (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Center", writefile); f.setSize (300, 100); f.show ();}}} menangkap (SecurityException e) {g.drawString ("writeFile: menangkap pengecualian keamanan", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o exception", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Center", writefile); f. setSize (300, 100); f.show (); }}} menangkap (SecurityException e) {g.drawString ("writeFile: menangkap pengecualian keamanan", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: catch i / o exception", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Center", writefile); f. setSize (300, 100); f.show (); }}

Menjalankan bytecode yang dibuat di Java 2 Runtime Environment, Edisi Standar (JRE) akan memungkinkan aplikasi mengubah file pada sistem file lokal secara default, karena kebijakan default tidak memasukkan aplikasi Java 2 ke manajer keamanan. Kebijakan ini dibenarkan karena aplikasi biasanya merupakan kode yang dibuat secara lokal dan tidak diunduh melalui jaringan. Baris perintah berikut menghasilkan jendela yang ditunjukkan pada Gambar 1, menunjukkan bahwa file itu dibuat dan ditulis.

$ java writeFile 

Untuk memasukkan kode ke manajer keamanan Java 2, panggil baris perintah berikut, yang akan menghasilkan hasil yang ditunjukkan pada Gambar 2. Perhatikan bahwa aplikasi menghasilkan pengecualian keamanan yang disebabkan oleh upaya untuk mengubah sistem file lokal. Manajer keamanan yang disertakan secara eksplisit menghasilkan pengecualian.

$ java -Djava.security.manager writeFile 

Kasus yang diilustrasikan di atas merupakan contoh ekstrim dari kebijakan keamanan. Dalam kasus sebelumnya, aplikasi tidak tunduk pada kontrol apa pun; yang terakhir, itu tunduk pada kontrol yang sangat kaku. Dalam kebanyakan kasus, kebijakan perlu ditetapkan di antara keduanya.

Anda dapat mencapai kebijakan di antara menggunakan file kebijakan. Untuk melakukannya, buat file kebijakan yang disebut all.policydi direktori kerja:

berikan {izin java.io.FilePermission "<>", "write"; };

Menjalankan bagian kode yang sama dengan baris perintah berikut akan memungkinkan modifikasi sistem file lokal:

$ java -Djava.security.manager -Djava.security.policy = all.policy writeFile 

Dalam contoh ini, aplikasi tunduk pada manajer keamanan, tetapi kebijakan keseluruhan diatur oleh file kebijakan, yang memungkinkan semua file pada sistem file lokal untuk dimodifikasi. Kebijakan yang lebih ketat mungkin hanya mengizinkan modifikasi file yang relevan - tmpfoodalam kasus ini.

Saya akan membahas lebih detail tentang file kebijakan, termasuk sintaks entri, nanti di artikel ini. Tetapi pertama-tama, mari kita lihat keamanan applet dan membandingkannya dengan keamanan aplikasi.

Keamanan applet

Sejauh ini, kami telah mempelajari keamanan aplikasi. Dengan demikian, sebagian besar fitur keamanan dapat diakses dan dimodifikasi melalui baris perintah. Menyediakan kebijakan yang cukup aman namun agak fleksibel dalam lingkungan applet terbukti jauh lebih menantang. Kami akan mulai dengan melihat penerapan applet di Appletviewer. Kita akan melihat applet yang digunakan browser nanti.

Kebijakan kode Java terutama ditentukan oleh CodeSource, yang terdiri dari dua bagian informasi: tempat asal kode dan orang yang menandatanganinya.

Appletviewer

Buat file bernama writeFile.htmldengan konten berikut:

  Contoh Keamanan Java: Menulis File 
   

Running the applet with the following command line would result in the window shown in Figure 3:

$ appletviewer writeFile.html 

Notice that -- in contrast to what would happen with an application -- the applet generated an exception since the applet is subject to the security manager by default. The installation can be governed by a customizable policy, if required. Running the following command line:

appletviewer -J"-Djava.security.policy=all.policy" writeFile.html 

would, as you might expect, allow modification of the tmpfoo file, since this was permitted in accordance with the policy file.

Browsers

Applet security in browsers strives to prevent untrusted applets from performing potentially dangerous operations, while simultaneously allowing optimal access to trusted applets. Applet security deployment in browsers is substantially different from what we have seen so far, primarily due to the following reasons:

  • A default lack of trust in code downloaded over the network
  • Insufficient access to the command-line options for running the JVM, since the JVM is hosted in the context of a browser
  • Inadequate support for some of the latest security features in the JVMs bundled with browsers

As for the first problem, to obviate the potential problems resulting from running untrusted code, earlier versions of Java used the sandbox model (see "Sidebar 1: Sandbox Model"). Trust is a largely philosophical or emotional issue, rather than a technical issue; however, technology can help. For example, Java code can be signed using certificates. In this example, the signer implicitly vouches for the code by signing it. The onus is ultimately upon the user running the code to trust the signing entity or not, given that these certificates guarantee that the code was indeed signed by the intended person or organization.

The second problem stems from the lack of access to the options for running the JVM in the browser context. For example, there is no simple way to deploy and use customized policy files as we could in the previous example. Instead, such policies will have to be set by files based on the JRE installation. Customized class loaders or security managers cannot be installed easily.

The third problem, the lack of support for the latest versions of the JRE in the default JVM with the browser, is solved by using the Java plug-in (see "Sidebar 2: Java Plug-in Primer"). Indeed, an underlying issue is that modification of policy files is not very straightforward. Since applets may be deployed on thousands or even millions of client machines, there might be environments where users might not have a good understanding of security or may not be acquainted with methods for modifying the policy file. The Java plug-in provides a workaround, although it's recommended to use policy files wherever practical and applicable.

Next, we'll look in more detail at applet security involving code-signing examples in a browser environment with a Java plug-in. We will confine the discussion to Java plug-in version 1.3 unless explicitly stated otherwise.

The Java plug-in and security

The Java plug-in supports the standard Java 2 SDK, Standard Edition (J2SE), including the security model. All applets run under the standard applet security manager, which prevents potentially malicious applets from performing dangerous operations, such as reading local files. RSA-signed applets can be deployed using the Java plug-in. Additionally, the Java plug-in attempts to run applets in an identical way in both Netscape Navigator and Internet Explorer by avoiding browser-specific resources. This ensures that an RSA-signed applet will run identically in both browsers with the Java plug-in. The Java plug-in also supports HTTPS, a secure version of HTTP.

In order for a plug-in-enhanced browser to trust an applet and grant it all privileges or a set of fine-grained permissions (as specified in a J2EE policy file), the user has to preconfigure his or her cache of trusted signer certificates (the .keystore file in JRE 1.3) to add the applet's signer to it. However, this solution does not scale well if the applet needs to be deployed on thousands of client machines, and may not always be feasible because users may not know in advance who signed the applet that they are trying to run. Also, earlier versions of the Java plug-in supported code signing using DSA, which is not as widely prevalent as RSA.

A new class loader, sun.plugin.security.PluginClassLoader in the Java plug-in 1.3, overcomes the limitations mentioned above. It implements support for RSA verification and dynamic trust management.

The Software Development Kit (SDK) tools

The three tools dealing with security, available as part of the Java 2 SDK, are:

  • keytool -- Manages keystores and certificates
  • jarsigner -- Generates and verifies JAR signatures
  • policytool -- Manages policy files via a GUI-based tool

We will look at some of these tools' important options in the sections below. Refer to Resources for more detailed documentation associated with particular tools.