Fejlett Programoz ási Technikák 2.
description
Transcript of Fejlett Programoz ási Technikák 2.
1
Fejlett Programozási Technikák 2.
15/8
2
Fejlett Programozási Technológiák 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.
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.
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.
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.
Támadás típusok Kategóriák:
Titkosság elleni támadás Integritás elleni támadásRendelkezé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.
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.
Jáva támadások1. Trükkös kód2. Régi, hack-elt javac3. Class fájlok átírása (CGI
jogosultságok)4. Programok válogatása5. Kapcsolat eltérítése
(spoofing) (aláírt applet)6. JVM bug
9
Fejlett Programozási Technológiák 2.
Áttekintés
10
Fejlett Programozási Technológiák 2.
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.
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.
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.
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.
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.javapublic 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_01 invokespecial #9 <Method java.applet.Applet()>4 returnMethod int add()0 iconst_31 istore_02 iconst_43 istore_14 iload_05 iload_16 iadd7 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.
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.
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.
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.
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.
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.SecurityManagerBiztonsági rendszabály alapú (policy based)
Természetesen ez is bővíthető
20
Fejlett Programozási Technológiák 2.
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.
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.
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.
Védelmi tartomány
Rendszer Tartomány Alkalmazás tartományok
PrincipalPolicy fájlgrant 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.
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.
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.
Áttekintés
27
Fejlett Programozási Technológiák 2.
Eszközök Jar Jarsigner Keytool
Keystore policytool
28
Fejlett Programozási Technológiák 2.
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.
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.
J2SE 1.5 biztonsági eszközök JCA/JCE JSSE Java CertPath JAAS/JGSS
31
Fejlett Programozási Technológiák 2.
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.
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.
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.
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.
Példa MACimport 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.
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.
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. 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.
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. 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.
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.
Példaimport 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.
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.
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.
HasználataC:\Documents and Settings\bilickiv.INFORM>keytool -genkey -v -alias Vili -keyalg RSAEnter keystore password: jelszóWhat is your first and last name? [Unknown]: Vilmos BilickiWhat is the name of your organizational unit? [Unknown]: SZTEWhat is the name of your organization? [Unknown]: InfTSZCSWhat is the name of your City or Locality? [Unknown]: SzegedWhat is the name of your State or Province? [Unknown]: CsongrádWhat is the two-letter country code for this unit? [Unknown]: HUIs 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 <Vili> (RETURN if same as keystore password): jelszó[Saving C:\Documents and Settings\bilickiv.INFORM\.keystore]
46
Fejlett Programozási Technológiák 2.
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.
Certification Path API
import java.security.*;import java.security.cert.*;// CertificateFactory for X.509CertificateFactory cf =CertificateFactory.getInstance("X.509");// Obtain CertPathValidator CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
// Set the Trust anchorTrustAnchor anchor = new TrustAnchor((X509Certificate)cf.getCertificate("ca"),null);PKIXParameters params = new PKIXParameters(Collections.singleton(anchor));// Revocation as falseparams.setRevocationEnabled(false);// ValidatePKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)cpv.validate(cp, params);
48
Fejlett Programozási Technológiák 2.
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.
Java Secure Socket Extension
Jáva SSL megvalósítás Vég-vég biztonságimport 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. 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("<HTML><HEAD><TITLE>HTTPS Server Example</TITLE>" +"</HEAD><BODY><H1>Hello World!</H1></BODY></HTML>\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.
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.
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óakKönnyen bővíthetőek
Login konfigurációs fájl
53
Fejlett Programozási Technológiák 2.
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.KeyStoreLoginModule 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.
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.
JAAS példa
// Example Java 2 Security Policy Entrygrant Codebase "www.sun.com", Signedby "duke" {FilePermission "/cdrom/-", "read"; }// Example JAAS Security Policy Entrygrant Codebase "www.sun.com", Signedby "duke", Principal com.sun.Principal "charlie" {FilePermission "/cdrom/charlie/-", "read"; }
// Example login module configuration entryLogin2 {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 contextLoginContext ctx = new LoginContext ("name", CallbackHandler);// Authenicate the subjectctx.login();// Retrieve authenticated subjectSubject sub = ctx.getSubject();// Enforce Access ControlsSubject.doAs(sub, action);
56
Fejlett Programozási Technológiák 2.
Példa
57
Fejlett Programozási Technológiák 2.
PrincipalImplimport 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.
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.
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.
Callback handler Feladata a megfelelő információ beszerzése javax.security.auth.callback.CallbackHandler Elemei:
NameCallbackPasswordCallbackTextInputCallbackTextOutputCallbackLanguageCallbackChoiceCallbackConfirmationCallback
61
Fejlett Programozási Technológiák 2. import java.io.*;import java.security.*;import javax.security.auth.*;import javax.security.auth.callback.*;UsernamePasswordCallbackHandler implements CallbackHandler {public void handle(Callback[] callbacks) throwsUnsupportedCallbackException, 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, "UnsupportedCallback Type");}}}}
62
Fejlett Programozási Technológiák 2.
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. 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. 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.
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.
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. 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.
JGSS GSS API (RFC2853)
69
Fejlett Programozási Technológiák 2.
Áttekintés
70
Fejlett Programozási Technológiák 2.
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.
A következő előadás tartalma Java Servlet
Servlet InterfészServlet ContextRequestResponseFilterSessionWeb Application