56
Marian Lojka 2003/2004 http://skola.marloom.net

Bezpečnosť JAVA aplikácií

  • Upload
    aldon

  • View
    61

  • Download
    0

Embed Size (px)

DESCRIPTION

Bezpečnosť JAVA aplikácií. Marian Lojka 2003/2004. http :// skola.marloom.net. Obsah. Model zabezpečenia v Jave Sandbox (bezpečnostné prostredie) Správca zabezpečenia Súbory zásad Podpisovanie tried Typy oprávnenia Spätný preklad kódu. Model zabezpečenia v Jave. - PowerPoint PPT Presentation

Citation preview

Page 1: Bezpečnosť JAVA aplikácií

Marian Lojka2003/2004

http://skola.marloom.net

Page 2: Bezpečnosť JAVA aplikácií

Obsah

• Model zabezpečenia v Jave• Sandbox (bezpečnostné prostredie)• Správca zabezpečenia• Súbory zásad• Podpisovanie tried• Typy oprávnenia• Spätný preklad kódu

Page 3: Bezpečnosť JAVA aplikácií

Model zabezpečenia v Jave

Zabezpečenie v Jave sa vyvíjalo už od jej samotného počiatku. Podstatné rozdiely, ktoré vznikali sa prejavili vo verziách JDK 1.0, JDK 1.1 a Java 2.

V prvých počiatkoch vývoja Javy bola jedna z prelomových technológií tvorba Apletov. Keďže Aplet je malá časť kódu, ktorú možno prenášať sieťou a spúšťať na klientských počítačoch prostredníctvom vnorených objektov v dokumentoch formátu WWW, používatelia boli bezprostredne ohrozený pred nebezpečným kódom.

História vývoja zabezpečenia v Jave

Page 4: Bezpečnosť JAVA aplikácií

Model zabezpečenia v Jave

SANDBOX stručne

Výsledkom prvotnej snahy zabezpečenia, ktoré by nepripustilo poškodenie klientského počítača spustením kódu z Internetu je model zabezpečenia nazývaný SANDBOX (krabica z piesku).

Model pieskoviska je bezpečnostné prostredie okolo systému alebo aplikácie, ktoré je postavené na zákaze potenciálne nebezpečných činností (prístup k súborom, sieťovým prostriedkom a pod.). Úloha a využitie Sandboxu budú popísané neskôr.

Page 5: Bezpečnosť JAVA aplikácií

Model zabezpečenia v Jave

Zabezpečenia v Java SDK 1.0

Vzdialený kód Apletov, ktoré sa spustili na klientskom počítači nemali možnosť manipulovať s prostriedkami počítača. Mali priradenú iba pamäť a procesor. Prostredie Sandboxu, kde sa kód vykonával striktne zakazoval priradenie iných prostriedkov.

Systémové prostriedky

Zabezpečovací manažér (Security manager)

Plný prístup k prostriedkom

SandboxObmedzený prístup

Lokálny kód Vzdialený kód

Internet

Page 6: Bezpečnosť JAVA aplikácií

Model zabezpečenia v Jave

Zabezpečenia v Java SDK 1.1

Po nejakej dobe sa ukázalo že model Sandboxu je veľmi obmedzujúci. Autori jazyka Java pristúpili na možnosť podpisovania vzdialeného kódu. Tento podpis dosvedčuje že kód nebol zmenený od doby jeho podpísania.

Systémové prostriedky

Zabezpečovací manažér (Security manager)

Plný prístup k prostriedkom

SandboxObmedzený prístup

Lokálny kód

Nepodpísanýalebo

odmietnutý

vzdialený kód z Internetu

Podpísaný a prijatýklientom

Page 7: Bezpečnosť JAVA aplikácií

Model zabezpečenia v Jave

Zabezpečenia v Java 2

V prostredí Java 2 bol vytvorený dômyselnejší mechanizmus a to spustenie vzdialeného kódu vo vnútri špecifických bezpečnostných domén, založených na súboroch zásad zabezpečenia (security policy file).

Systémové prostriedky

Zabezpečovací manažér (Security manager)

Sandbox Obmedzený

prístup

Vzdialený alebo lokálny kód

JVMkód

dómenaPlný

prístup

security policy

dómena

Page 8: Bezpečnosť JAVA aplikácií

Sandbox

Bezpečnostné prostredie Java 2

Načítanie triedy

Overenie práv a sprístupnenie systémových prostriedkov

Page 9: Bezpečnosť JAVA aplikácií

Sandbox - Class Loader

Priebeh načítania triedy

Požiadavka pre načítanie triedy

Trieda už je načítaná ?

Má program prístup k triede ?

Vrátenie referencie na objekt

Má program povolenie na vytvorenie tejto triedy ?

SecurityException !Hľadanie triedy v :1.Java API2.JVM extension

