wildfly:如何为xa-datasource使用加密密码?

时间:2015-12-01 16:13:30

标签: oracle encryption wildfly wildfly-8

我有一只野鸽8.2.0.Final跑步。我使用两个oracle数据源,一个< datasource>和一个< xa-datasource>。我希望使用安全域加密和管理我的数据库密码以使用安全域而不是xa-datasource。 我没有找到解决此问题的文档或其他帖子。

以下是我所做的:

        <datasources>
            <datasource jta="false" jndi-name="java:/myproject/jdbc/datasources/jdbc" pool-name="my_JDBC_DS" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@localhost:1521:DB</connection-url>
                <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
                <driver>oracle</driver>
                <pool>
                    <min-pool-size>1</min-pool-size>
                    <max-pool-size>50</max-pool-size>
                </pool>
                <security>
                    <security-domain>databaseSecure</security-domain>
                </security>
                <validation>
                    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                    <validate-on-match>true</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
            </datasource>
            <xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
                <xa-datasource-property name="URL">
                    jdbc:oracle:thin:@localhost:1521:DB
                </xa-datasource-property>
                <xa-datasource-property name="User">
                    scott
                </xa-datasource-property>
                <xa-datasource-property name="Password">
                    tiger
                </xa-datasource-property>
                <driver>oracle</driver>
                <security>
                  <user-name>scott</user-name>
                    <password>tiger</password>
                </security>
                <xa-pool>
                    <min-pool-size>1</min-pool-size>
                    <max-pool-size>50</max-pool-size>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <validation>
                    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                    <validate-on-match>true</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
                <statement>
                    <prepared-statement-cache-size>32</prepared-statement-cache-size>
                    <share-prepared-statements>true</share-prepared-statements>
                </statement>
            </xa-datasource>
            <drivers>
                <driver name="oracle" module="oracle">
                    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
...
            <security-domain name="databaseSecure" cache-type="default">
                <authentication>
                    <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                        <module-option name="username" value="scott"/>
                        <module-option name="password" value="-170dd0fbd8c13748"/>
                    </login-module>
                </authentication>
            </security-domain>

我尝试删除用户和密码的xa-datasource-property条目,并引用安全域,这些安全域既嵌套在security-tag中,又嵌套在与属性相同的级别上。两次尝试都不起作用,后者由于解析standalone.xml时出现问题而导致wildfly退出,后者部署失败。

为了显示最有希望的尝试,这就是我尝试引用安全域的方式:

<xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
            <xa-datasource-property name="URL">
                jdbc:oracle:thin:@localhost:1521:DB
            </xa-datasource-property>
            <driver>oracle</driver>
            <security>
              <security-domain>databaseSecure</security-domain>
            </security>
            <xa-pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
                <wrap-xa-resource>false</wrap-xa-resource>
            </xa-pool>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </xa-datasource>

这样做,野生动物会遇到javax.resource.ResourceException: No matching credentials in Subject! 我已经调试了代码,虽然我错过了调用堆栈中最后几个类的代码,但我发现Subject实际上具有作为属性的凭据但仍然AccessController.doPrivileged调用失败,导致上面的提到例外。

你知道我有点失落,有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我弄清楚我做错了什么(通过调试wildfly并盯着我工作的JBoss 4配置......)。 在我的安全域配置中,我只设置了用户名和密码。为了使其工作,我还需要添加“managedConnectionFactoryName”并为每个数据源声明一个安全域。

我现在有以下配置:

    <datasources>
        <datasource jta="false" jndi-name="java:/myproject/jdbc/datasources/jdbc" pool-name="my_JDBC_DS" enabled="true" use-ccm="false">
            <connection-url>jdbc:oracle:thin:@localhost:1521:DB</connection-url>
            <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
            <driver>oracle</driver>
            <pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
            </pool>
            <security>
                <security-domain>jdbcDatabaseSecure</security-domain>
            </security>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
        </datasource>
        <xa-datasource jndi-name="java:/myproject/jdbc/datasources/db_tx" pool-name="MYTXDS" enabled="true" use-ccm="false">
            <xa-datasource-property name="URL">
                jdbc:oracle:thin:@localhost:1521:DB
            </xa-datasource-property>
            <driver>oracle</driver>
            <security>
                <security-domain>txDatabaseSecure</security-domain>
            </security>
            <xa-pool>
                <min-pool-size>1</min-pool-size>
                <max-pool-size>50</max-pool-size>
                <wrap-xa-resource>false</wrap-xa-resource>
            </xa-pool>
            <validation>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <validate-on-match>true</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </xa-datasource>
        <drivers>
            <driver name="oracle" module="oracle">
                <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
    ...
        <security-domain name="jdbcDatabaseSecure" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="scott"/>
                    <module-option name="password" value="-170dd0fbd8c13748"/>
                    <module-option name = "managedConnectionFactoryName" value="jdbcDatabaseSecure" />
                </login-module>
            </authentication>
        </security-domain>
        <security-domain name="txDatabaseSecure" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="scott"/>
                    <module-option name="password" value="-170dd0fbd8c13748"/>
                    <module-option name = "managedConnectionFactoryName" value="txDatabaseSecure" />
                </login-module>
            </authentication>
        </security-domain>

现在它有效。

答案 1 :(得分:0)

尝试使用加密的安全域配置xa-datasource时遇到了同样的问题。经过一段时间的努力,我按本指南https://developer.jboss.org/wiki/JBossAS7SecuringPasswords中的描述配置了保险库加密,并且它对数据源和xa-datasources都成功运行。

希望这有帮助。

答案 2 :(得分:0)

我通过从standalone.xml中的security-domain中删除cache-type =“default”来禁用安全域的缓存,它对我有用 这种情况发生在由同一安全域支持定义的多个数据源的情况下, - 为每个数据源创建separte安全域或 - 如果安全域要与多个数据源一起使用,那么不应该为该域启用缓存,这意味着每次从安全域获取PasswordCredential时它将是一个新实例并执行此操作删除cache-type =来自standalone.xml中的security-domain的“default”

参考文献: https://community.appian.com/support/w/kb/299/kb-1074-cannot-open-connection-caused-by-javax-resource-resourceexception-no-matching-credentials-in-subject-error-thrown-during-jboss-startup

https://bugzilla.redhat.com/show_bug.cgi?id=1103684