Javas drošības pamatsistēma

Smilšukastes modelis

Visvecākais - dala aplikācijas uzticamās un neuzticamās. Neuzticamās ir ar standartiskiem apletu ierobežojumiem. Starp sistēmas resursiem un JVM darbojas "Security Manager" (drošības pārvaldnieks), kas skatās uz visiem pieprasījumiem un dažus nelaiž cauri. Testa jautājums - vai aplets var noskaidrot drošības pārvaldnieka īpatnības?

Kodu pirms ielādēšanas JVM pārbauda uz sekojošām lietām:

  • Kods nevilto pointerus
  • Nepārkāpj deklarētos piekļuves nosacījumus, t.i. private un protected
  • Piekļūst objektiem tikai ar metodēm, kuras ir paredzētas
  • Izsauc metodes ar atbilstoša tipa argumentiem un nepārpilda buferus un steku
  • Nemēģina veikt aizliegtas datu konversijas darbības, piemēram, veselus skaitļus par pointeriem

JVM 1.1. ieviesa parakstīta apleta jēdzienu - tam varēja vai nu uzticēties vai neuzticēties.

Java 1.0 modelis

Java 1.1 modelis

Java 1.2 modelis

Drošības caurumi

DNS dubultnieki, 1996.02
Kontrolē DNS serveri un dod iespēju apletam izveidot tīkla savienojumu ar citu datoru, nekā tas, no kura tas tika saņemts.
Absolūtā taciņa, 1996.03
Novērsa kļūdu, kas ļāva ielādēt sliktam baitkodam klases pēc absolūtā ceļa
Baitkodu pārbaudes kļūda, 1996.03
Īpaši uzkonstruēts Javas aplets varēja izdzēst failu vai veikt citus postījumus
...
...

Smilšukastes modeļa nepietiekamība

Smilšukastes modelis pārāk daudz ko ierobežo. Ja mēs lietojam kādas pazīstamas firmas apletu, varam tam atļaut mainīt attiecīgās firmas instalāciju direktoriju saturu. Toties varbūt negribam dot šādas firmas programmai pilnu kontroli pār visu mūsu sistēmu. Tātad vajadzīga regulējama piekļuves kontrole (fine-grained access control). Teorētiski pirms JDK1.2 drošības modeļa varēja būvēt pats lietotājs savu drošības sistēmu (piemēram HotJava pārlūkprogramma), kurā tiek pieprogrammēts klasēm SecurityManager, ClassLoader un citām. Tur kur vajadzīgi pilnīgi unikāli drošības ierobežojumi, tur tas joprojām jādara, bet citādi, gribas pasargāt lietotāju no nopūlēšanās ar tipveida darbībām drošības uzturēšanai.

Smilšukastes modelī ir sasaistīts drošības politikas formulējums ar drošības realizāciju (security policy un security enforcement). Lai mainītu ierobežojumus, jālieto cita versija, piemēram, programmai appletviewer. Mērķis ir atdalīt politikas prasības no realizācijas. Lai katrai konkrētajai realizācijai būtu skaidrs, kādus ierobežojumus var nokonfigurēt, nemainot pašu programmu.

Tā vietā, lai ieviestu SecurityManager klasei arvien jaunas pārbaudes (checkRead(), vai pat checkAccountWithdraw()), ieviešam piekļuves atļauju tipus (typed access-control permissions) un automātisku atļauju apstrādes mehānismu. SecurityManager tagad var atbalstīt tikai vienu toties universālu metodi checkPermission().

Nevar ierobežot lokāli instalētus apletus un citas demo programmas. Javas kodam atšķirība starp lokālo un caur tīklu atnākušo kļūst izplūdusi. Tāpēc vajadzīgs visaptverošs drošības mehānisms gan apletiem, gan aplikācijām.

Drošības izņēmumi

java.lang.SecurityException rodas, ja programmas izpildes gaitā atklājas, ka ir pārkāpts kāds drošības ierobežojums, piemēram, programma grib piekļūt aizsargātam failam. Programma to var pārtvert ar try/catch mehānismu, bet tas nav jādeklarē kā mests.