Načítaná a sprístupnená

Bola trieda nájdená ?

Načítanie triedy vo forme bytov

Class File Verifier

Trieda je v poriadku ?

VerifyError ! Pridanie triedy do bezpečnostnej domény pre neskoršie otestovanie práv triedy.

Inicializácia statických premenných

Trieda je pripravená na vykonávanie

Page 10: Bezpečnosť JAVA aplikácií

Sandbox

Class File Verifier

Zabezpečuje overenie triedy na základe postupnosti testov Zabezpečuje overenie triedy na základe postupnosti testov vnútornej integrity. Dôraz pri testovaní sa kladie na vnútornej integrity. Dôraz pri testovaní sa kladie na prítomnosť nasledujúcich (úmyselných)prítomnosť nasledujúcich (úmyselných) chýb :chýb :

• Obsah ilegálneho Obsah ilegálneho byte codbyte codu.u.• Formát tried (napr.: Triedy musia mať superclass)Formát tried (napr.: Triedy musia mať superclass)• Formát a vlastnosti metód.Formát a vlastnosti metód.• Formát premenných.Formát premenných.• Vytvorenie smerníka na chránenú časť pamäte.Vytvorenie smerníka na chránenú časť pamäte.• Podtečenie alebo pretečenie programového staku.Podtečenie alebo pretečenie programového staku.• Iné cesty k narušeniu integrity JVM.Iné cesty k narušeniu integrity JVM.

Page 11: Bezpečnosť JAVA aplikácií

Sandbox

Class File Verifier Príklad požitia neinicializovaného registra

Pre názornosť vytvoríme tried Pre názornosť vytvoríme tried ClassVerifyClassVerify /** * Metoda pre spustenie ako Aplikacia */public static void main(String[] args) {

System.out.println("3 + 4 = " + add());}/** * Metoda, ktoru upravime prostrednictvom Hexakodu * (testujeme ByteCode Verifier) */static int add(){

int a,b,c;a = 3;b = 4; // use hex editor to change to "a = 4" in class filereturn (a+b);

}/** * Metoda, pre vykreslovanie Textu s vysledkom */public void paint(Graphics g){

g.drawString("3 + 4 = " + add(), 10, 20);}

Page 12: Bezpečnosť JAVA aplikácií

java.lang.VerifyError: (class: ClassVerify, method: add signature: ()I) Accessing value from uninitialized register 1at java.lang.Class.getDeclaredConstructors0(Native Method)at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)at java.lang.Class.getConstructor0(Unknown Source)at java.lang.Class.newInstance0(Unknown Source)at java.lang.Class.newInstance(Unknown Source)at sun.applet.AppletPanel.createApplet(Unknown Source)at sun.applet.AppletPanel.runLoader(Unknown Source)at sun.applet.AppletPanel.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

***static int add(); Code: 0: iconst_3 1: istore_0 2: iconst_4 3: istore_1 1->0 4: iload_0 5: iload_1 6: iadd 7: ireturn***

Zmeníme časť bytecodu a spustíme program znovu. JVM ohlási Zmeníme časť bytecodu a spustíme program znovu. JVM ohlási chybu z dôvodu čítania neinicializovania registra. Program sa chybu z dôvodu čítania neinicializovania registra. Program sa ukončí. Dôsledok toho že nieje možné pristupovať do chránenej ukončí. Dôsledok toho že nieje možné pristupovať do chránenej pamäte.pamäte.

Sandbox

Class File Verifier Príklad požitia neinicializovaného registra

Page 13: Bezpečnosť JAVA aplikácií

Jadrom celého procesu riadenia prístupu v jazyku Java je Jadrom celého procesu riadenia prístupu v jazyku Java je trieda trieda SecurityManagerSecurityManager. .

• definovaná v balíčku definovaná v balíčku java.langjava.lang

• riadi prístup k prostriedkom hostiteľského riadi prístup k prostriedkom hostiteľského operačného systému.operačného systému.

• kedykoľvek si program vyžiada prístu k určitemu kedykoľvek si program vyžiada prístu k určitemu prostriedku je požiadavka predaná objektu typu prostriedku je požiadavka predaná objektu typu SecurityManagerSecurityManager

Správca zabezpečenia

Charakteristika

Page 14: Bezpečnosť JAVA aplikácií

public FileInputStream(File file) throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(name); } if (name == null) { throw new NullPointerException(); } fd = new FileDescriptor(); open(name);}

Správca zabezpečenia

Konštruktor ešte pred tým ako dovolí vytvorenie Konštruktor ešte pred tým ako dovolí vytvorenie inštancie inštancie FileInputStream FileInputStream skontroluje či má právo čítať.skontroluje či má právo čítať.

Preskúmanie zdrojového kódu triedy FileInputStream

Page 15: Bezpečnosť JAVA aplikácií

