際際滷

際際滷Share a Scribd company logo
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 .

More Related Content

Mengamankan Aplikasi Java EE 6

  • 1. 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
  • 2. Prasyarat Tutorial ini menggunakan software berikut: Java EE 6 SDK ( http://java.sun.com/javaee/sdk/ )
  • 3. Netbeans IDE v 7.0.1 ( http://netbeans.org/ )
  • 4. GlassFish Application Server v 3.1.1 ( http://glassfish.java.net/ )
  • 5. Security Realm Realm file Credential pengguna di file lokal keyfile .
  • 6. Untuk koneksi non-HTTPS. Realm sertifikat Credential pengguna di database sertifikat.
  • 7. Untuk koneksi HTTPS. Realm admin Credential administrator di admin-keyfile . Realm JDBC Credential pengguna di database.
  • 8. 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
  • 9. Aplikasi Java EE Mengamankan Komponen Web dengan Realm Keamanan JDBC dan Otentikasi Berbasis Form
  • 10. Realm Keamanan JDBC Pada realm keamanan JDBC data otentikasi pengguna disimpan di database.
  • 11. Dilakukan dengan konfigurasi deployment descriptor dan konfigurasi GlassFish .
  • 12. Dan diperlukan koneksi ke database yang berisi: Tabel penyimpan username dan password .
  • 13. Tabel penyimpan group name .
  • 14. Otentikasi Berbasis Form Pada otentikasi berbasis form proses login sebagian ditangani oleh aplikasi.
  • 15. Dilakukan dengan konfigurasi deployment descriptor .
  • 16. Dan diperlukan tiga page baru: login.jsp : menampilkan form login.
  • 17. logout.jsp : untuk logout dari sistem.
  • 18. error.jsp : menampilkan pesan kesalahan login.
  • 20. Class Diagram Aplikasi terdiri atas 4 halaman JSP ( index.jsp , login.jsp , logout.jsp , error.jsp ), 1 database + security context dari web container .
  • 21. index.jsp yang menampilkan Hello World! mempunyai 1 link ke logout.jsp dan mengakses security context .
  • 22. 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.
  • 23. Sequence Diagram requestAccess : pengguna mengakses index.jsp .
  • 24. checkAuthentication : security context mengecek pengguna sudah login atau belum.
  • 25. 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 .
  • 26. consultAuthenticationData: security context me- retrieve data otentikasi dari database.
  • 27. setCredential : kalau data otentikasi valid, security context mengeset data credential pengguna di session, atau
  • 28. Sequence Diagram showError: kalau tidak valid, me-redirect ke error.jsp . Kembali ke no 3 selama data otentikasi belum valid.
  • 29. setCredential : kalau sudah login, security context mengeset data credential ke index.jsp .
  • 30. checkAuthorization : security context mengecek pengguna punya otorisasi mengakses url atau tidak.
  • 31. buildHtml : kalau pengguna punya otorisasi, security context me- redirect ke index.jsp untuk menampilkan HTML, atau
  • 32. showError : kalau tidak punya otorisasi, menampilkan pesan kesalahan.
  • 33. Mengeset Realm JDBC Membuat database penyimpan data otentikasi di MySQL.
  • 34. Membuat JDBC Connection Pools di GlassFish.
  • 35. Membuat JDBC Resources di GlassFish.
  • 36. Menambah realm JDBC di GlassFish.
  • 37. 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);
  • 38. JDBC Connection Pools Jalankan server GlassFish
  • 39. Buka konsol adminstrator: http://localhost:4848/
  • 40. Di pohon navigasi, buka node Resources -> JDBC -> JDBC Connection Pools -> New .
  • 41. Isi Pool Name : mis. SecurityPool .
  • 42. Pilih Resource Type : javax.sql.ConnectionPoolDataSource .
  • 43. Pilih Database Driver Vendor : mis. MySQL.
  • 44. Cek Ping: Enabled .
  • 45. JDBC Connection Pools Lengkapi Additional Properties DatabaseName : <nama db otentikasi>
  • 46. User : <username db otentikasi>
  • 47. Password : <password db otentikasi> Klik Finish .
  • 48. JDBC Connection Pools Pastikan bahwa JDBC driver database berada di dalam CLASSPATH .
  • 49. Untuk MySQL, download JDBC driver mysql-connector-java-5.1.15-bin.jar dari http://www.mysql.com/products/connector/
  • 50. Letakkan di dalam direktori: <GLASSFISH_HOME>/glassfish/domains/<DOMAIN_NAME>/lib/ext
  • 51. JDBC Resources Jalankan server GlassFish
  • 52. Buka konsol adminstrator: http://localhost:4848/
  • 53. Di pohon navigasi, buka node Resources -> JDBC -> JDBC Resources -> New .
  • 54. Isi JNDI Name : mis. jdbc/security .
  • 55. Pilih Pool Name : mis. SecurityPool .
  • 56. Isi Description : mis. Database for credential data.
  • 57. Klik OK .
  • 58. JDBC Realm Jalankan server GlassFish
  • 59. Buka konsol adminstrator: http://localhost:4848/
  • 60. Di pohon navigasi, buka node Configurations -> server-config -> Security -> Realms.
  • 61. Klik New untuk membuat realm baru .
  • 62. Isi Name : mis. jdbc .
  • 63. Pilih Class name : ~ .JDBCRealm .
  • 64. Isi properties seperti di halaman berikut .
  • 65. Klik OK .
  • 66. Properties JDBC Realm JAAS Context: jdbcRealm
  • 68. User Table: usertable
  • 69. User Name Column: username
  • 70. Password Column: password
  • 71. Group Table: grouptable
  • 72. Group Name Column: groupname
  • 75. Mengeset Otentikasi Berbasis Form Membuat direktori target ( jdbc ), jdbc/index.jsp , login.jsp , logout.jsp dan error.jsp .
  • 76. Menambah users ke tabel usertable: username=praz.jdbc .
  • 78. Menambah security roles: JdbcRole.
  • 79. Menambah security constraints: JdbcConstraint.
  • 80. Memetakan Role -> Users / Groups: JdbcRole -> praz.jdbc, FormRole -> praz.jdbc.
  • 81. Menambah Users ke Tabel Usertable Menambah users ke tabel usertable: - username=praz.jdbc - password=praz2010 yang dienkripsi dengan fungsi MD5 .
  • 82. Menambah groups ke tabel grouptable: - username=praz.jdbc - groupname=pengguna .
  • 83. Membuat Direktori Target Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 84. Klik kanan Web Pages -> New -> Folder ...
  • 85. Beri nama jdbc direktori yang akan diamankan.
  • 86. Copy file index.jsp ke dalam direktori jdbc .
  • 87. Modifikasi isinya untuk menampilkan username yang sedang login.
  • 88. 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>
  • 89. 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>
  • 90. Membuat login.jsp , logout.jsp dan error.jsp Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 91. Buat login.jsp , logout.jsp dan error.jsp di luar direktori jdbc .
  • 92. Klik kanan Web Pages -> New -> JSP ...
  • 93. Isi file name: login.jsp , klik Finish .
  • 94. Begitu juga untuk membuat logout.jsp dan error.jsp .
  • 95. Form Login Dengan login.jsp Sesuai spesifikasi servlet, form login harus dibuat dengan: Method: POST
  • 97. 2 paramater: j_username dan j_password Web container akan menggunakan info ini untuk melakukan otentikasi.
  • 98. 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>
  • 99. 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>
  • 100. Halaman Logout logout.jsp Karena informasi login tersimpan di session, proses logout dapat dilakukan dengan cara mengakhiri session.
  • 101. Di JSP terdapat variabel session yang menyimpan obyek session.
  • 102. Untuk mengakhirinya digunakan metoda invalidate .
  • 103. 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>
  • 104. 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>
  • 105. Menentukan Realm dan Mekanisme Otentikasi Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 106. Di Projects Explorer , buka node Web Pages -> WEB-INF
  • 107. Buka file web.xml , klik tab Security
  • 108. Buka node Login Configuration , pilih Form
  • 109. Isi login page: /login.jsp , error page: /error.jsp , realm name : jdbc
  • 110. 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>
  • 111. Menambah Security Roles Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 112. Di Projects Explorer , buka node Web Pages -> WEB-INF
  • 113. Buka file web.xml
  • 114. Klik tab Security
  • 115. Buka node Security Roles , klik Add..
  • 116. Isi Role Name dan Description Role name tanpa spasi, mis. JdbcRole Klik OK
  • 117. 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>
  • 118. Menambah Security Constraints Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 119. Di Projects Explorer , buka node Web Pages -> WEB-INF
  • 120. Buka file web.xml
  • 121. Klik tab Security
  • 122. Di folder Security Constraints klik Add Security Constraints
  • 123. Isi Display Name
  • 124. Menambah Security Constraints Di kolom Web Resource Collection klik Add..
  • 125. Isi Resource Name , Description , dan URL Pattern(s) URL pattern: bagian berwarna biru htpp://hostname:port/root /jdbc/* Pilih HTTP Method(s) , klik OK
  • 126. Cek Enable Authentication Constraint
  • 127. Isi Description dan Role Name(s): JdbcRole
  • 128. Cek Enable User Data Constraint
  • 129. Pilih Transport Guarantee: CONFIDENTIAL untuk meng-enkripsi username dan password dengan HTTPS .
  • 130. 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>
  • 131. 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>
  • 132. Menambah security constraints Deployment descriptor standar komponen web: <project-dir>/web/WEB-INF/web.xml </security-constraint> ... </web-app>
  • 133. Memetakan Role -> Users/Groups Jalankan Netbeans, buka modul web HelloEnterprise-war
  • 134. Di Projects Explorer , buka node Web Pages -> WEB-INF
  • 135. Buka file glassfish-web.xml , klik tab Security
  • 136. Buka node JdbcRole dan FormRole , klik Add Principal...
  • 137. Isi Principal Name : username pengguna GlassFish (mis. praz.jdbc )
  • 139. 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>
  • 140. 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>
  • 141. Mendeploy HelloEnterprise Di Project Explorer klik kanan project HelloEnterprise -> Deploy .
  • 142. Untuk membuka aplikasi, akses URL http://localhost:8080/HelloEnterprise-war/jdbc .
  • 143. Otentikasi Berbasis Form Isi username dan password yang telah dipetakan ke role JdbcRole
  • 145. 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 .
  • 146. 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 .
  • 147. Skenario Pengujian Ketiga pengguna harus dapat melakukan otentikasi.
  • 148. Username 'praz.basic' harus dapat mengakses direktori /basic tapi tidak dapat mengakses direktori /form dan /jdbc .
  • 149. Username 'praz.form' harus dapat mengakses direktori /form tapi tidak dapat mengakses direktori /basic dan /jdbc .
  • 150. Username 'praz.jdbc' harus dapat mengakses direktori /form dan /jdbc tapi tidak dapat mengakses direktori /basic .
  • 151. Username 'praz.unknown' yang tidak terdaftar harus gagal melakukan otentikasi.
  • 152. Menambah Users ke Tabel Usertable Untuk skenario ini user praz.basic dan praz.form juga harus ditambah ke database.
  • 153. Menambah users ke tabel usertable: - username=praz.basic dan praz.form - password=praz2010 yang dienkripsi dengan fungsi MD5 .
  • 154. Menambah groups ke tabel grouptable: - username=praz.basic dan praz.form - groupname=pengguna .
  • 155. 'praz.basic' Mengakses Direktori /basic
  • 156. 'praz.basic' Gagal Mengakses Direktori /form dan /jdbc
  • 157. 'praz.form' Mengakses Direktori /form
  • 158. 'praz.form' Gagal Mengakses Direktori /basic dan /jdbc
  • 159. 'praz.jdbc' Mengakses Direktori /form dan /jdbc
  • 160. 'praz.jdbc' Gagal Mengakses Direktori /basic
  • 162. Referensi The Java EE 6 Tutorial - Part VII Security ( http://download.oracle.com/javaee/6/tutorial/doc/gijrp.html )
  • 163. Shing Wai Chan's Weblog - JDBCRealm in GlassFish: http://blogs.oracle.com/swchan/entry/jdbcrealm_in_glassfish