Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Fejlett Programozási Technikák 2. 15/8. Fejlett Programozási Technológiák 2. 2 Az előző előadás tartalma: Java Applet  Felépítése  Tulajdonságai 

Hasonló előadás


Az előadások a következő témára: "1 Fejlett Programozási Technikák 2. 15/8. Fejlett Programozási Technológiák 2. 2 Az előző előadás tartalma: Java Applet  Felépítése  Tulajdonságai "— Előadás másolata:

1 1 Fejlett Programozási Technikák 2. 15/8

2 Fejlett Programozási Technológiák 2. 2 Az előző előadás tartalma: Java Applet  Felépítése  Tulajdonságai  Paraméterátadás JDBC  Típusai  Kapcsolat típusok  Statement objektumok  RecordSet  Tranzakciók

3 Fejlett Programozási Technológiák 2. 3 Források http://www.javaworld.com/javaworld/jw-04-2000/jw-0428-security.html http://www.cacr.math.uwaterloo.ca/hac/ http://java.sun.com/security/ http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-jaas.html http://java.sun.com/sfaq/verifier.html http://ei.cs.vt.edu/~wwwbtb/book/chap14/index.html http://www.cab.u-szeged.hu/WWW/java/kiss/security.html#ch3.1 http://www2.tw.ibm.com/developerWorks/tutorial/pdf/j-sec1-a4.pdf http://www2.tw.ibm.com/developerWorks/tutorial/pdf/j-sec2-a4.pdf

4 Fejlett Programozási Technológiák 2. 4 A mai előadás tartalma: Számítógépes biztonság Jáva és a biztonság  Biztonsági architektúra Titkosító architektúra  JCE  JAAS  JSSE  GSSE

5 Fejlett Programozási Technológiák 2. 5 Számítógépes biztonság Mit jelent a számítógépes biztonság? Korlátlan erőforrással bármely rendszer feltörhető. Cél: Olyan rendszer kiépítése melynek feltörése sokkal nagyobb energia mint a benne fellelhető információ értéke A bonyolult rendszer nem biztos, hogy biztonságosabb. A biztonsági szempontok a rendszer tervezésének alapvető paraméterei közé tartoznak.

6 Fejlett Programozási Technológiák 2. 6 Támadás típusok Kategóriák:  Titkosság elleni támadás  Integritás elleni támadás  Rendelkezésre állás elleni támadás Gyakori támadás fajták:  Nyers erő (brute force)  Trójai (trojan horse)  Ember középen (man-in-the-middle)

7 Fejlett Programozási Technológiák 2. 7 Feltörhetőség 1977: Diffie and Hellman, 20 millió gép, 10 óra alatt 1987: Diffie and Hellman, 200,000 gép, 10 óra alatt 1993: Diffie and Hellman, M. Wiener, kulcs kereső IC, 5760 IC, $10.50/IC, 1.5 nap alatt 1997: DES challenges I, DESCHALL, 96 nap 1998: DES challenges II-1, distributed.net, 41 nap 1998: DES challenges II-2, Electronic Frontier Foundation, 56 nap 1999: DES challenges III, distributed.net, 22 nap

8 Fejlett Programozási Technológiák 2. 8 Jáva támadások 1. Trükkös kód 2. Régi, hack-elt javac 3. Class fájlok átírása (CGI jogosultságok) 4. Programok válogatása 5. Kapcsolat eltérítése (spoofing) (aláírt applet) 6. JVM bug

9 Fejlett Programozási Technológiák 2. 9 Áttekintés

10 Fejlett Programozási Technológiák 2. 10 Jáva és a biztonság/1 Nyílt:  A fordító és a virtuális gép forrása is hozzáférhető, megvizsgálható Jáva nyelv:  Nincsenek mutatók  Minden primitív típus adott méretű  Hozzáférési szintek  Final  Hibakezelés Fordító:  Az utasítások sorrendje fordító független  Bájtkód  Erősen típusos, fordításkor szigorú ellenőrzés Objektum típusátformázás ellenőrzött (casting) Minden metódus, tagváltozó hivatkozás ellenőrzésre kerül (pl.: private) Primitív adattípusok nem keverhetőek a referencia típusokkal (1.5 auto boxing)

