Web Application Security Made Easy with JBoss, Seam, and Hibernate
Download
Report
Transcript Web Application Security Made Easy with JBoss, Seam, and Hibernate
Web Application Security Made Easy
With JBoss, Seam, and Hibernate
PRESENTED BY CHRIS ANDERSON
DECEMBER 10, 2008
Outline
The Goal
Technologies used
Prerequisites
Database creation
Application generation
Application configuration
Additional security measures
What’s next?
Conclusion
The Goal
Create a secure web application in under 30
minutes
Authenticate users
Role-base validation
Protect against SQL injection
Protect against XSS
Enable SSL
Technologies Used
Microsoft SQL Server 2005
JBoss 4.2.0 Application Server
JBoss Seam 2.0.2 Web Framework
Hibernate
Apache Ant
Eclipse development environment (recommended)
Prerequisites
JBoss
Seam
SQL Server
Ant
Java 1.6
Database Creation
Create users
JBoss user
Application user
Create Tables
User, Role, User_Role
Stored Procedures
Create user
Change Password
Application Generation
C:\jboss-seam-2.0.2.SP1>seam setup
[input] Enter your Java project workspace (the directory that contains your
Seam projects) [c:/Projects]
[input] Enter your JBoss home directory [C:/jboss/jbossEP-4.2.0.GA/jboss-as]
[input] Enter the project name [testproject]
[input] Do you want to use ICEFaces instead of RichFaces [n] (y, [n])
[input] Select a RichFaces skin [classic] (blueSky, [classic], ruby, wine, d
eepMarine, emeraldTown, sakura, DEFAULT)
[input] Is this project deployed as an EAR (with EJB components) or a WAR (w
ith no EJB support) [ear] ([ear], war)
[input] Enter the Java package name for your session beans [com.uccs.itapps.
testproject.beans.session]
Application Generation
[input] Enter the Java package name for your entity beans [com.uccs.itapps.t
estproject.beans.entity] [
[input] Enter the Java package name for your test cases [com.uccs.itapps.tes
tproject.testcases]
[input] What kind of database are you using? [mssql] (hsql, mysql, oracle, p
ostgres, [mssql], db2, sybase, enterprisedb, h2)
[input] Enter the Hibernate dialect for your database [org.hibernate.dialect
.SQLServerDialect]
[input] Enter the filesystem path to the JDBC driver jar [C:\Program Files\M
icrosort SQL Server 2005 JDBC Driver\sqljdbc_1.2\enu\sqljdbc.jar]
[input] Enter JDBC driver class for your database [com.microsoft.sqlserver.j
dbc.SQLServerDriver]
[input] Enter the JDBC URL for your database [jdbc:sqlserver://localhost]
Application Generation
[input] Enter database username [testdbuser]
[input] Enter database password [testdbuser]
[input] Enter the database schema name (it is OK to leave this blank) [TESTDB]
[input] Enter the database catalog name (it is OK to leave this blank) []
[input] Are you working with tables that already exist in the database? [y] ([y], n)
[input] Do you want to drop and recreate the database tables and data in imp
ort.sql each time you deploy? [n] (y, [n])
C:\jboss-seam-2.0.2.SP1>seam new-project
Building the Application
C:\Projects\demoproject>ant deploy
Application Configuration
Modify the datasource xml file
Change
<connection-url>
jdbc:sqlserver://localhost
</connection-url>
To
<connection-url>
jdbc:sqlserver://127.0.0.1:50853;databaseName=TESTDB
</connection-url>
Start JBoss
C:\jboss\jbossEP-4.2.0.GA2\jboss-as\bin\run.bat -c default
Authentication
Add entity beans for database tables
Modify authentication bean for user validation
Authentication
User user = (User) em.createQuery("from User where username = :username and
password = :password")
.setParameter("username", identity.getUsername())
.setParameter("password", getHashedPwd(identity.getPassword()))
.getSingleResult();
if(user.getRoles() != null){
for(Role mr : user.getRoles()){
System.out.println("adding role: " + mr.getRoleName());
identity.addRole(mr.getRoleName());
}
}
Role-Based Security
Create Administration page
Create Link for Administration page on menu
<s:link view="/admin.xhtml" action="administration" value="Administration"
rendered="#{identity.loggedIn && s:hasRole('ADMIN')}"/>
Modify pages.xml
<page view-id="/admin.xhtml" login-required="true">
<restrict>#{s:hasRole('ADMIN')}</restrict>
</page>
SSL
Create a self-signed certificate using Java keytool
keytool -genkey -alias tomcat -keyalg RSA
Copy the generated .keystore file to the JBoss conf
directory
Modify the tomcat server.xml file
SSL
<!--Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" /-->
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="${jboss.server.home.dir}/conf/testproject.keystore"
keystorePass=“Pass_1" />
What’s Next
Install SSL certificate
Configure SQL Server or create firewall rules to
block anonymous access to the database server
Conclusion
Web application security can be easy
Thanks for listening
Any questions?