Správca zabezpečenia

Vlastnosti

• Za normálnych okolností nieje žiadna inštancia Za normálnych okolností nieje žiadna inštancia správcu zabezpečenia aktívna. správcu zabezpečenia aktívna.

• Výnimkou je spustenie apletu v okne webového Výnimkou je spustenie apletu v okne webového prehliadača, kde JVM vytvorí automaticky prehliadača, kde JVM vytvorí automaticky inštanciu). Tým docieli vytvorenie Sandboxu. inštanciu). Tým docieli vytvorenie Sandboxu.

• V prebehu spracovania je aktívny len jeden Správca V prebehu spracovania je aktívny len jeden Správca zabezpečenia a to posledne priradený systému zabezpečenia a to posledne priradený systému prostredníctvom funkcie : prostredníctvom funkcie :

System.setSecurityManager(...)System.setSecurityManager(...);;

Page 16: Bezpečnosť JAVA aplikácií

Správca zabezpečenia

Spôsob inštalácie

Správcu zabezpečenia je možné do systému inštalovať dvoma Správcu zabezpečenia je možné do systému inštalovať dvoma spôsobmi a to:spôsobmi a to:

• Explicitne inštaláciou v aplikácií. To je vytvorením inštancie Explicitne inštaláciou v aplikácií. To je vytvorením inštancie SecurityManager a jej priradeniu Systému. SecurityManager a jej priradeniu Systému.

• Aktiváciou virtuálneho stroja pomocou Aktiváciou virtuálneho stroja pomocou prepínača –D : prepínača –D :

•java –Djava.security.manager NazovTriedyjava –Djava.security.manager NazovTriedy

Page 17: Bezpečnosť JAVA aplikácií

Správca zabezpečenia

Súbory zásad (policy files)

• Súbor zásad je jednoduchý plochý súbor obsahujúci oprávnenia Súbor zásad je jednoduchý plochý súbor obsahujúci oprávnenia ((permissionspermissions) . Sú to práva užívateľa alebo kódu k vykonávaniu ) . Sú to práva užívateľa alebo kódu k vykonávaniu určitej činnosti. určitej činnosti.

• Ak je daná činnosť povolená volanie metódy Ak je daná činnosť povolená volanie metódy checkPermission()checkPermission() správcom zabezpečenia prebehne bez problémov v opačnom správcom zabezpečenia prebehne bez problémov v opačnom prípade je vyvolaná výnimka. V tomto prípade je potrebné vytvoriť prípade je vyvolaná výnimka. V tomto prípade je potrebné vytvoriť nový súbor zásad alebo modifikovať už vytvorený. nový súbor zásad alebo modifikovať už vytvorený.

• Java 2 umožnite definovať oprávnenie nielen na základe danej Java 2 umožnite definovať oprávnenie nielen na základe danej činnosti ale aj na základe načítania triedy z určitého miesta alebo na činnosti ale aj na základe načítania triedy z určitého miesta alebo na základe podpisu vlastníka alebo skupiny vlastníkovzáklade podpisu vlastníka alebo skupiny vlastníkov..

Page 18: Bezpečnosť JAVA aplikácií

Správca zabezpečenia

Súbory zásad (policy files)

• Pri inštalovaní prostredia Java je vytvorený štandardný Pri inštalovaní prostredia Java je vytvorený štandardný konfiguračný súbor zabezpečenia. Tento súbor je uložený v konfiguračný súbor zabezpečenia. Tento súbor je uložený v podadresári podadresári /lib/security/lib/security domovského adresára inštalácie JRE. domovského adresára inštalácie JRE.

• Konfiguračný súbor sa nazýva Konfiguračný súbor sa nazýva java.securityjava.security a obsahuje a obsahuje časť podobnú následnému výpisu : časť podobnú následnému výpisu :

# The default is to have a single system-wide policy file,# The default is to have a single system-wide policy file,# and a policy file in the user's home directory.# and a policy file in the user's home directory.policy.url.1=file:${java.home}/lib/security/java.policypolicy.url.1=file:${java.home}/lib/security/java.policypolicy.url.2=file:${user.home}/.java.policypolicy.url.2=file:${user.home}/.java.policy

• Súbor Súbor ..java.policyjava.policy obsahuje základné povolenia na prístup k obsahuje základné povolenia na prístup k prostriedkom, ktoré sú rovnaké aké ma aplet po spustení v prostriedkom, ktoré sú rovnaké aké ma aplet po spustení v okne webového prehliadača. okne webového prehliadača.

Page 19: Bezpečnosť JAVA aplikácií

