Evolusi dan konsep keselamatan Java, Bahagian 3: Keselamatan applet

Pertumbuhan awal Java didorong oleh kod yang boleh dimuat turun melalui rangkaian, lebih dikenali sebagai applet. Keamanan applet telah berkembang dengan pertumbuhan Java, dan hari ini menjadi sumber kekeliruan yang kerap disebabkan oleh pelbagai versi Java, penyemak imbas yang tersedia secara komersial, dan pemalam.

Artikel ini, yang ketiga dalam siri ini, akan merangkumi pelbagai syarat untuk menjalankan kod Java yang dimuat turun dari rangkaian dengan selamat. Walaupun kod mudah alih bukanlah konsep revolusioner, Java dan Internet menghadirkan beberapa cabaran unik terhadap keselamatan komputer. Evolusi seni bina Java dan kesannya terhadap keamanan inti Java dibincangkan dalam Bahagian 1 dan 2. Artikel ini mengambil jalan yang berbeza: pendekatan langsung untuk mengikat semua konsep bersama-sama dengan menggunakan applet sederhana yang menulis ke sistem fail tempatan .

Evolusi dan konsep keselamatan Java: Baca keseluruhan siri!

  • Bahagian 1: Pelajari konsep dan istilah keselamatan komputer dalam gambaran keseluruhan pengenalan ini
  • Bahagian 2: Temukan selok-belok keselamatan Java
  • Bahagian 3: Tangani keselamatan applet Java dengan yakin
  • Bahagian 4: Ketahui bagaimana pakej pilihan memperluas dan meningkatkan keselamatan Java
  • Bahagian 5: J2SE 1.4 menawarkan banyak peningkatan keselamatan Java

Contoh inti applet adalah kriptografi kunci awam, yang diperkenalkan sebelumnya dalam siri ini. Kod yang ditandatangani menggunakan kunci peribadi penandatangan dapat dijalankan pada mesin pelanggan setelah kunci awam yang sesuai dengan penandatangan dianggap sebagai dipercayai pada mesin masing-masing. Kami juga akan membincangkan bagaimana fail polisi, yang memberikan kebenaran dan kedai kunci, dapat digunakan sebagai repositori untuk kunci awam dan swasta. Lebih-lebih lagi, kami akan menyoroti alat keselamatan Java 2 SDK dan Netscape signtool, kerana ia memungkinkan penyebaran.

Artikel ini menelusuri evolusi keamanan Java, dimulai dengan keamanan aplikasi pada rilis awal Java 2 dan beralih ke versi terbaru Java 2, versi 1.3. Pendekatan ini membantu memperkenalkan konsep secara beransur-ansur, bermula dengan konsep yang sangat sederhana dan memuncak pada contoh yang cukup maju.

Siri ini tidak bermaksud memberikan panduan menyeluruh mengenai keselamatan komputer. Keselamatan komputer adalah isu pelbagai aspek yang menyentuh beberapa disiplin ilmu, jabatan, dan budaya. Pelaburan dalam teknologi harus ditindaklanjuti dengan investasi dalam pelatihan personel, penguatkuasaan kebijakan yang ketat, dan tinjauan berkala terhadap keseluruhan kebijakan keselamatan.

Catatan: Artikel ini menampilkan applet Java yang sedang berjalan yang dirancang untuk menunjukkan masalah keselamatan applet. Baca di bawah untuk maklumat lebih lanjut.

Keselamatan aplikasi

Mari mulakan siasatan kami dengan melihat keselamatan aplikasi. Di Bahagian 2 kita melihat bagaimana keamanan Java telah berkembang dari model kotak pasir menjadi model keamanan yang halus. Kami juga melihat bahawa aplikasi (kod tempatan) secara lalai mendapat pemerintahan bebas dan tidak tunduk pada kontrol yang sama seperti applet (kod yang dapat diunduh rangkaian), yang biasanya dianggap tidak dipercaya. Dalam perubahan dari masa lalu, di Java 2 aplikasi keselamatan secara opsional dapat dikenakan tingkat kontrol yang sama dengan applet.