11 Fejlett Programozási Technológiák 2. 11 Jáva és a biztonság/2 Futtató környezet:  Osztály betöltő  Bájt kód ellenőrző Verzió problémák, Bináris kompatibilitás Gonosz másik oldal (trükkös fordító, …)  Biztonsági Menedzser: Az erőforrások elérésének ellenőrzése Kód alapú Felhasználó alapú  Szemét gyűjtő Keretrendszerek, API-k

12 Fejlett Programozási Technológiák 2. 12 Osztály betöltő Típusai:  Ősi (primordial)  Java osztálybetöltő  Saját osztály betöltőt is írhatunk (pl.: címtárból történő betöltésre…) Feladatai:  Az osztály fájlok megtalálása (megfelelő sorrendben, biztonsági okokból) Böngésző értelmezi a html kódot Indít egy JVM-et A JVM meghívja az Applet osztály betöltőt A betöltő megpróbálja a helyi lemezről betölteni (java., …) (ősi) Végigkeresi a classpath-ot (URLClassLoader) Megpróbálja letölteni a webszerverről (Bönégsző specifikus class loader, vagy URLClassLoader)  A biztonsági beállítások lekérdezése  Egy osztály objektum definiálása megfelelő jogosultságokkal  A névterek kezelése

13 Fejlett Programozási Technológiák 2. 13 Bájt kód ellenőrző Class file verifier Az alap Java osztályokat nem bántja (esetenként a helyi lemezen lévő fájlokat sem) Problémák:  Illegális mutató (egy objektumot más objektumként használunk)  Illegális bájtkód utasítások  Illegális paraméterek kiszűrése  Verem túlcsordulás  Illegális cast  Láthatóság megsértése A fentieket megoldhatná a JVM csak lassabb lenne a végrehajtás Folyamat:  Osztályállomány szintaktikus ellenőrzése  Osztályállomány összefüggéseinek ellenőrzése  Az utasításfolyam ellenőrzése  Külső hivatkozások ellenőrzése