java.security.GeneralSecurityException un tā apakšklases nozīmē drošības konstrukciju neveiksmīgu lietojumu aplikācijā (piemēram, nederīgu Policy objektu), kas nav saistīts ne ar kādiem drošības ierobežojumu pārkāpumiem. Šis izņēmums jādeklarē kā mests vai jānoķer.

Drošības politika

Drošības politika (policy) ir attēlojums no īpašību kopas, kas raksturo koda izpildi uz piekļuves atļaujām, kas dotas šim kodam; to attēlo ar matricu (access-control matrix).

Drošības politikas var definēt dažādos veidos, tomēr katrā situācijā ir spēkā tikai viena politika. To apraksta klase java.security.Policy.

Kā var apskatīties drošības politiku

Javas 2 sistēmas drošības politiku nosaka kopsalikums ar politikām, kuras konfigurē pats lietotājs vai sistēmas administrators. Politiku ārpus Javas izpildes vides (JRE) var attēlot dažādos veidos - ASCII fails, serializēts Policy objekts, datubāze, utml. To Java 2 var savākt pa HTTP vai citiem protokoliem. Nav ierobežojumu tiem, kuri grib veidot abstraktās klases Policy apakšklašu instances, tātad programmas izpildes laikā var eksistēt vairākas instances šai klasei. Tomēr tikai viena no šīm instancēm būs "īstā", kurai Java 2 drošības mehānisms jautās, ko drīkst un ko nedrīkst darīt.

java.security.Policy ir komponente, kuru nodrošina provaiders, lai politikas saturs varētu tikt ielādēts visdažādākajos veidos. Provaiders ir norādīts ar īpašību no java.security faila. Piemēram,

policy.provider=sun.security.provider.PolicyFile

Tipisks veids kā tikt pie matricas, kurā glabājas visas pieejas kontroles atļaujas ir sekojošs:

policy = Policy.getPolicy();
PermissionCollection perms = policy.getPermissions(MyCodeSource);

java.security.CodeSource MyCodeSource ir apleta vai aplikācijas CODEBASE atribūts (teiksim, URL, no kurienes nāk kods), kopā ar drošības sertifikātiem.

Drošības konfigurāciju faili

Ir sistēmas drošība (uz visu Java2 platformu viena) - tā ir atrodama failā $JRE-HOME$/lib/security/java.security, piemēram c:\tools\jdk1.3\jre\lib\security\java.security. Atsevišķajam lietotājam arī var izveidot konfigurācijas failu $USER-HOME$/.java.policy teiksim c:\winnt\profiles\username\.java.policy, bet instalējot JDK1.3 uz Windows mašīnas tur nekas netiek ierakstīts.

Norādes uz sistēmas noklusētās politikas failiem atrodas konfigurāciju failā java.security:

Ja mēs palaižam programmiņu PrintPolicies.java, kur izdrukājam neparakstīta apleta drošības politiku, tad iegūstam tieši noklusētās vērtības. Programmas izvads izskatās šādi:

c:\webkursi\java_xml\security\policies>java PrintPolicies
sun.security.provider.PolicyFile
(java.lang.RuntimePermission stopThread)
(java.net.SocketPermission localhost:1024- listen,resolve)
(java.util.PropertyPermission java.vendor read)
(java.util.PropertyPermission java.specification.version read)
(java.util.PropertyPermission line.separator read)
(java.util.PropertyPermission java.class.version read)
(java.util.PropertyPermission java.specification.name read)
(java.util.PropertyPermission java.vendor.url read)
(java.util.PropertyPermission java.vm.version read)
(java.util.PropertyPermission os.name read)
(java.util.PropertyPermission os.arch read)
(java.util.PropertyPermission os.version read)
(java.util.PropertyPermission java.version read)
(java.util.PropertyPermission java.vm.specification.version read)
(java.util.PropertyPermission java.vm.specification.name read)
(java.util.PropertyPermission java.specification.vendor read)
(java.util.PropertyPermission java.vm.vendor read)
(java.util.PropertyPermission file.separator read)
(java.util.PropertyPermission path.separator read)
(java.util.PropertyPermission java.vm.name read)
(java.util.PropertyPermission java.vm.specification.vendor read)

