Razvoj i koncepti Java sigurnosti, Dio 3: Sigurnost apleta

Rani rast Jave potaknuo je kod koji se može preuzeti putem mreže, bolje poznate kao apleti. Sigurnost apleta evoluirala je rastom Jave i danas je izvor čestih zabuna zbog raznolikosti Java inačica, komercijalno dostupnih preglednika i dodataka.

Ovaj članak, treći u nizu, pokriti će različite zahtjeve za sigurno izvođenje Java koda preuzetog s mreže. Iako mobilni kod nije revolucionaran koncept, Java i Internet predstavljaju neke jedinstvene izazove računalnoj sigurnosti. O evoluciji Java arhitekture i njezinom utjecaju na osnovnu Java sigurnost raspravljalo se u dijelovima 1 i 2. Ovaj članak zauzima drugačiji pristup: praktični pristup povezivanju svih koncepata postavljanjem jednostavnog apleta koji piše u lokalni datotečni sustav .

Razvoj i koncepti Java sigurnosti: Pročitajte cijelu seriju!

  • 1. dio: Naučite koncepte i pojmove računalne sigurnosti u ovom uvodnom pregledu
  • Dio 2: Otkrijte sitnice i sigurnosne znakove Java sigurnosti
  • Dio 3: S pouzdanjem se uhvatite u koštac sa sigurnošću Java apleta
  • Dio 4: Saznajte kako opcijski paketi proširuju i poboljšavaju Java sigurnost
  • Dio 5: J2SE 1.4 nudi brojna poboljšanja Java zaštite

U primjeru jezgre apleta nalazi se kriptografija javnog ključa, predstavljena ranije u ovoj seriji. Kôd potpisan privatnim ključem potpisnika može se pokrenuti na klijentskim računalima kada se javni ključ koji odgovara potpisniku smatra pouzdanim na odgovarajućem računalu. Također ćemo razgovarati o tome kako se datoteke s pravilima koje daju dozvole i pohranu ključeva mogu koristiti kao spremište za javne i privatne ključeve. Štoviše, istaknut ćemo Java 2 SDK sigurnosne alate i Netscape-ove signtool, jer oni omogućuju implementaciju.

Ovaj članak prati razvoj Java sigurnosti, počevši od sigurnosti aplikacija u početnom izdanju Java 2 i prelazeći na najnoviju verziju Java 2, verziju 1.3. Ovaj pristup pomaže uvođenju koncepata postupno, počevši od vrlo jednostavnih koncepata i kulminirajući prilično naprednim primjerom.

Ova serija ne namjerava pružiti sveobuhvatan vodič za računalnu sigurnost. Računalna sigurnost je višestruko pitanje koje se tiče nekoliko disciplina, odjela i kultura. Ulaganja u tehnologije trebaju se pratiti ulaganjem u obuku osoblja, strogo provođenje politika i povremeni pregled cjelokupne sigurnosne politike.

Napomena: Ovaj članak sadrži pokrenut Java aplet dizajniran da demonstrira sigurnosne probleme apleta. Za više detalja pročitajte u nastavku.

Sigurnost aplikacije

Započnimo istraživanje istražujući sigurnost aplikacije. U drugom smo dijelu vidjeli kako je Java sigurnost evoluirala od modela pješčanika do fino zrnatog sigurnosnog modela. Također smo vidjeli da aplikacije (lokalni kôd) prema zadanim postavkama dobivaju besplatno vladanje i ne podliježu istoj kontroli kao apleti (mrežni kôd koji se može preuzeti), a koji se obično smatraju nepouzdanima. Kao promjenu u prošlosti, u Javi 2 sigurnosne aplikacije mogu prema želji podlijegati istoj razini kontrole kao i apleti.

Prvo, kratka napomena o writeFile.javakodu korištenom u ovom članku za ilustraciju sigurnosnih značajki u Javi 2. Ovaj program je malo izmijenjena verzija koda apleta koju nudi Sun, a dostupna je putem weba za ilustraciju nekih značajki Jave 2 sigurnost. Program, izmijenjen kako bi pružio podršku aplikacijama, pokušava stvoriti i napisati datoteku na lokalnom datotečnom sustavu. Pristup lokalnom datotečnom sustavu provjerava upravitelj sigurnosti. Kroz ovaj ćemo članak vidjeti kako se ta određena operacija može dopustiti na siguran način.

