[ZODB-Dev] RelStorage on Oracle RAC (doing now)

Shane Hathaway shane at hathawaymix.org
Wed Mar 10 16:32:07 EST 2010


Darryl Dixon - Winterhouse Consulting wrote:
> We have a client with an existing Oracle RAC infrastructure (4 node RAC).
> We are going to using RelStorage + cx_Oracle to connect to this from
> RedHat Linux servers, running Plone 3.3.x. This note is to say "we're
> here" and to provide some technical notes on our experience for the
> benefit of other implementers.

Cool, thanks!

> One (aesthetic?) problem is that the string for the relstorage_util
> package is hard-coded to SYS; eg, in
> relstorage.adapters.locker.OracleLocker.hold_commit_lock is the string
> "sys.relstorage_util.request_lock". Our DBA finds this distasteful and
> would prefer to keep the relstorage_util package in the Zope schema that
> he has created to partition this stuff off.

As a result of this choice, you had to do this instead of following the 
RelStorage documentation:

> GRANT EXECUTE ON DBMS_LOCK TO zope;

By doing that, you gave the "zope" user the ability to do arbitrary 
things with arbitrary Oracle locks.  Do you know what the implied 
security risks are?  I don't know, but the fact that Oracle restricts 
access to the DBMS_LOCK package implies there must be some important 
security risks.  Therefore, Oracle seems to be saying that no one should 
ever "GRANT EXECUTE ON DBMS_LOCK TO zope".  I have not found any docs on 
the specific risks, but maybe the DBMS_LOCK package could allow someone 
to execute a cross-database denial of service attack.

The RelStorage docs say to put the stored procedure in the SYS 
namespace; that way, it's not necessary to "GRANT EXECUTE ON DBMS_LOCK 
TO zope".  Either solution is distasteful, though.  I blame Oracle. 
Postgres and MySQL have much simpler advisory locking systems that allow 
any database user to acquire named locks without cross-database security 
risks.

Here are some reasonable choices:

1) Leave it as-is and explain in the RelStorage docs why you should not 
change it.

2) Assume the Oracle security risk is insignificant (or nonexistent) and 
have everyone "GRANT EXECUTE ON DBMS_LOCK TO zope".  This would make 
RelStorage slightly simpler and faster.  I'm not opposed to that.

I don't want to make the choice of how to use DBMS_LOCK configurable.  I 
want everyone to use DBMS_LOCK the same way, whatever that way is going 
to be, to minimize support costs.

FWIW, I believe that DBMS_LOCK doesn't really have any security risks. 
Instead, I think its API is broken, so Oracle silently discourages its 
use.  If there were an alternative that works in 10g, we would use that 
instead.  We can't use table locks because the WAIT keyword was not 
added to the LOCK TABLE statement until release 11g.

One we sort this out, we can make a final release of RelStorage 1.4.

Shane


More information about the ZODB-Dev mailing list