Biztonság java web alkalmazásokban Webalkalmazások fejlesztése tananyag Krizsán Zoltán 1 [2012. május 9.] 1 Általános Informatikai Tanszék Miskolci Egyetem 2012. május 9. Krizsán Zoltán [2012. május 9.] () 2012. május 9. 1 / 34
Általános információk Tartalom 1 Biztonság Java web alkalmazásban Általános információk Telepít leíró alapú beállítás Annotációkkal Kód alapú biztonsági ellen rzés EJB Krizsán Zoltán [2012. május 9.] () 2012. május 9. 2 / 34
Általános információk Bevezetés I Authentikáció: Ki kéri az er forrást? Authorizáció: hozzáférés szabályozás: Már tudjuk ki kéri, szabad neki? Adat integritás: Nem változott e meg az er forrás (átvitel során)? Krizsán Zoltán [2012. május 9.] () 2012. május 9. 3 / 34
Általános információk Authentikáció I 1 Névvel ellátott szerepek (role) vannak, amikben felhasználók. 2 * szerep = minden deniált szerepre illeszkedik. 3 A felhasználóknak legalább egy szerepben kell lenniük! 4 Jogokat a szerepekhez adjuk. Ha nem talál illeszked szabályt a kérésre, akkor engedélyezett! Krizsán Zoltán [2012. május 9.] () 2012. május 9. 4 / 34
Általános információk Kérés kiszolgálásának menete I 1 A szervlet konténer egy kérést kap. 2 Az URL minta alapján megkeresi az illeszked szabályokat. Ha nincs engedélyezi a kérést. Ha van szabály, akkor tovább vizsgál. Krizsán Zoltán [2012. május 9.] () 2012. május 9. 5 / 34
Általános információk Biztonsági ellenörzések koncepció I Fejleszt : logikai neveket használ Rendszergazda: Tényleges (zikai) felhasználó neveket, csoportokat használ. Rendszergazda/webapp üzemeltet : összerendeli a logikai és zikai fogalmakat. Krizsán Zoltán [2012. május 9.] () 2012. május 9. 6 / 34
Tartalom 1 Biztonság Java web alkalmazásban Általános információk Telepít leíró alapú beállítás Annotációkkal Kód alapú biztonsági ellen rzés EJB Krizsán Zoltán [2012. május 9.] () 2012. május 9. 7 / 34
Biztonsági beállítások I A szervlet konténer feladata a megfelel m velet elvégzése. Beállítása lehetséges: Deklaratív Annotációkkal Telepít leíróban(web.xml) (deklaratív) Imperatív Kód alapú Krizsán Zoltán [2012. május 9.] () 2012. május 9. 8 / 34
Authentikációs mechanizmusok I HTTP Basic Authentication HTTP Digest Authentication HTTPS Client Authentication Form Based Authentication Krizsán Zoltán [2012. május 9.] () 2012. május 9. 9 / 34
Authentikáció kiválasztása I login-cong elem a leíróban auth-method 1 NONE 2 BASIC 3 DIGEST 4 FORM 5 CLIENT-CERT realm-name: BASIC esetén ezt küldi a szerver. form-login-cong: FORM esetén a hiba és login form oldal oldalak (relatív útvonal). Krizsán Zoltán [2012. május 9.] () 2012. május 9. 10 / 34
HTTP Basic Authentication I usernév/jelszó alapú Web böngész ben beépített form jelenik meg HTTP/1.0 Nem biztonságos base64 kódolt jelszó A szerver nem hitelesített. de kiterjeszthet (https, vpn) A server egy realm (string) szöveget küld a kliensnek, hogy hova kell bejelentkeznie. BASIC</auth-method> Krizsán Zoltán [2012. május 9.] () 2012. május 9. 11 / 34
HTTP Digest Authentication I usernév/jelszó alapú Web böngész ben beépített form jelenik meg Biztonságosabb a jelszó hash-ét küldi a kliens a szervernek A szerver nem hitelesített. kiterjeszthet (https, vpn) A server egy realm (string) szöveget küld a kliensnek, hogy hova kell bejelentkeznie. DIGEST</auth-method> Krizsán Zoltán [2012. május 9.] () 2012. május 9. 12 / 34
Form Based Authentication I usernév/jelszó alapú A bejelentkez formot a web fejleszt készíti (készítheti). tartalmazni kell vezérl ket j_username és j_password nevekkel. action="j_security_check" kell legyen Telepít leíró-ban bejelentkez form, hiba oldal. Védett er forrás igénylésekor a konténer átirányít ha az ügyfél nem authentikált. Nem biztonságos base64 kódolt jelszó A szerver nem hitelesített. de kiterjeszthet (https, vpn) < form method =" POST " action =" j_security_check " > < input type =" text " name =" j_username " > < input type =" password " name =" j_password " > </ form > Krizsán Zoltán [2012. május 9.] () 2012. május 9. 13 / 34
Form alapú authentikáció beállítása I <login - config > <auth - method > FORM </ auth - method > <realm - name > file </ realm - name > <form - login - config > <form - login - page >/ login. xhtml </ form - login - page > <form - error - page >/ error. xhtml </ form - error - page > </ form - login - config > </ login - config > Krizsán Zoltán [2012. május 9.] () 2012. május 9. 14 / 34
Form alapú authentikáció forgatókönyve I Krizsán Zoltán [2012. május 9.] () 2012. május 9. 15 / 34
Form alapú authentikáció forgatókönyve II Ha a kliens nincs azonosítva, akkor 1 Egy kérés érkezik egy védett er forrásra. 2 Az er forráshoz rendelt form-ot elküldik a kliensnek, elmenti az url-t és a paramétereket. 3 A felhasználó kitölti a usernevet és jelszót. 4 A kliens visszaküldi a paramétereket a szervernek. 5 A konténer a kapott paraméterek alapján megpróbálja a klienst azonosítani. Ha sikertelen, akkor a hiba oldalra továbbít és a http válsz kód 200-as lesz. Ha sikeres (van ilyen felhasználó), akkor megvizsgálja a szerepeket hogy vajon van e joga hozzáférni. Ha minden ok, akkor az els lépésben eltárolt információk alapján átirányítja a kérést a megfelel er forrásra. Krizsán Zoltán [2012. május 9.] () 2012. május 9. 16 / 34
User/jelszó tárolása I Krizsán Zoltán [2012. május 9.] () 2012. május 9. 17 / 34
User/jelszó tárolása II A specikáció nem rögzíti a módját. A konténert implementáló alkalmazástól függ (motor). Lehet adatbázisban, saját cong le-ban,... (pl.: tomcat: <user password="tomcat" roles="tomcat,manager,admin" username="tomcat"/>) Krizsán Zoltán [2012. május 9.] () 2012. május 9. 18 / 34
falhsználó, csoport szerepre képzése I < glassfish -web - app > < security - role - mapping > <role - name > Mascot </ role - name > < principal - name > Duke </ principal - name > </ security - role - mapping > < security - role - mapping > <role - name > Admin </ role - name > <group - name > Director </ group - name > </ security - role - mapping > </ glassfish -web - app > Krizsán Zoltán [2012. május 9.] () 2012. május 9. 19 / 34
TransportGuarantee I Transport rétegnek instrukció CONFIDENTIAL: bizalmas információ, titkosítani kell INTEGRAL: nem kényes, érintetlenül kell küldeni NONE: Nem kell foglalkozni vele. 1 <user - data - constraint > 2 < transport - guarantee > CONFIDENTIAL </ transport - 3 </ user - data - constraint > Krizsán Zoltán [2012. május 9.] () 2012. május 9. 20 / 34
Kényszerek megadása (Security constraints) I security-constraint elemei web-resource-collection auth-constraint user-data-constraint Ellen rizhetjük a HTTP metódust (http-method, http-method-omission), URL mintákat (url-pattern) Krizsán Zoltán [2012. május 9.] () 2012. május 9. 21 / 34
Példa I < security - constraint > <web - resource - collection > <web - resource - name > retail </web - resource - name > <url - pattern >/ acme / retail /* </url - pattern > <http - method >GET </ http - method > <http - method > POST </ http - method > </web - resource - collection > <auth - constraint > <role - name > CONTRACTOR </ role - name > <role - name > HOMEOWNER </ role - name > </ auth - constraint > </ security - constraint > Krizsán Zoltán [2012. május 9.] () 2012. május 9. 22 / 34
Felhasználói csoport leképzése szerepre I < > < - name > BasicServlet </ - name > < - class > serlets. BServlet </ - class > < security - role - ref > <role - name > Manager </ role - name > <role - link > supervisor </ role - link > </ security - role - ref > </ > Használat szervletb l: res. getwriter (). println (" Manger isuserinrole? " + req. isuserinrole (" Manager ")); Krizsán Zoltán [2012. május 9.] () 2012. május 9. 23 / 34
Annotációk I Az osztályra, mely implementálja az -et. @ServletSecurity @HttpConstraint @HttpMethodConstraint @DeclareRoles @RunAs Krizsán Zoltán [2012. május 9.] () 2012. május 9. 24 / 34
Példa az annotációk használatára I @ ServletSecurity ( @ HttpConstraint ( EmptyRoleSemantic. DENY )) public class Example3 extends HttpServlet { } @ ServletSecurity ( @ HttpConstraint ( rolesallowed = " R1 ")) public class Example4 extends HttpServlet { } @ ServletSecurity (( htt pme thod Cons trai nts = { @HttpMethodConstraint ( value = " GET ", rolesallowed = " R1 "), transportguarantee = TransportGuarantee. CONFIDENTIAL ) }) public class Example5 extends HttpServlet { } Krizsán Zoltán [2012. május 9.] () 2012. május 9. 25 / 34
Példa II I @WebServlet ( name = " PayrollServlet ", urlpatterns = {"/ payroll " }) @ServletSecurity ( @HttpConstraint ( transportguarantee = TransportGuarantee. CONFIDENTIAL, rolesallowed = {" DEPT - ADMIN ", " DIRECTOR " }) ) public class GreetingServlet extends HttpServlet Krizsán Zoltán [2012. május 9.] () 2012. május 9. 26 / 34
Kód alapú biztonság I Deklaratív biztonság kiterjesztése HttpServletRequest interface: authenticate: a konténerben beállított mechanizmus fut le (pl. form jelenik meg). login: kapott paraméterek alapján (nincs form) logout getremoteuser: null, ha nincs user isuserinrole getuserprincipal: null, ha nincs user Krizsán Zoltán [2012. május 9.] () 2012. május 9. 27 / 34
EJB Tartalom 1 Biztonság Java web alkalmazásban Általános információk Telepít leíró alapú beállítás Annotációkkal Kód alapú biztonsági ellen rzés EJB Krizsán Zoltán [2012. május 9.] () 2012. május 9. 28 / 34
EJB Biztonsági beállítások lehet ségei I Minden esetben a metódus hívásakor a hívó kilétét ellen rzi. A hívó lehet Egy sima alkalmazás (console, swing). Egy webapp (, jsp). Másik EJB. Deklaratív telepít leíróból annotációból Kód alapú Krizsán Zoltán [2012. május 9.] () 2012. május 9. 29 / 34
EJB Biztonság beállítása telepítés leiróból Krizsán Zoltán [2012. május 9.] () 2012. május 9. 30 / 34
EJB Beállítás annotációkkal I @DeclareRoles: deniálja a használni kívánt szerepeket. A bean osztályra kell megadni. Ezek után használható a iscallerinrole(string rolename). Több esetén: @DeclareRoles("Administrator", "Manager", "Employee") @RolesAllowed: el írja a hívó kilétét Metódusra hozzáférését szabályozza. Meg lehet adni egy osztályra (ilyenkor az összes metódusára érvényes). Meg lehet adni egy vagy több metódusra. Ha az osztályra megadtuk és egy metódusra ismét megadjuk, akkor felülírja a helyi a az osztályét. a @DeclareRoles egy részhalmaza lehet csak. @PermitAll : metódusra, vagy osztályra @DenyAll : metódusra, vagy osztályra @RunAs : más jog alatt futtatja pl.: @RunAs("Admin") Krizsán Zoltán [2012. május 9.] () 2012. május 9. 31 / 34
EJB Beállítás annotációkkal példa I @DeclareRoles ({ " DEPT - ADMIN ", " DIRECTOR " }) @Stateless public class PayrollBean implements Payroll { @RolesAllowed (" DEPT - ADMIN ") public void reviewemployeeinfo ( EmplInfo info ) { // oldinfo =... read from database ; } @RolesAllowed (" DIRECTOR ") public void updateemployeeinfo ( EmplInfo info ) { // newinfo =... update database ; } } Krizsán Zoltán [2012. május 9.] () 2012. május 9. 32 / 34
EJB Kód alapú I EJBContext, HttpServletRequest interface megfelel metódusával iscallerinrole (EJBContext) getcallerprincipal (EJBContext) isuserinrole (HttpServletRequest) getuserprincipal (HttpServletRequest) Krizsán Zoltán [2012. május 9.] () 2012. május 9. 33 / 34
EJB Példa: iscallerinrole használata I @DeclareRoles (" payroll ") @Stateless public class PayrollBean implements Payroll { @Resource SessionContext ctx ; public void updateemployeeinfo ( EmplInfo info ) { oldinfo =... read from database ; // @DeclareRoles or security - role - ref in xml // who have the security role " payroll " if ( info. salary!= oldinfo. salary &&! ctx. iscallerinrole (" payroll ")) { throw new SecurityException (...) ; } } } Krizsán Zoltán [2012. május 9.] () 2012. május 9. 34 / 34