Pertama, catatan ringkas mengenai writeFile.java, kod yang digunakan dalam artikel ini untuk menggambarkan ciri-ciri keselamatan di Java 2. Program ini adalah versi kod applet yang sedikit diubah suai yang disediakan oleh Sun, tersedia melalui Web untuk menggambarkan beberapa ciri Java 2 keselamatan. Program ini, diubahsuai untuk memberikan sokongan aplikasi, berupaya membuat dan menulis fail pada sistem fail tempatan. Akses ke sistem fail tempatan disaring oleh pengurus keselamatan. Kami akan melihat sepanjang artikel ini bagaimana operasi khusus ini dapat dibenarkan dengan cara yang selamat.

/ ** * Secara lalai, ini menimbulkan pengecualian keselamatan sebagai applet. * * Dengan JDK 1.2 appletviewer, * jika anda mengkonfigurasi sistem anda untuk memberikan applet yang ditandatangani oleh "Duke" * dan dimuat turun dari Laman Web Perisian Java untuk menulis file * ke direktori / tmp anda (atau ke file bernama "C: \ tmpfoo "pada sistem * Windows), maka applet ini dapat dijalankan. * * @version JDK 1.2 * @author Marianne Mueller * @Diubah suai oleh Raghavan Srinivas [Rags] * / import java.awt. *; import java.io. *; import java.lang. *; import java.applet. *; publicFileFile meluaskan Applet {String myFile = "/ tmp / foo"; Fail f = Fail baru (myFile); DataOutputStream; init kekosongan awam () {String osname = System.getProperty ("os.name"); if (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo";}} cat kekosongan awam (Grafik g) {cuba {dos = DataOutputStream baru (BufferedOutputStream baru (FileOutputStream baru (myFile), 128)); dos.writeBytes ("Kucing boleh menghipnotis anda apabila anda tidak menjangkakannya \ n"); dos.flush (); dos.close (); g.drawString ("Berjaya menulis ke fail bernama" + myFile + "- lihatlah!", 10, 10); } tangkapan (SecurityException e) {g.drawString ("writeFile: tertangkap pengecualian keselamatan", 10, 10); } tangkapan (IOException آغاز) {g.drawString ("writeFile: catch i / o pengecualian", 10, 10); }} utama kekosongan statik awam (String args []) {Frame f = bingkai baru ("writeFile"); writeFile writefile = writeFile baru (); writefile.init (); writefile.start (); f.add ("Pusat", menulis fail); f.setSize (300, 100); f.show (); }}}}}}Kucing boleh menghipnotis anda apabila anda tidak menjangkakannya \ n "); dos.flush (); dos.close (); g.drawString (" Berjaya menulis ke fail bernama "+ myFile +" - lihatlah ia ! ", 10, 10);} tangkap (SecurityException e) {g.drawString (" writeFile: tertangkap pengecualian keselamatan ", 10, 10);} tangkap (IOException pengguna) {g.drawString (" writeFile: catch i / o pengecualian ", 10, 10);}} utama kekosongan statik awam (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 boleh menghipnotis anda apabila anda paling tidak mengharapkannya \ n "); dos.flush (); dos.close (); g.drawString (" Berjaya menulis ke fail bernama "+ myFile +" - lihatlah ! ", 10, 10);} tangkap (SecurityException e) {g.drawString (" writeFile: tertangkap pengecualian keselamatan ", 10, 10);} tangkap (IOException pengguna) {g.drawString (" writeFile: catch i / o pengecualian ", 10, 10);}} kekosongan statik awam utama (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 ();}}} tangkapan (SecurityException e) {g.drawString ("writeFile: tertangkap pengecualian keselamatan", 10, 10); } tangkapan (IOException آغاز) {g.drawString ("writeFile: tertangkap pengecualian i / o", 10, 10); }} umum kekosongan statik awam (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = writeFile baru (); writefile.init (); writefile.start (); f.add ("Pusat", file tulis); f.setSize (300, 100); f.show (); }}} tangkapan (SecurityException e) {g.drawString ("writeFile: tertangkap pengecualian keselamatan", 10, 10); } tangkapan (IOException آغاز) {g.drawString ("writeFile: catch i / o pengecualian", 10, 10); }} utama kekosongan statik awam (String args []) {Frame f = bingkai baru ("writeFile"); writeFile writefile = writeFile baru (); writefile.init (); writefile.start (); f.add ("Pusat", menulis fail); f.setSize (300, 100); f.show (); }}

Menjalankan bytecode yang dihasilkan dalam Java 2 Runtime Environment, Standard Edition (JRE) akan membiarkan aplikasi mengubah fail pada sistem fail tempatan secara lalai, kerana kebijakan lalai tidak menundukkan aplikasi Java 2 kepada pengurus keselamatan. Dasar ini dibenarkan kerana aplikasi biasanya dibuat kod tempatan dan tidak dimuat turun melalui rangkaian. Baris arahan berikut menghasilkan tetingkap yang ditunjukkan dalam Gambar 1, menunjukkan bahawa fail itu dibuat dan ditulis.

$ java writeFile 

Untuk menyerahkan kod tersebut ke pengurus keamanan Java 2, gunakan baris perintah berikut, yang harus menghasilkan hasil yang ditunjukkan dalam Gambar 2. Perhatikan bahawa aplikasi menghasilkan pengecualian keamanan yang disebabkan oleh usaha untuk mengubah sistem fail tempatan. Pengurus keselamatan yang dinyatakan secara eksplisit menghasilkan pengecualian.

$ java -Djava.security.manager writeFile 

Kes-kes yang digambarkan di atas mewakili contoh dasar keselamatan yang melampau. Dalam kes sebelumnya, permohonan itu tidak terkawal; pada yang terakhir, ia dikenakan kawalan yang sangat ketat. Dalam kebanyakan kes, perlu menetapkan polisi di suatu tempat di antara mereka.

Anda boleh mencapai polisi di antara menggunakan fail polisi. Untuk melakukannya, buat fail polisi yang disebut all.policydi direktori kerja:

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

Menjalankan kod yang sama dengan baris arahan berikut akan memungkinkan pengubahsuaian sistem fail tempatan:

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

Dalam contoh ini, aplikasi tunduk pada pengurus keamanan, tetapi keseluruhan kebijakan diatur oleh file kebijakan, yang memungkinkan semua file pada sistem fail lokal diubah. Kebijakan yang lebih ketat mungkin membenarkan pengubahsuaian hanya fail yang berkaitan - tmpfoodalam kes ini.

Saya akan membahas lebih banyak perincian fail polisi, termasuk sintaks entri, kemudian dalam artikel ini. Tetapi pertama, mari kita lihat keselamatan applet dan membezakannya dengan keselamatan aplikasi.

Keselamatan applet

Setakat ini, kami telah mengkaji keselamatan aplikasi. Oleh itu, kebanyakan ciri keselamatan dapat diakses dan diubah melalui baris perintah. Menyediakan polisi yang selamat dan agak fleksibel dalam persekitaran applet terbukti jauh lebih mencabar. Kami akan memulakan dengan melihat penggunaan applet di Appletviewer. Kami akan melihat applet penyemak imbas kemudian.

Dasar kod Java terutama ditentukan oleh CodeSource, yang merangkumi dua bahagian maklumat: tempat asal kod tersebut dan orang yang menandatanganinya.

Pelayan Aplikasi

Buat fail yang dipanggil writeFile.htmldengan kandungan berikut:

  Contoh Keselamatan Java: Menulis Fail 
   

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.