• Súbory zásad možno vytvárať a upravovať pomocou Súbory zásad možno vytvárať a upravovať pomocou ľubovoľného textového editor ľubovoľného textového editoruu. K uvedenej činnosti môžeme . K uvedenej činnosti môžeme použiť tiež nástroj použiť tiež nástroj policytoolpolicytool dodávaný ako súčasť sady JDK dodávaný ako súčasť sady JDK ( (Java Development KitJava Development Kit)).. Podrobnejší návod nájdete na Podrobnejší návod nájdete na http://java.sun.com/j2se/1.3/docs/tooldocs/win32/policytool.html

• Súbor zásad sa ukladá prostredníctvom FileSúbor zásad sa ukladá prostredníctvom File -> Save As -> Save As

Ako vytvoriť vlastný súbor zásad

Správca zabezpečenia

Miesto uloženia súboru zásad

Certifikát

Povolenia ktoré sú uložené v danom súbore zásad.

Pridať odobrať alebo editovať zásadu.

Page 20: Bezpečnosť JAVA aplikácií

Ako vytvoriť vlastný súbor zásad

Správca zabezpečenia

• Pre vytvorenie novej zásady stlačíme v hlavnom okne Pre vytvorenie novej zásady stlačíme v hlavnom okne ““Add Policy EntryAdd Policy Entry””.. Zobrazí sa ďalší dialóg.Zobrazí sa ďalší dialóg.

Adresa na ktorú sa vzťahuje Adresa na ktorú sa vzťahuje oprávnenieoprávnenie

Alias podpisu užívateľa na Alias podpisu užívateľa na ktorý sa vzťahuje oprávneniektorý sa vzťahuje oprávnenie

Pridať odobrať alebo editovať Pridať odobrať alebo editovať oprávnenie.oprávnenie.

Page 21: Bezpečnosť JAVA aplikácií

Ako vytvoriť vlastný súbor zásad

Správca zabezpečenia

• CodeBase Definuje na akú adresu je povolené oprávnenie.

• Signed By Alias podpisu používateľa, ktorého kód je podpísaný. Využíva sa verejný kľúč na zistenie pravosti kódu podpísaného privátnym kľúčom.

• Add,Remove,Edit Permission Slúži na pridanie odobratie a zmenu oprávnenia. Toto oprávnenie sa vzťahuje na danné miesto alebo kódu podpísaného Aliasom a identifikovaného verejným kľúčom.

Page 22: Bezpečnosť JAVA aplikácií

Ako vytvoriť vlastný súbor zásad

Správca zabezpečenia

Permission určuje druh oprávnenia

Target Name určuje triedu na ktorú sa bude oprávnenie vzťahovať

Action určuje vlastnosť oprávnenia na ktorú sa oprávnenie vzťahuje

Page 23: Bezpečnosť JAVA aplikácií

Správca zabezpečenia

Využitie súboru zásad

Pre názornú ukážku vytvorme triedu WriteFile.

import java.io.*;

public class WriteFile{

public static void main(String[] args) throws IOException{FileOutputStream fos = new FileOutputStream(“test.txt”);PrintWriter pw = new PrintWriter(fos);pw.println(“Testujem.”);pw.close();

}}

Trieda vykonáva jednoduchý zápis slova “Testujem.” do súboru “test.txt”.

Page 24: Bezpečnosť JAVA aplikácií

Využitie súboru zásad

Správca zabezpečenia

Po spustení vytvorenej aplikácie WriteFile s implicitným správcom zabezpečenia spustíme program príkazom:

java –Djava.security.manager WriteFile

Chyba, ktorá nastala pre zákaz zapisovania do súboru.java.security.AccessControlException: access denied (java.io.FilePermission test.txt write)at java.security.AccessControlContext.checkPermission(Unknown Source)at java.security.AccessController.checkPermission(Unknown Source)at java.lang.SecurityManager.checkPermission(Unknown Source)at java.lang.SecurityManager.checkWrite(Unknown Source)at java.io.FileOutputStream.<init>(Unknown Source)at java.io.FileOutputStream.<init>(Unknown Source)at WriteFile.main(WriteFile.java:18)Exception in thread "main"

Page 25: Bezpečnosť JAVA aplikácií

Využitie súboru zásad

Správca zabezpečenia

Vytvoríme nový súbor zásad s názvom WriteFile.policy, ktorý povoľuje zápis ľubovoľnej triedy na disk a uložíme ho do rovnakého adresára ako je trieda WriteFile.class.

WriteFile.policy

/* AUTOMATICALLY GENERATED ON Mon Apr 1/* AUTOMATICALLY GENERATED ON Mon Apr 100 13:00:32 CEST 2004*/ 13:00:32 CEST 2004*//* DO NOT EDIT *//* DO NOT EDIT */

grant {grant { permission permission java.io.FilePermissionjava.io.FilePermission "<<ALL FILES>>", "write"; "<<ALL FILES>>", "write";};};

Spustíme program prostredníctvom príkazu :java –Djava.security.manager –Djava.security.policy=WriteFile.policy WriteFile

