Mengamankan Aplikasi Java EE 6
Upcoming SlideShare
Loading in...5
×
 

Mengamankan Aplikasi Java EE 6

on

  • 964 views

Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form

Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form

Statistics

Views

Total Views
964
Views on SlideShare
964
Embed Views
0

Actions

Likes
1
Downloads
12
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Mengamankan Aplikasi Java EE 6 Mengamankan Aplikasi Java EE 6 Presentation Transcript

  • Mengamankan Aplikasi Java EE 6 Bowo Prasetyo Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form 3 Desember 2011 http://www.scribd.com/prazjp http://www.slideshare.net/bowoprasetyo
  • Prasyarat
    • Tutorial ini menggunakan software berikut:
      • Java EE 6 SDK ( http://java.sun.com/javaee/sdk/ )
      • Netbeans IDE v 7.0.1 ( http://netbeans.org/ )
      • GlassFish Application Server v 3.1.1 ( http://glassfish.java.net/ )
  • Security Realm
    • Realm file
      • Credential pengguna di file lokal keyfile .
      • Untuk koneksi non-HTTPS.
    • Realm sertifikat
      • Credential pengguna di database sertifikat.
      • Untuk koneksi HTTPS.
    • Realm admin
      • Credential administrator di admin-keyfile .
    • Realm JDBC
      • Credential pengguna di database.
  • Mekanisme Otentikasi
    • Otentikasi dasar HTTP
      • Username dan password di form default
    • Otentikasi berbasis form
      • Form data otentikasi dapat dikustomisasi
    • Otentikasi digest
      • Otentikasi dasar dengan password terenkripsi
    • Otentikasi klien
      • Server mengotentikasi klien dengan public key
    • Otentikasi mutualisme
      • Server dan klien saling mengotentikasi
  • Aplikasi Java EE Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form
  • Realm Keamanan JDBC
    • Pada realm keamanan JDBC data otentikasi pengguna disimpan di database.
    • Dilakukan dengan konfigurasi deployment descriptor dan konfigurasi GlassFish .
    • Dan diperlukan koneksi ke database yang berisi:
      • Tabel penyimpan username dan password .
      • Tabel penyimpan group name .
  • Otentikasi Berbasis Form
    • Pada otentikasi berbasis form proses login sebagian ditangani oleh aplikasi.
    • Dilakukan dengan konfigurasi deployment descriptor .
    • Dan diperlukan tiga page baru:
      • login.jsp : menampilkan form login.
      • logout.jsp : untuk logout dari sistem.
      • error.jsp : menampilkan pesan kesalahan login.
  • Otentikasi Berbasis Form
  • Class Diagram
    • Aplikasi terdiri atas 4 halaman JSP ( index.jsp , login.jsp , logout.jsp , error.jsp ), 1 database + security context dari web container .
    • index.jsp yang menampilkan “Hello World!“ mempunyai 1 link ke logout.jsp dan mengakses security context .
    • Security context me- redirect ke login.jsp yang berisi form login kalau pengguna belum login, atau ke error.jsp kalau pengguna gagal login, dan juga mengakses database.
  • Sequence Diagram
    • requestAccess : pengguna mengakses index.jsp .
    • checkAuthentication : security context mengecek pengguna sudah login atau belum.
    • 4.requestAuthenticationData : kalau belum login, security context me- redirect ke login.jsp untuk menampilkan form login.
    • supplyAuthenticationData : pengguna men- submit data login ke security context .
    • consultAuthenticationData: security context me- retrieve data otentikasi dari database.
    • setCredential : kalau data otentikasi valid, security context mengeset data credential pengguna di session, atau
  • Sequence Diagram
    • showError: kalau tidak valid, me-redirect ke error.jsp . Kembali ke no 3 selama data otentikasi belum valid.
    • setCredential : kalau sudah login, security context mengeset data credential ke index.jsp .
    • checkAuthorization : security context mengecek pengguna punya otorisasi mengakses url atau tidak.
    • buildHtml : kalau pengguna punya otorisasi, security context me- redirect ke index.jsp untuk menampilkan HTML, atau
    • showError : kalau tidak punya otorisasi, menampilkan pesan kesalahan.
  • Mengeset Realm JDBC
    • Membuat database penyimpan data otentikasi di MySQL.
    • Membuat JDBC Connection Pools di GlassFish.
    • Membuat JDBC Resources di GlassFish.
    • Menambah realm JDBC di GlassFish.
  • Database Otentikasi create table usertable(username varchar(10) not null, password varchar(32) not null, primary key(username)); create table grouptable(username varchar(10) not null, groupname varchar(20) not null, primary key(username, groupname)); alter table grouptable add constraint FK_USERNAME foreign key(username) references usertable(username);
  • JDBC Connection Pools
    • Jalankan server GlassFish
    • Buka konsol adminstrator: http://localhost:4848/
    • Di pohon navigasi, buka node Resources -> JDBC -> JDBC Connection Pools -> New .
    • Isi Pool Name : mis. SecurityPool .
    • Pilih Resource Type : javax.sql.ConnectionPoolDataSource .
    • Pilih Database Driver Vendor : mis. MySQL.
    • Cek Ping: Enabled .
  • JDBC Connection Pools
    • Lengkapi “ Additional Properties ”
      • DatabaseName : <nama db otentikasi>
      • User : <username db otentikasi>
      • Password : <password db otentikasi>
    • Klik Finish .
  • JDBC Connection Pools
    • Pastikan bahwa JDBC driver database berada di dalam CLASSPATH .
    • Untuk MySQL, download JDBC driver mysql-connector-java-5.1.15-bin.jar dari http://www.mysql.com/products/connector/
    • Letakkan di dalam direktori: <GLASSFISH_HOME>/glassfish/domains/<DOMAIN_NAME>/lib/ext
  • JDBC Resources
    • Jalankan server GlassFish
    • Buka konsol adminstrator: http://localhost:4848/
    • Di pohon navigasi, buka node Resources -> JDBC -> JDBC Resources -> New .
    • Isi JNDI Name : mis. jdbc/security .
    • Pilih Pool Name : mis. SecurityPool .
    • Isi Description : mis. Database for credential data.
    • Klik OK .
  • JDBC Realm
    • Jalankan server GlassFish
    • Buka konsol adminstrator: http://localhost:4848/
    • Di pohon navigasi, buka node Configurations -> server-config -> Security -> Realms.
    • Klik New untuk membuat realm baru .
    • Isi Name : mis. jdbc .
    • Pilih Class name : ~ .JDBCRealm .
    • Isi properties seperti di halaman berikut .
    • Klik OK .
  • Properties JDBC Realm
    • JAAS Context: jdbcRealm
    • JNDI: jdbc/security
    • User Table: usertable
    • User Name Column: username
    • Password Column: password
    • Group Table: grouptable
    • Group Name Column: groupname
    • Digest Algorithm: MD5
    • Encoding: Hex
  • Mengeset Otentikasi Berbasis Form
    • Membuat direktori target ( jdbc ), jdbc/index.jsp , login.jsp , logout.jsp dan error.jsp .
    • Menambah users ke tabel usertable: username=praz.jdbc .
    • Menentukan mekanisme otentikasi: “ form-based” .
    • Menambah security roles: “JdbcRole”.
    • Menambah security constraints: “JdbcConstraint”.
    • Memetakan Role -> Users / Groups: “JdbcRole -> praz.jdbc”, “FormRole -> praz.jdbc”.
  • Menambah Users ke Tabel Usertable
    • Menambah users ke tabel usertable: - username=praz.jdbc - password=praz2010 yang dienkripsi dengan fungsi MD5 .
    • Menambah groups ke tabel grouptable: - username=praz.jdbc - groupname=pengguna .
  • Membuat Direktori Target
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Klik kanan Web Pages -> New -> Folder ...
    • Beri nama “ jdbc ” ← direktori yang akan diamankan.
    • Copy file “ index.jsp ” ke dalam direktori “ jdbc ”.
    • Modifikasi isinya untuk menampilkan username yang sedang login.
  • Komponen Teramankan “ index.jsp ”
    • Komponen web teramankan “ index.jsp ” di direktori “ jdbc ”
    <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <% String username = ((HttpServletRequest)pageContext.getRequest()).getUserPrincipal().getName(); %> <!DOCTYPE html>
  • Komponen Teramankan “ index.jsp ” <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;> <title>Otentikasi Berbasis Form dengan Realm JDBC untuk JSP</title> </head> <body> <h1>Hello <%= username %>!</h1> <a href=&quot;../logout.jsp&quot;>Logout</a> </body> </html>
  • Membuat login.jsp , logout.jsp dan error.jsp
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Buat login.jsp , logout.jsp dan error.jsp di luar direktori jdbc .
    • Klik kanan Web Pages -> New -> JSP ...
    • Isi file name: login.jsp , klik Finish .
    • Begitu juga untuk membuat logout.jsp dan error.jsp .
  • Form Login Dengan login.jsp
    • Sesuai spesifikasi servlet, form login harus dibuat dengan:
      • Method: POST
      • Action: j_security_check
      • 2 paramater: j_username dan j_password
    • Web container akan menggunakan info ini untuk melakukan otentikasi.
  • Form Login Dengan login.jsp <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <!DOCTYPE html> <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;> <title>Halaman Login</title> </head> <body> <h1>Halaman Login</h1>
  • Form Login Dengan login.jsp <form method=&quot;POST&quot; action=&quot;j_security_check&quot;> <ul> <li>Username: <input type=&quot;text&quot; name=&quot;j_username&quot; /></li> <li>Password: <input type=&quot;password&quot; name=&quot;j_password&quot; /></li> </ul> <input type=&quot;submit&quot; value=&quot;Login&quot; /> </form> </body> </html>
  • Halaman Logout logout.jsp
    • Karena informasi login tersimpan di session, proses logout dapat dilakukan dengan cara mengakhiri session.
    • Di JSP terdapat variabel session yang menyimpan obyek session.
    • Untuk mengakhirinya digunakan metoda invalidate .
  • Halaman Logout logout.jsp <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <% session.invalidate(); %> <!DOCTYPE html> <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;> <title>Halaman Logout</title> </head> <body> <h1>Anda telah logout!</h1> <a href=&quot;index.jsp&quot;>Kembali ke halaman depan</a> </body> </html>
  • Halaman Error error.jsp <%@page contentType=&quot;text/html&quot; pageEncoding=&quot;UTF-8&quot;%> <!DOCTYPE html> <html> <head> <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;> <title>Halaman Kesalahan Login</title> </head> <body> <h1>Ada kesalahan login!</h1> <a href=&quot;index.jsp&quot;>Kembali ke halaman depan</a> </body> </html>
  • Menentukan Realm dan Mekanisme Otentikasi
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Di Projects Explorer , buka node Web Pages -> WEB-INF
    • Buka file “ web.xml ”, klik tab “ Security ”
    • Buka node “ Login Configuration ”, pilih “ Form ”
    • Isi login page: /login.jsp , error page: /error.jsp , realm name : jdbc
  • Menentukan Realm dan Mekanisme Otentikasi
    • Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml
    <web-app> ... <login-config> <auth-method>FORM</auth-method> <realm-name>jdbc</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> </login-config> ... </web-app>
  • Menambah Security Roles
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Di Projects Explorer , buka node Web Pages -> WEB-INF
    • Buka file “ web.xml ”
    • Klik tab “ Security ”
    • Buka node “ Security Roles ”, klik “ Add.. ”
    • Isi “ Role Name ” dan “ Description ”
      • Role name tanpa spasi, mis. JdbcRole
    • Klik “OK”
  • Menambah security roles
    • Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml
    <web-app> ... <security-role> <description>Has access for JDBC security realm.</description> <role-name>JdbcRole</role-name> </security-role> ... </web-app>
  • Menambah Security Constraints
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Di Projects Explorer , buka node Web Pages -> WEB-INF
    • Buka file “ web.xml ”
    • Klik tab “ Security ”
    • Di folder “ Security Constraints ” klik “ Add Security Constraints ”
    • Isi “ Display Name ”
  • Menambah Security Constraints
    • Di kolom “ Web Resource Collection ” klik “Add..”
    • Isi “ Resource Name ”, “ Description ”, dan “ URL Pattern(s) ”
      • URL pattern: bagian berwarna biru htpp://hostname:port/root /jdbc/*
    • Pilih “ HTTP Method(s) ”, klik “OK”
    • Cek “ Enable Authentication Constraint ”
    • Isi “ Description ” dan “ Role Name(s): JdbcRole ”
    • Cek “ Enable User Data Constraint ”
    • Pilih Transport Guarantee: “ CONFIDENTIAL ” untuk meng-enkripsi username dan password dengan HTTPS .
  • Menambah security constraints
    • Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml
    <web-app> ... <security-constraint> <display-name>JdbcConstraint</display-name> <web-resource-collection> <web-resource-name>JdbcDirectory</web-resource-name> <description>JDBC directory</description> <url-pattern>/jdbc/*</url-pattern> </web-resource-collection>
  • Menambah security constraints
    • Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml
    <auth-constraint> <description>Only JdbcRole is allowed to access.</description> <role-name>JdbcRole</role-name> </auth-constraint> <user-data-constraint> <description>Confidential user data</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>
  • Menambah security constraints
    • Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml
    </security-constraint> ... </web-app>
  • Memetakan Role -> Users/Groups
    • Jalankan Netbeans, buka modul web HelloEnterprise-war
    • Di Projects Explorer , buka node Web Pages -> WEB-INF
    • Buka file “ glassfish-web.xml ”, klik tab “ Security”
    • Buka node JdbcRole dan FormRole , klik “ Add Principal... ”
    • Isi Principal Name : username pengguna GlassFish (mis. praz.jdbc )
    • Klik OK
  • Memetakan Role -> Users/Groups
    • Deployment descriptor glassfish komponen web: <project-dir>/web/WEB-INF/glassfish-web.xml
    <glassfish-web-app> ... <security-role-mapping> <role-name>JdbcRole</role-name> <principal-name>praz.jdbc</principal-name> </security-role-mapping>
  • Memetakan Role -> Users/Groups
    • Deployment descriptor glassfish komponen web: <project-dir>/web/WEB-INF/glassfish-web.xml
    <security-role-mapping> <role-name>FormRole</role-name> <principal-name>praz.form</principal-name> <principal-name>praz.jdbc</principal-name> </security-role-mapping> ... </glassfish-web-app>
  • Mendeploy HelloEnterprise
    • Di Project Explorer klik kanan project HelloEnterprise -> Deploy .
    • Untuk membuka aplikasi, akses URL http://localhost:8080/HelloEnterprise-war/jdbc .
  • Otentikasi Berbasis Form
    • Isi username dan password yang telah dipetakan ke role JdbcRole
  • Aplikasi HelloEnterprise Teramankan
  • Skenario Pengujian
    • Pada tutorial sebelumnya, sudah dibuat dengan realm file :
      • username: 'praz.basic' dan dipetakan hanya ke peran 'BasicRole' yang diberi akses hanya ke direktori /basic .
      • username: 'praz.form' dan dipetakan hanya ke peran 'FormRole' yang diberi akses hanya ke direktori /form .
    • Pada tutorial sekarang, dibuat dengan realm jdbc :
      • username: 'praz.jdbc' dan dipetakan ke peran 'JdbcRole' yang diberi akses hanya ke direktori /jdbc , dan ke peran 'FormRole' yang diberi akses hanya ke direktori /form .
  • Skenario Pengujian
    • Ketiga pengguna harus dapat melakukan otentikasi.
    • Username 'praz.basic' harus dapat mengakses direktori /basic tapi tidak dapat mengakses direktori /form dan /jdbc .
    • Username 'praz.form' harus dapat mengakses direktori /form tapi tidak dapat mengakses direktori /basic dan /jdbc .
    • Username 'praz.jdbc' harus dapat mengakses direktori /form dan /jdbc tapi tidak dapat mengakses direktori /basic .
    • Username 'praz.unknown' yang tidak terdaftar harus gagal melakukan otentikasi.
  • Menambah Users ke Tabel Usertable
    • Untuk skenario ini user praz.basic dan praz.form juga harus ditambah ke database.
    • Menambah users ke tabel usertable: - username=praz.basic dan praz.form - password=praz2010 yang dienkripsi dengan fungsi MD5 .
    • Menambah groups ke tabel grouptable: - username=praz.basic dan praz.form - groupname=pengguna .
  • 'praz.basic' Mengakses Direktori /basic
  • 'praz.basic' Gagal Mengakses Direktori /form dan /jdbc
  • 'praz.form' Mengakses Direktori /form
  • 'praz.form' Gagal Mengakses Direktori /basic dan /jdbc
  • 'praz.jdbc' Mengakses Direktori /form dan /jdbc
  • 'praz.jdbc' Gagal Mengakses Direktori /basic
  • 'praz.unknown' Gagal Melakukan Otentikasi
  • Referensi
    • The Java EE 6 Tutorial - Part VII Security ( http://download.oracle.com/javaee/6/tutorial/doc/gijrp.html )
    • Shing Wai Chan's Weblog - JDBCRealm in GlassFish: http://blogs.oracle.com/swchan/entry/jdbcrealm_in_glassfish