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

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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Áttekintés

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

28 Fejlett Programozási Technológiák 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 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 J2SE 1.5 biztonsági eszközök JCA/JCE JSSE Java CertPath JAAS/JGSS

31 Fejlett Programozási Technológiák 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 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 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 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 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 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 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 – 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Példa

57 Fejlett Programozási Technológiák 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 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 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 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 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

62 Fejlett Programozási Technológiák 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 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 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(); }

66 Fejlett Programozási Technológiák 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 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 JGSS GSS API (RFC2853)

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

70 Fejlett Programozási Technológiák 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 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