Programavimas

„Java“ saugos raida ir sąvokos. 3 dalis. Apletų sauga

Ankstyvą „Java“ augimą paskatino per tinklą atsisiųsti kodas, geriau žinomas kaip programėlės. Appletų sauga vystėsi augant „Java“, ir šiandien dėl dažnų „Java“ versijų, komercinių naršyklių ir papildinių įvairovės dažnai kyla painiavos.

Šis, trečiasis serijos straipsnis, apims įvairius reikalavimus, kaip saugiai paleisti iš tinklo atsisiųstą „Java“ kodą. Nors mobilusis kodas nėra revoliucinė sąvoka, „Java“ ir internetas kelia keletą unikalių iššūkių kompiuterio saugumui. „Java“ architektūros raida ir jos poveikis pagrindiniam „Java“ saugumui buvo aptartas 1 ir 2 dalyse. Šiame straipsnyje kalbama kitaip: praktinis požiūris susieti visas sąvokas, įdiegiant paprastą programėlę, kuri rašo į vietinę failų sistemą .

„Java“ saugumo raida ir sąvokos: perskaitykite visą seriją!

  • 1 dalis. Sužinokite kompiuterio saugumo sąvokas ir terminus šioje įvadinėje apžvalgoje
  • 2 dalis: atraskite „Java“ saugumo ypatybes
  • 3 dalis. Drąsiai spręskite „Java“ programėlių saugumą
  • 4 dalis. Sužinokite, kaip pasirenkami paketai praplečia ir sustiprina „Java“ saugumą
  • 5 dalis: J2SE 1.4 siūlo daugybę „Java“ saugumo patobulinimų

Programėlės pavyzdys yra viešojo rakto kriptografija, pristatyta anksčiau šioje serijoje. Kodas, pasirašytas pasirašiusio asmeniniu raktu, gali būti paleidžiamas kliento mašinose, kai pasirašiusįjį atitinkantis viešasis raktas bus laikomas patikimu atitinkamoje mašinoje. Taip pat aptarsime, kaip politikos failai, suteikiantys leidimus ir raktų saugyklą, gali būti naudojami kaip viešųjų ir privačių raktų saugykla. Be to, mes pabrėšime „Java 2 SDK“ saugos įrankius ir „Netscape“ signtool, nes jie leidžia dislokuoti.

Šiame straipsnyje sekama „Java“ saugumo raida, pradedant programų saugumu pradiniame „Java 2“ leidime ir pereinant prie naujausios „Java 2“ versijos 1.3 versijos. Šis požiūris padeda palaipsniui pristatyti sąvokas, pradedant labai paprastomis sąvokomis ir baigiant gana pažangiu pavyzdžiu.

Ši serija neketina pateikti išsamaus kompiuterių saugumo vadovo. Kompiuterių saugumas yra daugialypis klausimas, paliečiantis kelias disciplinas, departamentus ir kultūras. Turėtų būti tęsiamos investicijos į technologijas, investuojant į personalo mokymą, griežtą politikos vykdymą ir periodišką bendros saugumo politikos peržiūrą.

Pastaba: Šiame straipsnyje pateikiama veikianti „Java“ programėlė, skirta demonstruoti programėlių saugos problemas. Skaitykite toliau, kad gautumėte daugiau informacijos.

Programos saugumas

Tyrimą pradėkime nuo programos saugumo. 2 dalyje matėme, kaip „Java“ saugumas virto nuo smėlio dėžės modelio iki smulkiagrūdžio saugumo modelio. Mes taip pat matėme, kad programos (vietinis kodas) pagal numatytuosius nustatymus gauna nemokamą valdymą ir joms netaikoma tokia pati kontrolė kaip ir programėlėms (tinkle atsisiunčiamas kodas), kurios paprastai laikomos nepatikimomis. Keičiantis nuo praeities, „Java 2“ saugumo programoms gali būti pasirinktas tas pats valdymo lygis, kaip ir programėlėms.