14 Fejlett Programozási Technológiák 2. 14 Példa import java.awt.*; import java.applet.*; public class TestVerify extends Applet { public static void main(String[] args) { System.out.println("3 + 4 = " + add()); } static int add() { int a,b,c; a = 3; b = 4; return (a+b); } public void paint(Graphics g) { g.drawString("3 + 4 = " + add(), 10, 20); } Compiled from TestVerify.java public class TestVerify extends java.applet.Applet { public TestVerify(); static int add(); public static void main(java.lang.String[]); public void paint(java.awt.Graphics); } Method TestVerify() 0 aload_0 1 invokespecial #9 4 return Method int add() 0 iconst_3 1 istore_0 2 iconst_4 3 istore_1 4 iload_0 5 iload_1 6 iadd 7 ireturn Exception in thread "main" java.lang.VerifyError: (class: TestVerify, method: add signature: ()I) Accessing value from uninitialized register 1

15 Fejlett Programozási Technológiák 2. 15 Osztályállomány szintaktikus ellenőrzése ClassFile { u4 magic; (0xCAFEBABE) u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; } Aláírás ellenőrzés A struktúrák hosszának ellenőrzése Constant pool ellenőrzése

16 Fejlett Programozási Technológiák 2. 16 Osztályállomány összefüggéseinek ellenőrzése Olyan ellenőrizések melyeket a kód értelmezése nélkül meg lehet tenni Final Superclass Konstans Tároló

17 Fejlett Programozási Technológiák 2. 17 Az utasításfolyam ellenőrzése Adatfolyam ellenőrzés minden metóduson, a program egy-egy pontban az elérési útvonaltól függetlenül:  A stack ugyanolyan méretű és ugyanazokat az objektumokat tartalmazza  A regiszterek csak akkor használtak, ha megfelelő típust tartalmaznak  A metódusok megfelelő paraméterekkel hívódnak meg  A mezők megfelelő típusú értékkel módosulnak A kódot statikusan ellenőrzi (nem futtatja) Eredménye:  Futásidejű viselkedés bizonyíthatóan biztonságos  Futásidejű viselkedés bizonyíthatóan nem biztonságos  Futásidejű viselkedés sem nem bizonyíthatóan biztonságos sem nem bizonyíthatóan nem biztonságos

18 Fejlett Programozási Technológiák 2. 18 Külső hivatkozások ellenőrzése Az előző menetekben nem ellenőrizte a külső osztályok és azok mezőinek valódiságát Futás közben ellenőrzi a fentieket amikor betöltődnek az osztályok

19 Fejlett Programozási Technológiák 2. 19 Biztonsági Menedzser Futás idejű biztonsági ellenőrzés Java2 előtt egy absztrakt osztály volt (főleg a böngészők implementálták)  Homokozó java.lang.SecurityManager  Biztonsági rendszabály alapú (policy based) Természetesen ez is bővíthető

20 Fejlett Programozási Technológiák 2. 20 Hely függő (homokozó modell) Java 1.0 Nagyon szigorú a távoli kódokkal Nincs kivétel

21 Fejlett Programozási Technológiák 2. 21 Kód alapú (digitálisan aláírt) Java 1.1 A digitálisan aláírt kód alapján eldönthetjük, hogy milyen jogosult- sággal akarjuk futtatni Probléma: Érdekes játék, háttérben a bankkártya adatokat

22 Fejlett Programozási Technológiák 2. 22 Finomhangolás Java2 Aláírás/URL alapú Távoli és helyi kódra is vonatkozhat Policy fájl Adott jogosultság adott kódrésznek adott erő- forráshoz

23 Fejlett Programozási Technológiák 2. 23 Védelmi tartomány Rendszer Tartomány Alkalmazás tartományok  Principal  Policy fájl grant signedBy "sysadmin", codeBase "file:/home/sysadmin/*" { permission java.security.SecurityPermission "Security.insertProvider.*"; permission java.security.SecurityPermission "Security.removeProvider.*"; permission java.security.SecurityPermission "Security.setProperty.*"; };

24 Fejlett Programozási Technológiák 2. 24 Lexikális szűkítés Csak az adott kódrésznek adunk jogosultságot Minden érzékeny kód egy helyre gyűjthető java.security.AccessControler.doPrivileged()

25 Fejlett Programozási Technológiák 2. 25 Futás idejű hozzáférés vezérlés I/O, … SecurityManager.checkPermission() A szál jogosultságát ellenőrzi  A hívási veremben minden metódust ellenőriz (az általuk használt objektumokat)  A legkisebb közös jogosultság Használata:  java -Djava.security.manager HelloWorld  java.lang.System

26 Fejlett Programozási Technológiák 2. 26 Áttekintés

27 Fejlett Programozási Technológiák 2. 27 Eszközök Jar Jarsigner Keytool  Keystore policytool

28 Fejlett Programozási Technológiák 2. 28 Kód biztonság Bájt kód  Sok információt tartalmaz  Könnyű visszafejteni Eszköz:  Mocha, … Algoritmus másolás Érzékeny információ (passwd, …) Biztonsági rendszer megismerése …

29 Fejlett Programozási Technológiák 2. 29 Megoldás Obfuscator  A változó, metódus neveket lecseréli a constant pool-ban  Védett nevek használata (if, for, …) Hosing  Értelmetel kódokat szúr be (pl.: pop, push)  Nagyban rontja a JVM JIT hatékonyságát Írjunk olyan kódot melynél nem baj ha más is elolvassa

30 Fejlett Programozási Technológiák 2. 30 J2SE 1.5 biztonsági eszközök JCA/JCE JSSE Java CertPath JAAS/JGSS

31 Fejlett Programozási Technológiák 2. 31 JCA/JCE JCA Titkosító architektúra Alap titkosítás Export korlátozás mentes Aláírások, kivonat,.. JCE Titkosító architektúra bővítmény Fejlett titkosítás Export korlátozás Titkosítók

32 Fejlett Programozási Technológiák 2. 32 Titkosító architektúra Titkosító eljárások:  Szimmetrikus kulcsú titkosítás (bulk encripiton) DES DEA RC4 AES  Aszimmetrikus kulcsú titkosítás (public key encripition) RSA  Kivonatolás MD5

33 Fejlett Programozási Technológiák 2. 33 Kivonatolás Kulcs nélkül  Algoritmusok: MD2, MD5 (128 bit) SHA-1 (160 bit) SHA-256,SHA-382, SHA-512  Használata: MessageDigest.getInstance("MD5").update(plaintext).digest() Kulcs használatával (MAC)  Algoritmusok: HMAC/SHA-1 HMAC/MD5  Használata: KeyGenerator.getInstance("HmacMD5" ).generateKey() Mac.getInstance("HmacMD5").init(MD5key).update(plaintext).doFinal()

34 Fejlett Programozási Technológiák 2. 34 Példa kivonatoló import java.security.*; import javax.crypto.*; public class MessageDigestExample { public static void main (String[] args) throws Exception { if (args.length !=1) { System.err.println("Usage: java MessageDigestExample text"); System.exit(1); } byte[] plainText = args[0].getBytes("UTF8"); MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update( plainText); System.out.println( "\nDigest: " ); System.out.println( new String( messageDigest.digest(), "UTF8") ); }

35 Fejlett Programozási Technológiák 2. 35 Példa MAC import java.security.*; import javax.crypto.*; public class MessageAuthenticationCodeExample { public static void main (String[] args) throws Exception { if (args.length !=1) { System.err.println("Usage: java MessageAuthenticationCodeExample text");System.exit(1);} byte[] plainText = args[0].getBytes("UTF8"); System.out.println( "\nStart generating key" ); KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5"); SecretKey MD5key = keyGen.generateKey(); System.out.println( "Finish generating key" ); Mac mac = Mac.getInstance("HmacMD5"); mac.init(MD5key); mac.update(plainText); System.out.println( "\n" + mac.getProvider().getInfo() ); System.out.println( "\nMAC: " ); System.out.println( new String( mac.doFinal(), "UTF8") );}}

36 Fejlett Programozási Technológiák 2. 36 Titkosítás Típusai:  Adatkezelés Blokk titkosító (block cipher)  64 bit  Padding (No padding,PKCS5,OAEP, SSL3) Bit titkosító (stream cipher)  Algoritmus: Nyilvános kulcsú Titkos kulcsú  Működési módok ECB (Electronic Code Book) CBC (Cipher Block Chaining) CFB (Cipher Feedback Mode) OFB (Output Feedback Mode) PCBC (Propagating Cipher Block Chaining)

37 Fejlett Programozási Technológiák 2. 37 Szimmetrikus titkosítás Algoritmusok:  DES (Data Encription Standard) – 54 bit  TriplDES – 112 bit  AES (Advanced Encription Standard) – 128,192,256 bit  RC2,RC4,RC5  Blowfish – 32 - 448 bit  PBE (Password Based Encryption) Használatuk:  KeyGenerator.getInstance("DES"),.init(56),.generateKey()  Cipher.getInstance("DES/ECB/PKCS5Padding") .init(Cipher.ENCRYPT_MODE, key) .doFinal(plainText) .init(Cipher.DECRYPT_MODE, key): .doFinal(cipherText)

38 Fejlett Programozási Technológiák 2. 38 import java.security.*; import javax.crypto.*; public class PrivateExample { public static void main (String[] args) throws Exception { if (args.length !=1) { System.err.println("Usage: java PrivateExample text"); System.exit(1);} byte[] plainText = args[0].getBytes("UTF8"); System.out.println( "\nStart generating DES key" ); KeyGenerator keyGen = KeyGenerator.getInstance("DES"); keyGen.init(56); Key key = keyGen.generateKey(); System.out.println( "Finish generating DES key" ); Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); System.out.println( "\n" + cipher.getProvider().getInfo() ); System.out.println( "\nStart encryption" ); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] cipherText = cipher.doFinal(plainText); System.out.println( "Finish encryption: " ); System.out.println( new String(cipherText, "UTF8") ); System.out.println( "\nStart decryption" ); cipher.init(Cipher.DECRYPT_MODE, key); byte[] newPlainText = cipher.doFinal(cipherText); System.out.println( "Finish decryption: " ); System.out.println( new String(newPlainText, "UTF8") ); }

39 Fejlett Programozási Technológiák 2. 39 Aszimmetrikus titkosítás Tipikus kulcs hosszúság 1024 bit 100, 1000 –szer lassabb mint a szimmetrikus Algoritmusok:  RSA  Diffie-Hellman (kulcs csere) Használata:  KeyPairGenerator.getInstance("RSA").initialize(1024).generateKeyPair():  Cipher.getInstance("RSA/ECB/PKCS1Padding") .init(Cipher.ENCRYPT_MODE, key.getPublic()) .doFinal(plainText) .init(Cipher.DECRYPT_MODE, key.getPrivate()) .doFinal(cipherText)

40 Fejlett Programozási Technológiák 2. 40 import java.security.*; import javax.crypto.*; public class PublicExample { public static void main (String[] args) throws Exception { if (args.length !=1) { System.err.println("Usage: java PublicExample text");System.exit(1);} byte[] plainText = args[0].getBytes("UTF8"); System.out.println( "\nStart generating RSA key" ); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key = keyGen.generateKeyPair(); System.out.println( "Finish generating RSA key" ); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); System.out.println( "\n" + cipher.getProvider().getInfo() ); System.out.println( "\nStart encryption" ); cipher.init(Cipher.ENCRYPT_MODE, key.getPublic()); byte[] cipherText = cipher.doFinal(plainText); System.out.println( "Finish encryption: " ); System.out.println( new String(cipherText, "UTF8") ); System.out.println( "\nStart decryption" ); cipher.init(Cipher.DECRYPT_MODE, key.getPrivate()); byte[] newPlainText = cipher.doFinal(cipherText); System.out.println( "Finish decryption: " ); System.out.println( new String(newPlainText, "UTF8") );}}

41 Fejlett Programozási Technológiák 2. 41 Digitális aláírások Tipikusan hash+asszimmetrikus titkosítás Módszerek:  Barkácsolós  Egyszerű Algoritmusok:  MD2/RSA  MD5/RSA  SHA1/DSA  SHA1/RSA Használatuk:  KeyPairGenerator.getInstance("RSA").initialize(1024).generateKeyPair()  Cipher.getInstance("MD5WithRSA").initSign(key.getPrivate()).update(plainText).sign().initVerify(key.getPublic()) and.verify(signature):

42 Fejlett Programozási Technológiák 2. 42 Példa import java.security.*; import javax.crypto.*; public class DigitalSignature2Example { public static void main (String[] args) throws Exception { if (args.length !=1) {System.err.println("Usage: java DigitalSignature1Example text");System.exit(1);} byte[] plainText = args[0].getBytes("UTF8"); System.out.println( "\nStart generating RSA key" ); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key = keyGen.generateKeyPair(); System.out.println( "Finish generating RSA key" ); Signature sig = Signature.getInstance("MD5WithRSA"); sig.initSign(key.getPrivate()); sig.update(plainText); byte[] signature = sig.sign(); System.out.println( sig.getProvider().getInfo() ); System.out.println( "\nSignature:" ); System.out.println( new String(signature, "UTF8") ); System.out.println( "\nStart signature verification" ); sig.initVerify(key.getPublic()); sig.update(plainText); try {if (sig.verify(signature)) {System.out.println( "Signature verified" );} else System.out.println( "Signature failed" ); } catch (SignatureException se) { System.out.println( "Signature failed" ); }}}

43 Fejlett Programozási Technológiák 2. 43 Digitális igazolványok Hitelesító Hatóság - certificate authority (CA)  Certificate Revocation Lists (CRL) Típusok:  X.509 Tárolás:  Keystore

44 Fejlett Programozási Technológiák 2. 44 Kulcstároló (Keystore) java.secutity keytool ->.keystore A privát kulcsokat és a megfelelő bizonyítványokat tároljuk benne Jelszóval van titkosítva (Java Key Store) Minden kulcs külön jelszóval titkosítható Hash-el van védve a változtatástól Természetesen ez is bővíthető (pl.: adatbázist akarunk használni fájl helyett)

45 Fejlett Programozási Technológiák 2. 45 Használata C:\Documents and Settings\bilickiv.INFORM>keytool -genkey -v -alias Vili -keyalg RSA Enter keystore password: jelszó What is your first and last name? [Unknown]: Vilmos Bilicki What is the name of your organizational unit? [Unknown]: SZTE What is the name of your organization? [Unknown]: InfTSZCS What is the name of your City or Locality? [Unknown]: Szeged What is the name of your State or Province? [Unknown]: Csongrád What is the two-letter country code for this unit? [Unknown]: HU Is CN=Vilmos Bilicki, OU=SZTE, O=InfTSZCS, L=Szeged, ST=Csongrád, C=HU correct? [no]: yes Generating 1á024 bit RSA key pair and self-signed certificate (MD5WithRSA) for: CN=Vilmos Bilicki, OU=SZTE, O=InfTSZCS, L=Szeged, ST=Csongrád, C=HU Enter key password for (RETURN if same as keystore password): jelszó [Saving C:\Documents and Settings\bilickiv.INFORM\.keystore]

46 Fejlett Programozási Technológiák 2. 46 cacerts Rendszer szintű tároló A megbízható CA bizonyítványok tárolója keytool -list -keystore cacerts

47 Fejlett Programozási Technológiák 2. 47 Certification Path API import java.security.*; import java.security.cert.*; // CertificateFactory for X.509 CertificateFactory cf =CertificateFactory.getInstance("X.509"); // Obtain CertPathValidator CertPathValidator cpv = CertPathValidator.getInstance("PKIX"); // Set the Trust anchor TrustAnchor anchor = new TrustAnchor((X509Certificate)cf.getCertificate("ca"),null); PKIXParameters params = new PKIXParameters(Collections.singleton(anchor)); // Revocation as false params.setRevocationEnabled(false); // Validate PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) cpv.validate(cp, params);

48 Fejlett Programozási Technológiák 2. 48 JSE Java Platform Security Extension (JSE)  Java Secure Socket Extension (JSSE)  Java Authorization and Authentication Service API (JAAS)  Java Crypography Extenision (JCE)

49 Fejlett Programozási Technológiák 2. 49 Java Secure Socket Extension Jáva SSL megvalósítás Vég-vég biztonság import java.io.*; import java.net.*; import javax.net.ssl.*; SSLServerSocketFactory sslsrvfact = SSLServerSocketFactory.getDefault(); SSLServerSocket s = sslsrvfact.createServerSocket(port); s.accept(); import java.io.*; import java.net.*; import javax.net.ssl.*; SSLSocketFactory sslfact = SSLSocketFactory.getDefault(); SSLSocket s = sslfact.createSocket(host, port);

50 Fejlett Programozási Technológiák 2. 50 import java.io.*; import java.net.*; import javax.net.ssl.*; public class HTTPSServerExample { public static void main(String[] args) throws IOException { SSLServerSocketFactory sslsf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); ServerSocket ss = sslsf.createServerSocket(8080); while (true) { try { Socket s = ss.accept(); System.out.println( "Client connection made" ); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(in.readLine()); PrintWriter out = new PrintWriter( s.getOutputStream() ); out.println(" HTTPS Server Example " + " Hello World! \n"); out.close(); s.close(); } catch (Exception e) { e.printStackTrace();}}}} java -Djavax.net.ssl.keyStore=sslKeyStore -Djavax.net.ssl.keyStorePassword=password HTTPSServerExample

51 Fejlett Programozási Technológiák 2. 51 JAAS Java Authentication and Authorization Service (JAAS) API Felhasználó azonosítás (eddig csak kód alapú azonosítás volt)  Mit tud  Mivel rendelkezik  Kicsoda Az azonosítás választható (alakítható) Plugable Authentication Modules (PAM) Engedélyezés:  Deklaratív  Progamból

52 Fejlett Programozási Technológiák 2. 52 PAM SUN Solaris (Linux, …) Szabványos azonosító környezet Az aktuálisan használt eljárás használat, telepítés közben derül ki (administrator) Login modulok  Válszthatóak  Könnyen bővíthetőek Login konfigurációs fájl

53 Fejlett Programozási Technológiák 2. 53 Java 1.4 login modulok com.sun.security.auth.module.NTLoginModule com.sun.security.auth.module.NTSystem com.sun.security.auth.module.JndiLoginModule com.sun.security.auth.module.KeyStoreLoginModul e com.sun.security.auth.module.Krb5LoginModule com.sun.security.auth.module.SolarisSystem com.sun.security.auth.module.UnixLoginModule com.sun.security.auth.module.UnixSystem

54 Fejlett Programozási Technológiák 2. 54 JAAS elemei Login Context  Login.config Login Module Subject  Elemei: Principal (PrincipalImpl) Credential  Metódusai: subject.getPrincipals() subject.getPublicCredentials() subject.getPrivateCredentials() Access Controller  Permission objektum  Jaas.policy

55 Fejlett Programozási Technológiák 2. 55 JAAS példa // Example Java 2 Security Policy Entry grant Codebase "www.sun.com", Signedby "duke" { FilePermission "/cdrom/-", "read"; } // Example JAAS Security Policy Entry grant Codebase "www.sun.com", Signedby "duke", Principal com.sun.Principal "charlie" { FilePermission "/cdrom/charlie/-", "read"; } // Example login module configuration entry Login2 { sample.SampleLoginModule required; com.sun.security.auth.module.NTLoginModule sufficient; com.foo.SmartCard requisite debug=true; com.foo.Kerberos optional debug=true; }; import java.security.*; import javax.security.auth.*; //exts // Instantiate a login context LoginContext ctx = new LoginContext ("name", CallbackHandler); // Authenicate the subject ctx.login(); // Retrieve authenticated subject Subject sub = ctx.getSubject(); // Enforce Access Controls Subject.doAs(sub, action);

56 Fejlett Programozási Technológiák 2. 56 Példa

57 Fejlett Programozási Technológiák 2. 57 PrincipalImpl import java.io.Serializable; import java.security.Principal; public class PrincipalImpl implements Principal, Serializable { private String name; public PrincipalImpl(String n) {name = n;} public boolean equals(Object obj) { if (!(obj instanceof PrincipalImpl)) {return false;} PrincipalImpl pobj = (PrincipalImpl)obj; if (name.equals(pobj.getName())) {return true;}return false;} public String getName() {return name;} public int hashCode() {return name.hashCode();} public String toString() {return getName();} }

58 Fejlett Programozási Technológiák 2. 58 Login konfiguráció A használt azonosítási eljárást nem a program írásakor döntjük el Login.config Djava.security.auth.login.config==login.config == a rendszer fájlt lecseréli LoginContext  required  optional  requisite  sufficient JAASExample { AlwaysLoginModule required; PasswordLoginModule optional; };

59 Fejlett Programozási Technológiák 2. 59 Login Context Java osztály Login végrehajtás Subject visszaadás Konstruktora:  LoginContext("JAASExample", newUsernamePasswordCallbackHandler()) Fontosabb metódusai:  login()  getSubject()  logout()

60 Fejlett Programozási Technológiák 2. 60 Callback handler Feladata a megfelelő információ beszerzése javax.security.auth.callback.CallbackHandler Elemei:  NameCallback  PasswordCallback  TextInputCallback  TextOutputCallback  LanguageCallback  ChoiceCallback  ConfirmationCallback

61 Fejlett Programozási Technológiák 2. 61 import java.io.*; import java.security.*; import javax.security.auth.*; import javax.security.auth.callback.*; UsernamePasswordCallbackHandler implements CallbackHandler { public void handle(Callback[] callbacks) throws UnsupportedCallbackException, IOException { for(int i=0;i<callbacks.length;i++) { Callback cb = callbacks[i]; if (cb instanceof NameCallback) { NameCallback nameCallback = (NameCallback)cb; System.out.print( nameCallback.getPrompt() + "? "); System.out.flush(); String username = new BufferedReader( new InputStreamReader(System.in)).readLine(); nameCallback.setName(username); } else if (cb instanceof PasswordCallback) { PasswordCallback passwordCallback = (PasswordCallback)cb; System.out.print( passwordCallback.getPrompt() + "? "); System.out.flush(); String password = new BufferedReader( new InputStreamReader(System.in)).readLine(); passwordCallback.setPassword(password.toCharArray()); password = null; } else { throw new UnsupportedCallbackException(cb, "Unsupported Callback Type");}}}}

62 Fejlett Programozási Technológiák 2. 62 Login Modul LoginModule interfész Két fázisú elfogadás (two phase commit) Metódusai:  initialize( subject, callbackHandler, sharedState, options)  login()  commit()  abort()  logout()

63 Fejlett Programozási Technológiák 2. 63 public class AlwaysLoginModule implements LoginModule { private Subject subject;private Principal principal;private CallbackHandler callbackHandler; private String username;private boolean loginSuccess; public void initialize(Subject sub, CallbackHandler cbh, Map sharedState, Map options) {subject = sub;callbackHandler = cbh;loginSuccess = false;} public boolean login() throws LoginException { if (callbackHandler == null) {throw new LoginException( "No CallbackHandler defined");} Callback[] callbacks = new Callback[1]; callbacks[0] = new NameCallback("Username"); try {System.out.println( "\nAlwaysLoginModule Login" ); callbackHandler.handle(callbacks); username = ((NameCallback)callbacks[0]).getName(); } catch (IOException ioe) { throw new LoginException(ioe.toString()); } catch (UnsupportedCallbackException uce) { throw new LoginException(uce.toString());} loginSuccess = true; return true;} public boolean commit() throws LoginException { if (loginSuccess == false) { System.out.println( "Commit: AlwaysLoginModule FAIL" ); return false;} if (!(subject.getPrincipals().contains(principal))) { subject.getPrincipals().add(principal);} System.out.println( "Commit: AlwaysLoginModule SUCCESS" ); return true; }…

64 Fejlett Programozási Technológiák 2. 64 if (callbackHandler == null) {throw new LoginException("No CallbackHandler defined");} Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Username"); callbacks[1] = new PasswordCallback("Password", false); try { callbackHandler.handle(callbacks); username = ((NameCallback)callbacks[0]).getName(); char[] temp = ((PasswordCallback)callbacks[1]).getPassword(); password = new char[temp.length]; System.arraycopy(temp, 0, password, 0, temp.length); ((PasswordCallback)callbacks[1]).clearPassword(); } catch (IOException ioe) {throw new LoginException(ioe.toString()); } catch (UnsupportedCallbackException uce) {throw new LoginException(uce.toString());} if ( "joeuser".equals(username)) { if ( password.length == 5 && password[0] == 'j' && password[1] == 'o' && password[2] == 'e' && password[3] == 'p' && password[4] == 'w' ) { loginSuccess = true; clearPassword(); return true; }} else {loginSuccess = false;username = null; clearPassword(); throw new FailedLoginException(); }

65 Fejlett Programozási Technológiák 2. 65 Hozzáférési környezet Szálanként kezeljük a jogosultságot A Subject kötése a környezethez:  Object doAs(Subject subject,PrivilegedAction action)  Object doAsPrivileged(Subject, PrivilegedAction action, AccessControlContext acc) Deklaratív megoldás:  Object doAsPrivileged(Subject, PrivilegedAction action, null)

66 Fejlett Programozási Technológiák 2. 66 Program modell/ Deklaratív modell class PayrollAction implements PrivilegedAction { AccessControlContext context = AccessController.getContext(); Subject subject = Subject.getSubject(context ); if (subject == null ) {throw new AccessControlException("Denied");} Set principals = subject.getPrincipals(); Iterator iterator = principals.iterator(); while (iterator.hasNext()) { PrincipalImpl principal = (PrincipalImpl)iterator.next(); if (principal.getName().equals( "joeuser" )) {System.out.println("joeuser has Payroll access\n"); return new Integer(0);}}throw new AccessControlException("Denied"); } class PersonnelAction implements PrivilegedAction { public Object run() { AccessController.checkPermission(new PersonnelPermission("access")); System.out.println( "Subject has Personnel access\n"); return new Integer(0);}}

67 Fejlett Programozási Technológiák 2. 67 public class JAASExample { static LoginContext lc = null; public static void main( String[] args) { try { lc = new LoginContext("JAASExample",new UsernamePasswordCallbackHandler()); } catch (LoginException le) {System.out.println( "Login Context Creation Error" );System.exit(1);} try {lc.login();} catch (LoginException le) { System.exit(1); } try { Subject.doAs( lc.getSubject(), new PayrollAction() ); } catch (AccessControlException e) {System.out.println( "Payroll Access DENIED" ); } try { Subject.doAsPrivileged( lc.getSubject(), new PersonnelAction(), null ); } catch (AccessControlException e) { System.out.println( "Personnel Access DENIED" ); } try { lc.logout(); } catch (LoginException le) { System.out.println( "Logout FAILED" ); System.exit(1); } System.exit(0); } java -Djava.security.manager -Djava.security.auth.login.config==login.config -Djava.security.policy==jaas.policy JAASExample

68 Fejlett Programozási Technológiák 2. 68 JGSS GSS API (RFC2853)

69 Fejlett Programozási Technológiák 2. 69 Áttekintés

70 Fejlett Programozási Technológiák 2. 70 A mai előadás tartalma: Számítógépes biztonság Jáva és a biztonság  Biztonsági architektúra Titkosító architektúra  JCE  JAAS  JSSE  GSSE

71 Fejlett Programozási Technológiák 2. 71 A következő előadás tartalma Java Servlet  Servlet Interfész  Servlet Context  Request  Response  Filter  Session  Web Application


Letölteni ppt "1 Fejlett Programozási Technikák 2. 15/8. Fejlett Programozási Technológiák 2. 2 Az előző előadás tartalma: Java Applet  Felépítése  Tulajdonságai "

Hasonló előadás


Google Hirdetések