–Djava.security.policy – identifikuje miesto kde sa nachádza súbor povolení.Program sa vykoná bez problémov pretože SecurityManager je na základe oprávnení definovaných v súbore WriteFile.policy povolí zápis súboru na disk.

Page 26: Bezpečnosť JAVA aplikácií

Využitie súboru zásad Oprávnenie založené na adresách URL a podpisu užívateľa

Správca zabezpečenia

WriteFile.policy

grant codeBase "file:/D:/_Projects/Secure1" { permission java.io.FilePermission "<<ALL FILES>>", "write";};

• pre oddeľovanie adresárov sa používa bežné lomítko (/) aj v prípade súborového systému Windows.

WriteFile.policy

grant signedBy "bis", codeBase "file:/D:/_Projects/Secure1" { permission java.io.FilePermission "<<ALL FILES>>", "write„};

• aby bolo možné vytvoriť povolenie na základe podpisu je potrebné aby autor kódu vytvoril pár kľúčov a podpísal kód svojím súkromným kľúčom.

Page 27: Bezpečnosť JAVA aplikácií

Využitie súboru zásad Ako svoju triedu podpísať

Správca zabezpečenia

Osoba, ktorá chce svoj kód podpísať :

• Vytvorí dvojicu šifrovacích kľúčov (súkromný a verejný pomocou nástroja keytool).

• Vytvorí súbor jar, ktorý obsahuje triedy určené k distribucii (k tomu použije nástroj jar).

• Podpíše súbor jar pomocou súkromného kľúča (k tomuto účelu je určený nástroj jarsigner).

• Všetkým užívateľom takto zabalených tried poskytne archív jar a verejný kľúč. K tomuto musí vedieť ako nástroj keytool použiť k exportu certifikátu z databázy certifikátov a odoslaniu ich k danným užívateľom.

Page 28: Bezpečnosť JAVA aplikácií

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Pre vytvorenie novej dvojice šifrovacích kľúčov je možné použiť nástroj keytool s prepínačom -genkey. Nástroj požadovanú dvojicu vytvorí a uloží ju do databázy certifikátov.

Databáza certifikátov (KEYSTORE) Je malá databáza kde su uložené súkromné kľúče a k nim pridružené certifikáty, tiež zoznamy odvolaných certifikátov a dôveryhodných certifikátov. Pokiaľ daný súbor databázy neexistuje, nástroj keytool ho vytvorí.

Page 29: Bezpečnosť JAVA aplikácií

Ak použijeme nástroj keytool s prepínačom –genkey budeme musieť špecifikovať hodnoty:Alias Jednoduchý názov reprezentujúci užívateľa pre ktorého bude pár šifrovacích kľúčov vytvorený.Heslo k zašifrovaným párom kľúčov Heslo, ktoré bude spojené s dvojicou zašifrovaných kľúčov.Adresu URL Umiestnenie databázy certifikátov. Táto adresa môže obsahovať cestu už k existujúcej databáze (súboru) alebo k databáze ktorá sa

má vytvoriť.Heslo do databázy certifikátov Ak nebola databáza certifikátov vytvorená použije hodnotu tohto parametru ako heslo pre novú databázu.

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Page 30: Bezpečnosť JAVA aplikácií

Nasledujúci príkaz ukazuje ako vytvoriť pár šifrovacích kľúčov :

keytool -genkey –alias kosice –keypass tajomstvo –keystore Autor.jks –storepass heslokeystore

Po zadaní nasledujúceho príkazu program požiada o zadanie informácií, ktoré slúžia na identifikovanie osoby, ktorá vytvára kľúč. Nakoniec vyzve používateľa k potvrdeniu zadaných údajov.

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Page 31: Bezpečnosť JAVA aplikácií

C:\Documents and Settings\Maio>keytool -genkey -alias kosice -keypass heslokeypass -keystore store.jst -storepass heslokeystoreWhat is your first and last name? [Unknown]: Marian LojkaWhat is the name of your organizational unit? [Unknown]: StudentWhat is the name of your organization? [Unknown]: TU KosiceWhat is the name of your City or Locality? [Unknown]: KosiceWhat is the name of your State or Province? [Unknown]: SlovakiaWhat is the two-letter country code for this unit? [Unknown]: SKIs CN=Marian Lojka, OU=Student, O=TU Kosice, L=Kosice, ST=Slovakia, C=SK correct? [no]: yes

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Page 32: Bezpečnosť JAVA aplikácií

Na prácu s nástrojom keytool je možné použiť nástroj KeyTool GUI 1.7 vytvorený Wayne Grantom. Ako voľnú verziu ho nájdete tu.

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Page 33: Bezpečnosť JAVA aplikácií

Ako vytvoriť pár šifrovacích kľúčov

Správca zabezpečenia

Aby sme mohli vytvoriť kľúče musíme vytvoriť novú databázu kľúčov alebo použiť už vytvorenú.

•Java KeyStore (Sun's KeyStore format)

•Java Cryptography Extension KeyStore (More secure version of JKS)

•Public-Key Cryptography Standards #12 KeyStore (RSA's Personal Information

Exchange Syntax Standard)

•Bouncy Castle KeyStore (Bouncy Castle's version of JKS)

•Bouncy Castle UBER KeyStore (More secure version of BKS)

Page 34: Bezpečnosť JAVA aplikácií

Ako vytvoriť pár šifrovacích kľúčov pomocou KeyToolGUI

Správca zabezpečenia

Vytvoreniekľúčov

Výber metódy šifrovania

Nastavenie potrebných údajov

Nastavenie Alias mena

Page 35: Bezpečnosť JAVA aplikácií

Ako vytvoriť pár šifrovacích kľúčov pomocou KeyToolGUI

Správca zabezpečenia

Page 36: Bezpečnosť JAVA aplikácií

Ako vytvoriť jar súbor

Správca zabezpečenia

Súbor jar, ktorý obsahuje zverejnené triedy vytvoríme prostredníctvom nástroja jar dodávaného štandardne s JDK. Jar súbor z sôr definovanej triedy vytvoríme nasledujúcim príkazom:

jar cf WriteFile.jar WriteFile.class

Bližšie sa zaoberať nástrojom jar nieje úlohou tejto prezentácie. Stručnú nepovedú získate zadaním príkazu jar – help.

Page 37: Bezpečnosť JAVA aplikácií

Ako podpísať súbor jar

Správca zabezpečenia

Podpísanie súboru jar môžeme vykonať prostredníctvom nástroja jarsigner, ktorý je súčasťou JDK. Pri podpisovaní Vás tento nástroj požiada aby ste zadali rovnaké hodnoty ako pri vytváraní páru šifrovacích kľúčov. Sú to :

• Adresa URL databázy certifikátov.• Heslo do databázy certifikátov.• Alias kľúča.• Heslo k rozšifrovaniu kľúča.

Okrem uvedených hodnôt je potrebné zadať aj názov súboru jar, ktorý sa má podpísať aj meno jeho kópie, ktorá bude podpísaná.

jarsigner -keystore keystore.jks -storepass heslokeystore -keypass heslokeypass -signedjar SignedWriteFile.jar WriteFile.jar brown.

Page 38: Bezpečnosť JAVA aplikácií

Štruktúra podpísaného jar súboru

Správca zabezpečenia

Zverejnené triedy

META-INF

SignedWriteFile.jar

BROWN.DSABROWN.SFMANIFEST.MF

Page 39: Bezpečnosť JAVA aplikácií

Export a Import verejného kľúča databázy certifikátov

Správca zabezpečenia

Export a Import verejného kľúča databázy je potrebné vykonať ak chcete preniesť kľúč k druhej osobe, ktorá používa vami podpísaný kód a potrebuje si overiť či kód nebol od jeho vytvorenia a podpísania zmenený.

Postup exportu aj importu je v programe KeyToolGUI intuitívny avšak tento postup je možné vykonať prostredníctvom už skôr uvedeného nástroja keytool.

Export :keytool -export –alias brown –keystore keystore.jks –storepass heslokeystore –file Brown.cer.

Import:keytool -import –alias brown –keystore keystore.jks –storepass heslokeystore –file Brown.cer

Page 40: Bezpečnosť JAVA aplikácií

Ako upraviť súbor zásad. Overenie identity vo vhodnej databáze certifikátov.

Správca zabezpečenia

Posledným krokom je úprava súboru zásad takým spôsobom aby našiel cestu k databáze certifikátov, kde sú uložené verejné kľúče vrátane ich aliasov. Túto činnosť je možné vykonať prostredníctvom nástroja policytool.

URL k databáze certifikátov

Page 41: Bezpečnosť JAVA aplikácií

Ako upraviť súbor zásad. Overenie identity vo vhodnej databáze certifikátov.

Správca zabezpečenia

WriteFile.policy

keystore "file:/D:/_Projects/Secure1/keystore.jks";

grant signedBy "brown" { permission java.io.FilePermission "<<ALL FILES>>", "write";};

Spustenie programu :

Pre spustenie programu WriteFile uloženého v súbore SignedWriteFile.jar napríklad tento príkaz :

java -cp SignedWriteFile.jar -Djava.security.manager -Djava.security.policy=WriteFile.policy WriteFile

Page 42: Bezpečnosť JAVA aplikácií

Súbory zásad

javac

jar

jarsigner private key

public key certificate

Keytool -export

Keystore.jks

Keytool -genkey

FileWriter.java

FileWriter.class

FileWriter.jar

SignedFileWriter.jarJamesBrown.cer

1.

2.3.

Alias brown

4.5.

Databáza kľúčov Jamesa Browna

Page 43: Bezpečnosť JAVA aplikácií

java

SignedFileWriter.jar od James Brown

ExceptionProgram nemá oprávnenie pre

zápis údajov na disk

security manager

datový súbor

1.

JamesBrown.cer od James Brown

Keytool -import

Keystore.jks

Databáza kľúčov Jennifer Lopez

Brownov public key certificate java

Policy tool

Policy súbor Jennifer Lopezudeľuje oprávnenie kódu

podpísaného aliasom “brown” na zápis údajov na disk

SignedFileWriter.jar

security manager

datový súbor

2.

3.

4.

Súbory zásad

Page 44: Bezpečnosť JAVA aplikácií

Základná špecifikácia

Typy oprávnenia

Všetky platné oprávnenia definované v súbore zásad sú v Jave interne reprezentované ako inštancia abstraktnej triedy Permission definovaného v balíku java.security.

Ak sa má vykonať špecificky nebezpečná činnosť volá sa metóda checkXXX() a tá vola metódu checkPermission() definovanej v triede AccessControler.

security.checkWrite(fileName);

FileOutpuStream

checkPermission(new FilePermission(file,SecurityConstants.FILE_WRITE_ACTION));

SecurityManager

public static void checkPermission(Permission perm) throws AccessControlException{

AccessController

Page 45: Bezpečnosť JAVA aplikácií

Základné rozdelenie typov oprávnení.

Typy oprávnenia

Page 46: Bezpečnosť JAVA aplikácií

Určité triedy odvodené od triedy Permission sa používajú pre Určité triedy odvodené od triedy Permission sa používajú pre jeden jeden typ oprávneniatyp oprávnenia,, ako napríklad ako napríklad java.io.FilePermissionjava.io.FilePermission, ktorej , ktorej inštancia sa používa k povoleniu prístupu k súboru alebo k skupine inštancia sa používa k povoleniu prístupu k súboru alebo k skupine súborou. Iné triedy ako napríklad súborou. Iné triedy ako napríklad java.lang.RuntimeExceptionjava.lang.RuntimeException sa používajú k popisu sa používajú k popisu viacej typov oprávneniaviacej typov oprávnenia..

Vo všetkých triedach odvodených od triedy Permission je zapuzdrená Vo všetkých triedach odvodených od triedy Permission je zapuzdrená jedna alebo viacej hodnôt String. Uvedené hodnoty popisujú špecifický jedna alebo viacej hodnôt String. Uvedené hodnoty popisujú špecifický typ oprávnenia alebo typ povoleného prístupu. Typy prístupu sa typ oprávnenia alebo typ povoleného prístupu. Typy prístupu sa označujú tiež ako zoznam akcií (označujú tiež ako zoznam akcií (action listaction list).).

Základná charakteristika

Typy oprávnenia

Page 47: Bezpečnosť JAVA aplikácií

Typy oprávnenia

Táto trieda je definovaná v baliču java.security. Je priamym potomkom triedy Permission a rovnako ako jej predok je abstraktnou triedou. Na rozdiel od je bázovej triedy Permission obsahuje metódu implies(Permission per). Metóda umožňuje určiť čí dané oprávnenie zahrnuje v sebe aj iné oprávnenie.

Triedy dedené od BasicPermission• AWTPermission • NetPermission• PropertyPermission• ReflectPermission• RuntimePermission• SecurityPermission• SerializablePermission• SQLPermission

Bližší popis tried nájdete www.java.sun.com.

BasicPermission

Page 48: Bezpečnosť JAVA aplikácií

Oprávnenie FilePermission.

Typy oprávnenia

Použitím tejto triedy sa určuje prístup k súborom alebo adresárom. Zoznam operácií by mal obsahovať jednu alebo viac nasledujúcich položiek : read, write, execute, delete.

Väčšinou bude cieľ oprávnenia zastupovať názov súboru alebo adresára. Následne je uvedených nikoľko príkladov:

grant { permission java.io.FilePermission “C:/temp”,”read”; permission java.io.FilePermission “C:/temp/readme.txt”,”read”;}

Oprávnenie k čítaniu adresára temp a k čítaniu súboru readme.txt.

Page 49: Bezpečnosť JAVA aplikácií

grant { permission java.io.FilePermission “C:/temp/*”,”read”;}

Oprávnenie k čítaniu adresára a všetkých v ňom uložených súborov.

grant { permission java.io.FilePermission “C:/temp/-”,”read”;}

Oprávnenie k čítaniu všetkých súborov v tomto adresári a jeho podadresároch.

grant { permission java.io.FilePermission “<<ALL FILES>>”,”write,read”;}

Oprávnenie k čítaniu a zápisu všetkých súborov a adresárov.

Oprávnenie FilePermission.

Typy oprávnenia

Page 50: Bezpečnosť JAVA aplikácií

Oprávnenie SocketPermission.

Typy oprávnenia

Schopnosť apletov vytvárať soketové pripojenie je obmedzené. Nepodpísané aplety môžu vytvárať soketové pripojenie iba k serveru z ktorého boli stiahnuté. Samotné oprávnenie sa skladá z dvoch položiek a to :

• Názov hostiteľa(názov DNS počítača v sieti alebo jeho IP).• Zoznam akcií, ktoré sú povolené pri operáciách s hostiteľom

Zoznam akcií môže obsahovať jednu alebo viacej nasledujúcich položiek : accept, connect, listen, resolve.

Page 51: Bezpečnosť JAVA aplikácií

Oprávnenie SocketPermission.

Typy oprávnenia

ConnectUmožňuje určiť povolenie ktoré lokálnemu počítaču dovoľuje vytvoriť soketové pripojenie k iným počítačom.

ListenUdeľuje oprávnenie k sledovaniu prichádzajúcich pripojení.permission java.net.SocketPermission “localhost:500-5010”,”listen”;

AcceptUdeľuje, ktoré počítače môžu vytvoriť soketové pripojenie k lokálnemu počítaču. permission java.net.SocketPermission “*.tuke.sk:6000-6500”,”accept”;

ResloveUrčuje povolenie na preklad názvov hostiteľov na adresy IP a naopak.

Page 52: Bezpečnosť JAVA aplikácií

Nebezpečie spätnej analýzy DJ Decompiler

Spätný preklad bajtového kódu

Page 53: Bezpečnosť JAVA aplikácií

Nebezpečie spätnej analýzy Súbor WriteFile.class po spätnej anlýze.

Spätný preklad bajtového kódu

Nechránený prístup k

reťazcom

Page 54: Bezpečnosť JAVA aplikácií

Protiopatrenia

Spätný preklad

Jednou z možností ako je predísť nebezpečiu pred spätným prekladom je použitie Obfuscator-a (Zatemňovača). Je to program, ktorý je určený pre jeden cieľ a to zmareniu spätného prekladu.

Jedným z takýchto nástrojov je JShrink.

Page 55: Bezpečnosť JAVA aplikácií

Spätný preklad

Protiopatrenia JShrink

Nastavenie úrovne zatemňovania tried

Page 56: Bezpečnosť JAVA aplikácií

BibliografiaBibliografia

[1] [1] Marco Pistoia, Duane F. Reller : Java 2 Network Security , Jun 1999 , Jun 1999[2] [2] Scott OaksScott Oaks:Java Security 2nd EditionJava Security 2nd Edition, , O'REILLYO'REILLY , , May 2001May 2001 [3] BretSpell : [3] BretSpell : Java Programujeme ProfesionJava Programujeme Profesionáálnelne, Január 2002, Január 2002[[44] ] Markus FalkhausenMarkus Falkhausen::Contributions to Information TechnologyContributions to Information Technology,,

http://www.falkhausen.de/en/diagram/diagram.htmlhttp://www.falkhausen.de/en/diagram/diagram.html[[55] ] James A. VuccoloJames A. Vuccolo : : Java - A Secure Programming LanguageJava - A Secure Programming Language, September 2000, September 2000

http://www.personal.psu.edu/staff/j/v/jvuccolo/javasecurity/index.htmhttp://www.personal.psu.edu/staff/j/v/jvuccolo/javasecurity/index.htm[6][6] Gary McGraw and Edward Felten: Gary McGraw and Edward Felten: The Original Applet SandboxThe Original Applet Sandbox, Januar 2000, Januar 2000

http://www.securingjava.com/chapter-two/chapter-two-2.htmlhttp://www.securingjava.com/chapter-two/chapter-two-2.html[7] [7] Scott OaksScott Oaks::Java SecurityJava Security,, May 1998May 1998[8] [8] Sun Microsystems: Sun Microsystems: The Source for DevelopersThe Source for Developers,,

http://developers.sun.com/techtopics/security/index.htmlhttp://developers.sun.com/techtopics/security/index.html [9] [9] Sun Microsystems: Sun Microsystems: The JavaTM TutorialThe JavaTM Tutorial , Trail: Security in Java 2 SDK 1.2 , Trail: Security in Java 2 SDK 1.2

http://java.sun.com/docs/books/tutorial/security1.2/index.htmlhttp://java.sun.com/docs/books/tutorial/security1.2/index.html[10] [10] Joseph A: Joseph A: BankBank::Java SecurityJava Security,,

http://swissnet.ai.mit.edu/~jbank/javapaper/javapaper.htmlhttp://swissnet.ai.mit.edu/~jbank/javapaper/javapaper.html

A iné ...A iné ...