Pirma, greita pastaba apie writeFile.java, šiame straipsnyje naudojamas kodas, skirtas iliustruoti „Java 2“ saugos funkcijas. Ši programa yra šiek tiek pakeista „Sun“ pateikto programėlių kodo versija, prieinama internete, kad būtų parodytos kai kurios „Java 2“ saugos funkcijos. Programa, modifikuota teikti programos palaikymą, bando sukurti ir įrašyti failą į vietinę failų sistemą. Prieigą prie vietinės failų sistemos tikrina saugos vadybininkas. Šiame straipsnyje matysime, kaip šiai operacijai galima leisti saugiai.

/ ** * Pagal numatytuosius nustatymus tai sukuria saugos išimtį kaip programėlę. * * Naudodami „JDK 1.2 appletviewer“, * jei sukonfigūruojate sistemą suteikti programoms, pasirašytoms „Duke“ * ir atsisiųstoms iš „Java“ programinės įrangos svetainės, failui * rašyti į jūsų / tmp katalogą (arba į failą pavadinimu „C: \ tmpfoo“) "*" Windows "sistemoje), tada ši programėlė gali veikti. * * @version JDK 1.2 * @author Marianne Mueller * @Modifikuota Raghavan Srinivas [Rags] * / import java.awt. *; importuoti java.io. *; importuoti java.lang. *; importuoti java.applet. *; public class writeFile prailgina programėlę {String myFile = "/ tmp / foo"; Failas f = naujas failas („myFile“); „DataOutputStream“ dos; public void init () {String osname = System.getProperty ("os.name"); if (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo"; }} public void paint (grafika g) {try {dos = new DataOutputStream (new BufferedOutputStream (new FileOutputStream (myFile), 128)); dos.writeBytes ("Katės gali jus užhipnotizuoti, kai to mažiausiai tikitės \ n"); dos.flush (); dos.close (); g.drawString ("Sėkmingai parašėte į failą pavadinimu" + myFile + "- eikite pasižvalgyti!", 10, 10); } catch (SecurityException e) {g.drawString ("writeFile: pagauta saugumo išimtis", 10, 10); } catch (IOException ioe) {g.drawString ("writeFile: sugauta i / o išimtis", 10, 10); }} public static void main (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = nauja writeFile (); writefile.init (); writefile.start (); f.add („Centras“, rašymo failas); f.setSize (300, 100); f. rodyti (); }} 

Paleidus „Java 2 Runtime Environment“, „Standard Edition“ (JRE) sugeneruotą baitų kodą, programa pagal numatytuosius nustatymus galės keisti failą vietinėje failų sistemoje, nes pagal numatytąją strategiją „Java 2“ programos nepriskiriamos saugos valdytojui. Ši politika yra pagrįsta, nes programos paprastai yra vietoje sugeneruotas kodas ir nėra atsisiųstos per tinklą. Šioje komandinėje eilutėje pateikiamas 1 paveiksle parodytas langas, nurodantis, kad failas buvo sukurtas ir įrašytas.

$ java writeFile 

Norėdami priskirti kodą „Java 2“ saugos vadybininkui, iškvieskite šią komandinę eilutę, kuri turėtų pateikti 2 paveiksle nurodytus rezultatus. Atkreipkite dėmesį, kad programa sukūrė saugos išimtį, kurią sukėlė bandymas modifikuoti vietinę failų sistemą. Išimtį sukūrė aiškiai įtrauktas saugos vadybininkas.

$ java -Djava.security.manager writeFile 

Aukščiau pavaizduoti atvejai yra kraštutiniai saugumo politikos pavyzdžiai. Pirmuoju atveju paraiška nebuvo kontroliuojama; pastarojoje ji buvo labai griežtai kontroliuojama. Daugeliu atvejų reikės nustatyti politiką kažkur tarp jų.

Tarpinę politiką galite atlikti naudodami politikos failą. Norėdami tai padaryti, sukurkite politikos failą, vadinamą viskas.politika darbo kataloge:

suteikti {leidimą java.io.FilePermission "<>", "rašyti"; }; 

Vykdydami tą patį kodo fragmentą naudodami šią komandų eilutę, galėsite modifikuoti vietinę failų sistemą:

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

Šiame pavyzdyje programai buvo taikomas saugos valdytojas, tačiau bendrą politiką reglamentavo politikos failas, kuris leido visi failai, esantys vietinėje failų sistemoje, bus pakeisti. Griežtesnė politika galėjo būti leisti keisti tik atitinkamą failą - tmpfoo tokiu atveju.

Daugiau informacijos apie politikos failą, įskaitant įrašų sintaksę, aprašysiu vėliau šiame straipsnyje. Bet pirmiausia pažvelkime į programėlių saugumą ir palyginkime juos su programų saugumu.

Apletų sauga

Iki šiol mes ištyrėme programų saugumą. Taigi, prie daugumos saugos funkcijų galima pasiekti ir modifikuoti per komandinę eilutę. Tinkamai saugios ir dar šiek tiek lanksčios politikos teikimas programėlių aplinkoje yra daug sudėtingesnis. Pradėsime nuo apleto diegimo „Appletviewer“. Vėliau apžvelgsime naršyklėje įdiegtas programėles.

„Java“ kodų politiką pirmiausia diktuoja „CodeSource“, kurią sudaro dvi informacijos dalys: vieta, kur atsirado kodas, ir ją pasirašęs asmuo.

„Appletviewer“

Sukurkite failą, pavadintą writeFile.html turinį:

  „Java“ saugos pavyzdys: failų rašymas 

Paleidus programėlę naudojant šią komandinę eilutę, bus parodytas 3 paveiksle parodytas langas:

$ appletviewer writeFile.html 

Atkreipkite dėmesį, kad, priešingai nei nutiktų su programa, programėlė sukūrė išimtį, nes programai pagal numatytuosius nustatymus taikoma saugos vadybininkė. Jei reikia, diegimą gali reguliuoti pritaikoma politika. Paleisti šią komandinę eilutę:

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

kaip tikėtumėtės, leistų modifikuoti tmpfoo failą, nes tai buvo leidžiama pagal politikos bylą.

Naršyklės

Programėlių sauga naršyklėse siekia užkirsti kelią nepatikimoms programėlėms atlikti potencialiai pavojingas operacijas, tuo pačiu suteikiant optimalią prieigą prie patikimų programėlių. Programėlių saugos diegimas naršyklėse iš esmės skiriasi nuo to, ką matėme iki šiol, visų pirma dėl šių priežasčių:

  • Numatytasis nepasitikėjimas kodu, atsisiųstu per tinklą
  • Nepakanka prieigos prie JVM paleidimo komandinės eilutės parinkčių, nes JVM priglobtas naršyklės kontekste
  • Nepakankamas kai kurių naujausių saugos funkcijų palaikymas JVM kartu su naršyklėmis

Kalbant apie pirmąją problemą, norint išvengti galimų problemų, kylančių dėl nepatikimo kodo paleidimo, ankstesnėse „Java“ versijose buvo naudojamas „smėlio dėžės“ modelis (žr. „1 šoninė juosta:„ Sandbox Model “). Pasitikėjimas yra daugiausia filosofinis ar emocinis klausimas, o ne techninis; tačiau technologijos gali padėti. Pavyzdžiui, „Java“ kodą galima pasirašyti naudojant sertifikatus. Šiame pavyzdyje pasirašiusysis netiesiogiai garantuoja kodą pasirašydamas. Galiausiai vartotojas, valdantis kodą, turi pasitikėti pasirašančiu subjektu, ar ne, turint omenyje, kad šie sertifikatai garantuoja, kad kodą tikrai pasirašė numatytas asmuo ar organizacija.

