2014年8月7日星期四

EAP_012:加密数据源口令(EAP 5.1.2)

运行环境:JBoss EAP 5.1.2 + Oracle Database XE 11gR2


默认情况下,配置数据源的口令是明文的,这很不安全。
本文介绍如何在JBoss EAP 5.1.2 中加密数据源口令,之所以使用 EAP 5.1.2,是因为客户使用的是这个版本。

1. 启动JBoss  EAP 5.1.2 
cd jboss-eap-5.1/jboss-as/bin, 运行./run.sh。
注意,JBoss EAP 5.1.2 需要运行在 JDK6 环境中,因此需要先安装和设置好JDK 6。

2.  进入控制台:http://localhost:8080/admin-console/
管理员账户/口令:admin/admin
如果无法登录,编辑 jboss-eap-5.1/jboss-as/server/default/conf/props/jmx-console-users.properties,去掉#admin=admin这一行前面的#。

3. 配置未加密口令的Oracle 数据源

(1)在 jboss-eap-5.1/jboss-as/server/default/deploy 目录下创建oracle-ds.xml文件,内容如下:
 <?xml version="1.0" encoding="UTF-8"?>
<datasources>
    <local-tx-datasource>
        <jndi-name>OracleDSDemo</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.0.104:1521:XE</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>demo</user-name>
        <password>demo</password>
        <metadata>
            <type-mapping>Oracle11g</type-mapping>
        </metadata>
    </local-tx-datasource>      
</datasources> 

(2)复制 ojdbc6.jar 到 jboss-eap-5.1/jboss-as/common/lib 目录下。

(3)重启 JBoss EAP 5.1.2,访问DataSource,选择OracleDSDemo,点击Test Connection,确认连接成功。
如果连接不成功,在启动的console中会报告类似如下的错误信息:
Caused by: java.sql.SQLException: ORA-01017: invalid username/password; logon denied

4. 配置加密口令的Oracle 数据源
在上一步做成功的基础上,才可以做这一步。
(1)生成口令的密文:
java -cp /Users/maping/Redhat/Eap/jboss-eap-5.1/jboss-as/lib/jboss-jmx.jar:/Users/maping/Redhat/Eap/jboss-eap-5.1/jboss-as/lib/jboss-common.jar:/Users/maping/Redhat/Eap/jboss-eap-5.1/jboss-as/lib/jboss-jca.jar:/Users/maping/Redhat/Eap/jboss-eap-5.1/jboss-as/lib/jbosssx.jar:/Users/maping/Redhat/Eap/jboss-eap-5.1/jboss-as/lib/jboss-logging-spi.jar org.jboss.resource.security.SecureIdentityLoginModule demo
我这里的明文口令是demo,输出如下:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Encoded password: 68e0c86af11171b6
同一个明文口令,多次运行的结果是一样的,感觉这个加密算法并不十分安全,至少应该加点“盐”啊。

(2)修改 jboss-eap-5.1/jboss-as/server/default/conf/login-config.xml 文件,增加如下内容:
<application-policy name="EncryptDBPassword">  // 这里的name应该是你在配置数据源时写的security-domain里的字符串 

    <authentication> 
        <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required"> 
            <module-option name="username">demo</module-option> // 数据库用户名
            <module-option name="password">68e0c86af11171b6</module-option>  //加密后的数据库口令
            <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=OracleDSDemo</module-option>   // name等于数据源的jndi-name
        </login-module> 
    </authentication> 
</application-policy> 

(3)修改 jboss-eap-5.1/jboss-as/server/default/deploy/oracle-ds.xml
去掉原有的数据库账户和口令的两行,替换为 <security-domain> EncryptDBPassword</security-domain> ,修改后的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
    <local-tx-datasource>
        <jndi-name>OracleDSDemo</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.0.104:1521:XE</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <security-domain> EncryptDBPassword</security-domain>
        <metadata>
            <type-mapping>Oracle11g</type-mapping>
        </metadata>
    </local-tx-datasource>      
</datasources>

(4)重启 JBoss EAP 5.1.2,访问DataSource,选择OracleDSDemo,点击Test Connection,确认连接成功。
如果连接不成功,在启动的console中会报告类似如下的错误信息:
Caused by: java.sql.SQLException: ORA-01017: invalid username/password; logon denied

参考文献:
1. http://andrey.mikhalchuk.com/2013/05/10/default-login-and-password-for-jboss-eap-5-1-2.html
2. http://spiritfrog.iteye.com/blog/587877
3. http://minstrel.iteye.com/blog/1547168
4. http://www.coderanch.com/t/549915/JBoss/JBoss-Oracle-Configuration-DataSource
5. http://caohongxing7604.blog.163.com/blog/static/3201697420083531436433/
6. http://blog.csdn.net/w709854369/article/details/7642503

没有评论: