RDBMS安全存储理解

为什么使用RDBMS安全存储

我们知道WebLogic Server安全管理框架中包含很多部分,例如:认证、授权、角色映射、仲裁、审计等。以上这些安全相关信息默认存储在WebLogic Server内嵌LDAP服务器中的。WebLogic Server内嵌LDAP服务器是基于文件系统的,如果用在小用户量或安全操作不频繁的环境中还可以胜任,但是如果是用在大用户量,尤其是安全操作比较频繁的环境中,例如:使用WebLogic Server提供SAML服务,那它就很难保证其性能了。RDBMS安全存储正是应对这个问题的解决方案。RDBMS安全存储使用外部数据库为WebLogic Server安全插件提供数据存储支持。

使用RDBMS安全存储的安全插件

  • XACML Authorization provider XACML Role Mapping provider
  • The following providers for SAML 1.1:
  • SAML Identity Assertion provider V2
  • SAML Credential Mapping provider V2
  • The following providers for SAML 2.0:
  • SAML 2.0 Identity Assertion provider
  • SAML 2.0 Credential Mapping provider
  • WebLogic Credential Mapping provider
  • PKI Credential Mapping provider
  • Certificate Registry

注:RDBMS安全存储并不负责认证数据的存储,也就是说即使使用了RDBMS安全存储,WebLogic Server的默认Authentication Provider还是使用内嵌LDAP存储用户认证信息,当然,如果你愿意也可以在WebLogic Server启动后再添加或更改Authentication Provider,这部分就和RDBMS安全存储没有关系了。

如何配置RDBMS安全存储

创建数据库表

在配置支持RDBMS Security Store域之前,必须先创建相关数据库表。脚本位于:WL_HOME/server/lib

RDBMS系统SQL脚本
Oracle 9i,10g,11grdbms_security_store_oracle.sql
rdbms_security_store_oracle_remove.sql
MS-SQL 2000,2005rdbms_security_store_sqlserver.sql
rdbms_security_store_sqlserver_remove.sql
DB 9.2, 9.5rdbms_security_store_db2.sql
rdbms_security_store_db2_remove.sql
PointBase 5.1rdbms_security_store_pointbase.sql
rdbms_security_store_pointbase_remove.sql

创建WebLogic Server 域

通过域配置向导

rdbms_store1

rdbms_store2

通过WLST脚本

使用Oracle数据库

create('base_domain','SecurityConfiguration')
cd('/SecurityConfiguration/base_domain')
a=get('DefaultRealm')
cd('Realm/myrealm')
rdbms = create("myRDBMSSecurityStore", "RDBMSSecurityStore")
rdbms.setUsername('ortiz')
rdbms.setPasswordEncrypted('weblogic')
rdbms.setConnectionURL('jdbc:bea:oracle://avitek21:1521')
rdbms.setDriverName('weblogic.jdbc.oracle.OracleDriver')
rdbms.setConnectionProperties('user=ortiz,portNumber=1521,SID=pint101a,serverName=avitek21')

使用DB2数据库

create('base_domain','SecurityConfiguration')
cd('/SecurityConfiguration/base_domain')
a=get('DefaultRealm')
cd('Realm/myrealm')
rdbms = create("myRDBMSSecurityStore", "RDBMSSecurityStore")
rdbms.setUsername('brady')
rdbms.setPasswordEncrypted('weblogic')
rdbms.setConnectionURL('jdbc:bea:db2://avitek3:50000')
rdbms.setDriverName('weblogic.jdbc.db2.DB2Driver')
rdbms.setConnectionProperties('user=brady,portNumber=50000,databaseName=wls,serverName=avitek3,batchPerformanceWorkaround=true')

使用MS-SQL数据库

create('base_domain','SecurityConfiguration')
cd('/SecurityConfiguration/base_domain')
a=get('DefaultRealm')
cd('Realm/myrealm')
rdbms = create("myRDBMSSecurityStore", "RDBMSSecurityStore")
rdbms.setUsername('garnett')
rdbms.setPasswordEncrypted('weblogic')
rdbms.setConnectionURL('jdbc:bea:sqlserver://avitek6:1433')
rdbms.setDriverName('weblogic.jdbc.sqlserver.SQLServerDriver')
rdbms.setConnectionProperties('user=garnett,portNumber=1433,databaseName=wls3,serverName=avitek6')

配置JMS主题

首先我们要搞明白为什么要配JMS主题,如果在单一WebLogic Server服务器中使用RDBMS安全存储的话,就无需配置JMS主题。如果在一个多WebLogic Server实例的环境中或在WebLogic集群环境中最好为RDBMS安全存储配置JMS主题,它的做用将安全策略或安全配置信息的更新通过JMS主题同步到所有WebLogic Server实例中。当然如果不配置JMS主题,就需要在每次更新了安全信息后重启所有WebLogic Server。

进入Weblogic Server控制台,进入“安全领域->配置->RDBMS安全存储”,根据配置需求配置相应的JMS资源,然后重新启动服务器生效。

rdbms_store3

如何升级现有域使用RDBMS安全存储

首先导出原有WebLogic Server域的安全数据,然后创建一个新域并添加RDBMS安全存储支持,最后导入原来域中导出的安全数据。

补:截止WebLogic Server 10.3.2版,RDBMS安全存储底层还是使用的Kodo实现(原BEA的EJB3实体BEAN实现),虽然还没有官方说法,但相信后面的版本会将其换成TopLink,当然这只是我的一个猜想。