Virtual Private Database Functionality - Mailing list pgsql-general

From François Gendron
Subject Virtual Private Database Functionality
Date
Msg-id 001a01c48077$0b118e60$0200030a@gendron.ca
Whole thread Raw
Responses Re: Virtual Private Database Functionality
List pgsql-general
Hi,

I am new to the PostgreSQL world, coming from many years in the Oracle
world (Since Oracle 3).

One feature that I am trying to find in the PostgreSQL database is an
equivalent to Oracle's Virtual Private Database functionnality (also
historically known as Fine-Grained Access Control, and sometimes
referred to as row-level security).

I have read some previous posts on this topic in the PostgresSQL archives
and some have provided workarounds to replicate what others were
requesting.

Unfortunately, I think (I may be wrong) that the core of the issue was
missed. Here is my description of Virtual Private Database (VPD) and
what I am looking for.

VPD requires four basic elements:

 - Trigger upon logon (Session initiation)

   The purpose of the trigger is to be able to capture on who or what
   the session is for and _collect_ data that describes the context
   of the session. (no security rules are involved at this point, only
   the base data that will be input into the rules)

   This logon trigger must run with priviledges that are greater than
   what the session's user has. See next step below for the reason.

 - Secured context data stored for the complete session (session object)

   Once the logon trigger has fired and collected the context data,
   the data needs to be stored in memory. We dont what to potentially
   require reading database tables again for every SQL transaction
   that is issued by the application, to obtain this context data.

   The context data must be secured from the session's user, since if
   he can change it, he can change his priviledges upon the database
   tables.

 - Table level SELECT, INSERT, UPDATE, DELETE triggers

   When any SQL transaction is issued upon specified tables,
   optionnally INCLUDING SELECTs, then a trigger is fired and a
   stored procedure is run.

   The stored procedure is known to define the security policy. The
   same stored procedure can be associated with many tables in the
   database. Ideally, the name of the triggered table is passed to
   the security policy procedure.

   In Oracle these are not _called_ TRIGGERS, but rather POLICIES
   and may be enabled and disabled by priviledged users without
   affecting any other part of the database or application.

 - Security policy defining stored procedure

   The purpose of the stored procedure is to _dynamically_ build a
   WHERE clause predicate that will be used to rewrite the query
   (ADD the predicate using the AND operator) that was issued upon
   the table by the user or the application.

   The predicate is built by accessing :
      - the session specific context data
      - the paramater indicating which table is accessed
      - any other information in database tables

   The 'dynamic' part allows all security policies to be changed
   at will without affecting any database structures or application
   code. Security policies can be totally data-driven, not hard-coded.

The reason VPD is usefull is it allows an application to be written
to perform business functionnality WITHOUT having any security
related code imbedded in it. The security is coded seperately from
both the application and the database structure, and is active
regardless of which application or tool is used to access the database.

In a sense, it is like a different implementation of aspect oriented
programming. The businness function is seperate from the security
function which is also seperate from the database structure definition.

So, the issue around VPD is not simply about being able to
specify row-level security, but rather to have the security be
defined seperately from both application and database structure and
also have this security be extremely dynamic and potentially be
data-driven and defined by non-technical users within and application
(but still active regardless of other application or tool access).

If anyone has an idea how this could be implemented in PostgreSQL, I
would appreciate feedback.

Thanks,

--
François Gendron
La Société d'Informatique Gendron Inc.
Tél: (514) 212-3994   Fax: (418) 682-5391
mailto:Francois.Gendron@gendron.ca



pgsql-general by date:

Previous
From: Giannis Vrentzos
Date:
Subject: case insensitive search with greek characters
Next
From: max jacob
Date:
Subject: table functions as fields in a select