Antroji problema kyla dėl to, kad trūksta prieigos prie JVM paleidimo naršyklės kontekste parinkčių. Pvz., Nėra paprasto būdo pritaikyti ir naudoti pritaikytus politikos failus, kaip galėtume ankstesniame pavyzdyje. Vietoj to, tokią politiką turės nustatyti failai, pagrįsti JRE diegimu. Negalima lengvai įdiegti pritaikytų klasės krautuvų ar saugos valdytojų.

Trečioji problema - tai, kad nėra palaikymo naujausioms JRE versijoms numatytame JVM su naršykle, išspręsta naudojant „Java“ papildinį (žr. „2 šoninė juosta:„ Java “papildinių pradmenys“). Iš tiesų, pagrindinė problema yra ta, kad politikos failų modifikavimas nėra labai paprastas. Kadangi programėlės gali būti diegiamos tūkstančiuose ar net milijonuose klientų mašinų, gali būti aplinkų, kuriose vartotojai gali gerai neišmanyti saugos arba nėra susipažinę su politikos failo modifikavimo metodais. „Java“ papildinys suteikia galimybę išspręsti problemą, nors rekomenduojama naudoti politikos failus visur, kur tai praktiškai įmanoma.

Toliau mes išsamiau išnagrinėsime programėlių saugumą, apimančią kodo pasirašymo pavyzdžius naršyklės aplinkoje su „Java“ papildiniu. Apibendrinsime tik „Java“ papildinio 1.3 versiją, nebent būtų aiškiai nurodyta kitaip.

„Java“ papildinys ir sauga

„Java“ papildinys palaiko standartinį „Java 2 SDK“, „Standard Edition“ (J2SE), įskaitant saugos modelį. Visos programėlės veikia pagal standartinę programėlių saugos tvarkyklę, o tai neleidžia potencialiai kenksmingoms programėlėms atlikti pavojingų operacijų, pavyzdžiui, skaityti vietinius failus. RSA pasirašytas programėles galima įdiegti naudojant „Java“ papildinį. Be to, „Java“ papildinys bando vienodai paleisti programėles tiek „Netscape Navigator“, tiek „Internet Explorer“, vengdamas konkrečių naršyklės išteklių. Tai užtikrina, kad RSA pasirašyta programėlė veiks vienodai abiejose naršyklėse su „Java“ papildiniu. „Java“ papildinys taip pat palaiko HTTPS - saugią HTTP versiją.

Kad papildinio patobulinta naršyklė galėtų pasitikėti programėle ir suteikti jai visas privilegijas arba išsamių leidimų rinkinį (kaip nurodyta J2EE politikos faile), vartotojas turi iš anksto sukonfigūruoti savo patikimų signatarų sertifikatą. ( .šaldytuvas failą JRE 1.3), kad prie jo pridėtumėte programėlės signatarą. Tačiau šis sprendimas nėra menkas, jei programėlę reikia įdiegti tūkstančiuose klientų mašinų, ir tai ne visada įmanoma, nes vartotojai gali iš anksto nežinoti, kas pasirašė programėlę, kad bando paleisti. Be to, ankstesnės „Java“ papildinio versijos palaikė kodo pasirašymą naudojant DSA, kuris nėra toks plačiai paplitęs kaip RSA.

Naujas klasės krautuvas, sun.plugin.security.PluginClassLoader „Java“ papildinyje 1.3 įveikia pirmiau minėtus apribojimus. Jis įgyvendina RSA patikrinimo ir dinamiško pasitikėjimo valdymo palaikymą.

Programinės įrangos kūrimo rinkinio (SDK) įrankiai

Trys su saugumu susijusios priemonės, prieinamos kaip „Java 2 SDK“, yra šios:

  • rakto įrankis - Tvarko raktų saugyklas ir sertifikatus
  • stiklainiukas - Generuoja ir tikrina JAR parašus
  • politinis įrankis - Valdo politikos failus naudodamas GUI pagrįstą įrankį

Toliau pateiktuose skyriuose mes apžvelgsime keletą svarbių šių įrankių variantų. Išsamesnės dokumentacijos, susijusios su konkrečiais įrankiais, ieškokite šaltiniuose.