/ ** * Prema zadanim postavkama ovo postavlja sigurnosnu iznimku kao aplet. * * S JDK 1.2 appletviewer, * ako konfigurirate svoj sustav tako da dodjeljuje aplete potpisane od "Duke" * i preuzete s web mjesta Java Software za pisanje datoteke * u vaš / tmp direktorij (ili u datoteku nazvanu "C: \ tmpfoo "u sustavu * Windows), tada se ovaj program može pokrenuti. * * @verzija JDK 1.2 * @autorica Marianne Mueller * @Modified by Raghavan Srinivas [Rags] * / import java.awt. *; import java.io. *; import java.lang. *; import java.applet. *; javna klasa writeFile proširuje Applet {String myFile = "/ tmp / foo"; Datoteka f = nova datoteka (myFile); DataOutputStream dos; javna void init () {String osname = System.getProperty ("os.name"); if (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo";}} javna void boja (grafika g) {try {dos = new DataOutputStream (new BufferedOutputStream (new FileOutputStream (myFile), 128)); dos.writeBytes ("Mačke vas mogu hipnotizirati kad se najmanje nadate \ n"); dos.flush (); dos.close (); g.drawString ("Uspješno upisano u datoteku pod nazivom" + myFile + "- pogledajte, pogledajte je!", 10, 10); } catch (SecurityException e) {g.drawString ("writeFile: uhvaćen sigurnosni izuzetak", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: uhvaćen i / o izuzetak", 10, 10); }} public static void main (String args []) {Frame f = novi okvir ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Centar", zapis datoteke); f.setSize (300, 100); f.show (); }}}}}}Mačke vas mogu hipnotizirati kad se najmanje nadate \ n "); dos.flush (); dos.close (); g.drawString (" Uspješno upisane u datoteku nazvanu "+ myFile +" - pogledajte, pogledajte je ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: uhvaćen sigurnosni izuzetak ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o iznimka ", 10, 10);}} javna statička void glavna (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Center", zapis datoteke); f.setSize (300, 100); f.show ();}}Mačke vas mogu hipnotizirati kad se najmanje nadate \ n "); dos.flush (); dos.close (); g.drawString (" Uspješno upisane u datoteku nazvanu "+ myFile +" - pogledajte, pogledajte je ! ", 10, 10);} catch (SecurityException e) {g.drawString (" writeFile: uhvaćen sigurnosni izuzetak ", 10, 10);} catch (IOException ioe) {g.drawString (" writeFile: catch i / o iznimka ", 10, 10);}} javna statička void glavna (String args []) {Frame f = new Frame (" writeFile "); writeFile writefile = new writeFile (); writefile.init (); writefile.start ( ); f.add ("Center", zapis datoteke); f.setSize (300, 100); f.show ();}}} catch (SecurityException e) {g.drawString ("writeFile: uhvaćen sigurnosni izuzetak", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: uhvaćen i / o izuzetak", 10, 10); }} public static void main (String args []) {Frame f = novi okvir ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Centar", zapis datoteke); f.setSize (300, 100); f.show (); }}} catch (SecurityException e) {g.drawString ("writeFile: uhvaćen sigurnosni izuzetak", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: uhvaćen i / o izuzetak", 10, 10); }} public static void main (String args []) {Frame f = novi okvir ("writeFile"); writeFile writefile = new writeFile (); writefile.init (); writefile.start (); f.add ("Centar", zapis datoteke); f.setSize (300, 100); f.show (); }}

Pokretanjem bajtkoda generiranog u Java 2 Runtime Environment, Standard Edition (JRE) dopustit će aplikaciji da prema zadanim postavkama izmijeni datoteku na lokalnom datotečnom sustavu, jer zadana politika Java 2 aplikacije ne podvrgava upravitelju sigurnosti. Ovo je pravilo opravdano jer su aplikacije obično lokalno generirani kod i ne preuzimaju se preko mreže. Sljedeći naredbeni redak stvara prozor prikazan na slici 1, koji pokazuje da je datoteka kreirana i zapisana u nju.

$ java writeFile 

Da biste podvrgli kôd upravitelju sigurnosti Java 2, pozovite sljedeću naredbenu liniju koja bi trebala dati rezultate naznačene na slici 2. Primijetite da je aplikacija generirala sigurnosnu iznimku uzrokovanu pokušajem izmjene lokalnog datotečnog sustava. Izričito uključeni upravitelj sigurnosti generirao je iznimku.

$ java -Djava.security.manager writeFile 

Gore prikazani slučajevi predstavljaju ekstremne primjere sigurnosne politike. U prvom slučaju, prijava nije bila podvrgnuta nikakvoj kontroli; u potonjem je bio podvrgnut vrlo krutoj kontroli. U većini slučajeva bit će potrebno postaviti politiku negdje između.

Možete postići međusobno pravilo pomoću datoteke s pravilima. Da biste to učinili, stvorite datoteku pravila koja se naziva all.policyu radnom direktoriju:

grant {dozvola java.io.FilePermission "<>", "write"; };

Pokretanje istog dijela koda sa sljedećim naredbenim retkom omogućit će izmjenu lokalnog datotečnog sustava:

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

U ovom primjeru aplikacija je bila podvrgnuta upravitelju sigurnosti, ali cjelokupnom politikom upravljala je datoteka politike koja je omogućavala izmjenu svih datoteka na lokalnom datotečnom sustavu. Stroža politika mogla bi biti dopuštanje izmjena samo relevantne datoteke - tmpfoou ovom slučaju.

Više detalja o datoteci pravila, uključujući sintaksu unosa, pokriti ću kasnije u ovom članku. Ali prvo, pogledajmo sigurnost apleta i usporedimo je sa sigurnošću aplikacije.

Sigurnost apleta

Do sada smo proučavali sigurnost aplikacija. Kao takvi, većini sigurnosnih značajki može se pristupiti i izmijeniti ih putem naredbenog retka. Pružanje adekvatno sigurne, a opet donekle fleksibilne politike u okruženju apleta pokazuje se znatno izazovnijim. Za početak ćemo razmotriti postavljanje apleta u Appletviewer. Kasnije ćemo razmotriti aplete instalirane u pregledniku.

Pravila Java koda prvenstveno diktiraju podaci CodeSourcekoji sadrže dvije informacije: mjesto podrijetla koda i osoba koja ga je potpisala.

Preglednik apleta

Stvorite datoteku writeFile.htmlsa sljedećim sadržajem:

  Primjer Java sigurnosti: pisanje datoteka 
   

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.