Apletam specifisku politiku definēšana

Var lietot īpašu rīku policytool, kurš vispirms mēģina lasīt lietotāja noklusēto politiku failu c:\winnt\profiles\username\.java.policy. Tas, protams, neizdodas. Var izveidot jaunus politikas gabalus (ierakstot "CodeBase" atribūtā atbilstošu URL, teiksim "file:///c:/webkursi/java_xml/security/architecture/" un definējot īpašību, kura ļauj rakstīt atsevišķā failā. Politikas fails mypolicy izskatās šādi:

/* AUTOMATICALLY GENERATED ON Mon May 21 00:47:28 GMT+03:00 2001*/
/* DO NOT EDIT */

grant codeBase "file:///c:/webkursi/java_xml/security/architecture/" {
  permission java.io.FilePermission "writetest", "write";
};

To var pievienot politikas failiem divējādi: vai nu kā papildargumentu priekš appletviewer, kuru palaiž, teiksim, tajā direktorijā, kur ir aplets:

appletviewer -J-Djava.security.policy=mypolicy WriteFile.html

vai arī apmēram šādu rindiņu pievienojot failam java.security:

policy.url.3=file:///c:/webkursi/java_xml/security/architecture/mypolicy

Politikas fails, kurš norādīts pie īpašības -Djava.security.policy tiks ignorēts, ja java.security konfigurācijas failā īpašība policy.allowSystemProperty nebūs ar vērtību true vai būs izkomentēta.

Aplikācijai specifiskas politikas definēšana

Normālā gadījumā aplikācija darbojas bez drošības ierobežojumiem. Lai varētu ierobežot, jāpieliek drošības pārvaldnieks (java.security.manager).

Darbinot aplikāciju GetProps.java var tūlīt uzzināt sistēmas īpašības:

c:\webkursi\java_xml\security\policies>java GetProps
About to get os.name property value
  The name of your operating system is: Windows NT
About to get java.version property value
  The version of the JVM you are running is: 1.3.0
About to get user.home property value
  Your user home directory is: C:\WINNT\Profiles\RITI
About to get java.home property value
  Your JRE installation directory is: C:\Program Files\JavaSoft\JRE\1.3

To pašu palaižot ar drošības pārvaldnieku, dažas lietas vairs neiet cauri, ja tās nav paredzētas java.policies failā:

c:\webkursi\java_xml\security\policies>java -Djava.security.manager GetProps
About to get os.name property value
  The name of your operating system is: Windows NT
About to get java.version property value
  The version of the JVM you are running is: 1.3.0
About to get user.home property value
Caught exception java.security.AccessControlException: access denied (java.util.
PropertyPermission user.home read)

Lai šīs īpašības atkal varētu lasīt, papildinām politikas failu:

grant codeBase "file:///c:/webkursi/java_xml/security/architecture/" {
  permission java.io.FilePermission "writetest", "write";
};

grant codeBase "file:///c:/webkursi/java_xml/security/policy/" {
  permission java.util.PropertyPermission "user.home", "read";
  permission java.util.PropertyPermission "java.home", "read";
};

Un palaižam atbilstošu komandrindu un iegūstam:

c:\webkursi\java_xml\security\policies>java -Djava.security.manager -Djava.secur
ity.policy=mypolicy GetProps
About to get os.name property value
  The name of your operating system is: Windows NT
About to get java.version property value
  The version of the JVM you are running is: 1.3.0
About to get user.home property value
  Your user home directory is: C:\WINNT\Profiles\RITI
About to get java.home property value
  Your JRE installation directory is: C:\Program Files\JavaSoft\JRE\1.3

JVM pārlūkprogrammās

MS Internet Explorer un Netscape Navigator atbalstītās iebūvētās JVM atbalsta smilšukastes modeli, drošības izņēmumi katrai pārlūkprogrammai ir citi, piemēram:

com.ms.security.SecurityExceptionEx
netscape.security.AppletSecurityException

Varētu pētīt jautājumu par šo pārlūkprogrammu uzvedību, ja tajās ir instalēts Sun Java plug-ins.


Lapa mainīta 2004-12-02 22:00:20