If you read through the first four parts of this series on data source security, you should be an expert on this focus area. There is one more small topic to cover related to WebLogic Resource permissions. After that comes the test, I mean example, to see with a real set of configuration parameters what the results are with some concrete values.
WebLogic Resource Permissions
All of the discussion so far has been about database credentials that are (eventually) used on the database side. WLS has resource credentials to control what WLS users are allowed to access JDBC resources. These can be defined on the Policies tab on the Security tab associated with the data source. There are four permissions: “reserve” (get a new connection), “admin”, “shrink”, and reset (plus the all-inclusive “ALL”); we will focus on “reserve” here because we are talking about getting connections. By default, JDBC resource permissions are completely open – anyone can do anything. As soon as you add one policy for a permission, then all other users are restricted. For example, if I add a policy so that “weblogic” can reserve a connection, then all other users will fail to reserve connections unless they are also explicitly added. The validation is done for WLS user credentials only, not database user credentials. Configuration of resources in general is described at “Create policies for resource instances” http://docs.oracle.com/cd/E24329_01/apirefs.1211/e24401/taskhelp/security/CreatePoliciesForResourceInstances.html. This feature can be very useful to restrict what code and users can get to your database.
There are the three use cases:
API
Use database credentials
User for permission checking
getConnection()
True or false
Current WLS user
getConnection(user,password)
False
User/password from API
getConnection(user,password)
True
Current WLS user
If a simple getConnection() is used or database credentials are enabled, the current user that is authenticated to the WLS system is checked. If database credentials are not enabled, then the user and password on the API are used.
Example
The following is an actual example of the interactions between identity-based-connection-pooling-enabled, oracle-proxy-session, and use-database-credentials.
On the database side, the following objects are configured.- Database users scott; jdbcqa; jdbcqa3- Permission for proxy: alter user jdbcqa3 grant connect through jdbcqa;- Permission for proxy: alter user jdbcqa grant connect through jdbcqa;
The following WebLogic Data Source objects are configured.- Users weblogic, wluser- Credential mapping “weblogic” to “scott”- Credential mapping "wluser" to "jdbcqa3"- Data source descriptor configured with user “jdbcqa”- All tests are run with Set Client ID set to true (more about that below).- All tests are run with oracle-proxy-session set to false (more about that below).
The test program:- Runs in servlet- Authenticates to WLS as user “weblogic”
Use DB Credentials
Identity based
getConnection(scott,***)
getConnection(weblogic,***)
getConnection(jdbcqa3,***)
getConnection()
true
true
Identity scottClient weblogicProxy null
weblogic fails - not a db user
User jdbcqa3Client weblogicProxy null
Default user jdbcqaClient weblogicProxy null
false
true
scott fails - not a WLS user
User scottClient scottProxy null
jdbcqa3 fails - not a WLS user
User scottClient scottProxy null
true
false
Proxy for scott fails
weblogic fails - not a db user
User jdbcqa3Client weblogicProxy jdbcqa
Default user jdbcqaClient weblogicProxy null
false
false
scott fails - not a WLS user
Default user jdbcqaClient scottProxy null
jdbcqa3 fails - not a WLS user
Default user jdbcqaClient scottProxy null
If Set Client ID is set to false, all cases would have Client set to null.
If this was not an Oracle thin driver, the one case with the non-null Proxy in the above table would throw an exception because proxy session is only supported, implicitly or explicitly, with the Oracle thin driver.
When oracle-proxy-session is set to true, the only cases that will pass (with a proxy of "jdbcqa") are the following.1. Setting use-database-credentials to true and doing getConnection(jdbcqa3,…) or getConnection().2. Setting use-database-credentials to false and doing getConnection(wluser, …) or getConnection().
Summary
There are many options to choose from for data source security. Considerations include the number and volatility of WLS and Database users, the granularity of data access, the depth of the security identity (property on the connection or a real user), performance, coordination of various components in the software stack, and driver capabilities. Now that you have the big picture (remember that table in part 1), you can make a more informed choice.