Re: [HACKERS] [RFC] PostgreSQL Access Control Extension (PGACE)

2007-04-17 Thread KaiGai Kohei
Josh Berkus wrote:
 KaiGai,
 
 It provides database users fine grained mandatory access control
 including row and column level one, and integration with operating
 system security policy.
 
 Column level?  We don't currently support that, except through VIEWs.
 How is it implemented?

PGACE provides a hook just after query rewriting phase.
SE-PostgreSQL walks on the query tree to check any required references
onto columns, as the implementation of the hook.
If a client does not have enough permissions onto the column,
SE-PostgreSQL abort the current transaction via ereport().

Thanks,
-- 
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate


Re: [HACKERS] [RFC] PostgreSQL Access Control Extension (PGACE)

2007-04-17 Thread KaiGai Kohei
Tom Lane wrote:
 Josh Berkus [EMAIL PROTECTED] writes:
 Column level?  We don't currently support that, except through VIEWs.
 How is it implemented?
 
 It wasn't clear to me how much of this is actually working today and how
 much is a paper design --- one thing in particular that stood out as
 probable handwaving was the bit about being able to assign to a system
 column in INSERT or UPDATE.  I'm fairly sure that that would take some
 *significant* redesign of querytree and plan targetlist representation
 :-( ... I looked at it once for OIDs and decided it wasn't worth the
 trouble.

Currently, writable system column support is already included as a part
of PGACE, and it works fine to make setting up SE-PostgreSQL.
The implementation uses TargetEntry-resjunk effectively to make it simplified.

When a targetlist contains security_context column in a UPDATE or INSERT
query, SE-PostgreSQL marks the TargetEntry as a junk.
Then, the value explicitly given as security_context is computed in the
normal way. It is fetched at ExecutePlan() just before calling ExecUpdate()
or ExecInsert(), and stored into HeapTupleHeader-t_security.

Maybe, a part of the patch to implement them is less than 100L, without any
significant redesign,
Is there any oversight? If so, please tell me.

Thanks,
-- 
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org


Re: [HACKERS] [RFC] PostgreSQL Access Control Extension (PGACE)

2007-04-17 Thread KaiGai Kohei
Tom Lane wrote:
 Andrew Dunstan [EMAIL PROTECTED] writes:
 What's more, we have a SoC project for column level access controls.
 
 ... which presumably wouldn't involve any added dependency on outside code.
 For people who are already using SELinux or Trusted Solaris, making the
 database dependent on that infrastructure might be seen as a plus, but
 I'm not sure the rest of the world would be pleased.

The most significant purpose of PGACE and SE-PostgreSQL is integration
between database and operating system security policy, on mandatory
access controlled (MAC) system especially.
Thus, not to provide any regression is the most desired behavior of
PGACE on non-MAC system like SELinux disabled Linux, I think.

PGACE without using SELinux or Trusted Solaris does not give any effect,
because it is defined as static inline function with no operation mostly.

 There are also
 some interesting questions about SQL spec compliance and whether a
 database that silently hides some rows from you will give semantically
 consistent results.

Any violated tuples are always filtered from result set, before using them,
as if an additional condition is appended onto WHERE or JOIN ON clause.
The condition means whether client has enough permission on this tuple, or not.
All those processes are done after rewriting phase, so result set is constant
even if a table is referred via views.

Thus, client can deal a table as if it does not contain any violated tuples.
# If a result set contains any violated tuple, it's a bug of SE-PostgreSQL.

An exception is foreign key implementation. It internally uses UPDATE query
to support 'ON UPDATE CASCADE' rule and so on.
If violated tuples are filtered, the FK constraint is not kept.
For example, when there are five tuples to be cascaded but client does not
have enough permission onto two of them, the two tuple will be remained
without cascading.
In SE-PostgreSQL, whole of transaction will be aborted, if client does not
have enough permissions on all the tuples cascaded under FK processing.

One more exception is TRUNCATE statement. In SE-PostgreSQL, TRUNCATE statement
is nonsense, because it is translated into unconditional DELETE statement to
avoid removing tuples without enough permission.

Currently, I have not gotten any inconsistency in the access control model.
But any pointed out is welcome.

Thanks,
-- 
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate


Re: [HACKERS] [RFC] PostgreSQL Access Control Extension (PGACE)

2007-04-17 Thread KaiGai Kohei

For people who are already using SELinux or Trusted Solaris, making the
database dependent on that infrastructure might be seen as a plus, but
I'm not sure the rest of the world would be pleased.  


Even where SELinux is available it has had mixed reviews - I habitually 
disable it.


The relationship between your works and SE-PostgreSQL effort is similar
to the relationship between UNIX-DAC/Posix-ACL and SELinux on operating
systems.

I believe those are not conflicted efforts.

Thanks,
--
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
  choose an index scan if your joining column's datatypes do not
  match


[HACKERS] [RFC] PostgreSQL Access Control Extension (PGACE)

2007-04-16 Thread KaiGai Kohei
As I announced alpha version of SE-PostgreSQL about one month ago,
I'm working for development of a security facility integrated with
secure operating system.

It provides database users fine grained mandatory access control
including row and column level one, and integration with operating
system security policy.

This concept may have applicability to other secure operating system
such as Trusted Solaris. Just after the announcement, Sun.com's people
were interested in SE-PostgreSQL works, and contacted me.
They also want to implement a similar functionality on their operating
system using Trusted Extension (TX).

We got an agreement that a common framework like LSM will be useful
to implement and maintain those secure facilities.

I want to have a discussion and get feedbacks about this idea from
PostgreSQL developers.

--
The framework named PGACE(PostgreSQL Access Control Extension).
It provides two major facilities. One is hooks on some strategic points.
The other is a functionality to associate a tuple with its security
attribute.

Any hooks is defined as a static inline functions in security/pgace.h.
They give no effect, if no security facilities are configured.
If SELinux support is enabled via configure script, those definitions
are overwritten by security/sepgsql.h, and the hooks calls actual
SE-PostgreSQL implementation to provide MAC(mandatory access control).

Those hooks are deployed on the some strategic points of PostgreSQL such as
simple_heap_insert(), PortalStart() and so on.

You can get all the definition of pgace.h and sepgsql.h from the following URL:
  http://sepgsql.googlecode.com/svn/trunk/src/include/security/

The later functionality enables to associate a tuple with security attribute.
It adds a new field (t_security) with Oid type into HeapTupleHeaderData
structure. The t_security can persistently hold a Oid of pg_security new
system catalog. The pg_security has a combination of Oid value and security
attribute with text representation.

Database users can refer the attribute via new system column.
When SQL query tries to refer this attribute via the system column,
PGACE lookups pg_security system column to get a tuple which has same oid
compared to t_security value of its HeapTupleHeaderData.
It's implemented as input/output handler of new security_label type.

The name of system column is defined in pg_config.h.in.
In SELinux case, it's named security_context. This system column is
writable via UPDATE or INSERT statement, to enables relabeling.

Because most of security attribute shares same text representation, this
implementation works effectively and economically.

As you know, PostgreSQL handles any database object as a tuple stored in
system catalogs. So, this concept may have applicability to any kind of
database object like table, column and procedure.
--

I hope that SE-PostgreSQL and PGACE are merged into future upstreamed
PostgreSQL and we can turn on/off by configure option without any patch.

I believe any comments and feedbacks are so helpful to indicate the
direction of our development with an approach which is acceptable by
PostgreSQL development community.

Thanks,

* Reference
The full set of patch is a bit large to post the list directly. (6.7KL)

You can checkout the source code from the following URL:
  http://code.google.com/p/sepgsql/source
You can get the patch for SE-PostgreSQL based on PGACE from the following URL:
  http://sepgsql.googlecode.com/files/sepostgresql-8.2.3-226.patch
  (against to the stable postgresql-8.2.3)
-- 
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


[HACKERS] [ANN] SE-PostgreSQL 8.2.3-1.0 alpha release

2007-03-05 Thread KaiGai Kohei
 |  0
(6 rows)

## The security context of each tuples are stored in 'security_context'
## system column.
kaigai=# select security_context,* from drink;
security_context | did | dname | dprice | dsoft | dstock
-+-+---++---+
 user_u:object_r:sepgsql_table_t |   1 | juice |110 | t | 35
 user_u:object_r:sepgsql_table_t |   2 | coke  |110 | t | 20
 user_u:object_r:sepgsql_table_t |   3 | milk  |130 | t |  5
 user_u:object_r:sepgsql_table_t |   4 | water |100 | t | 10
 user_u:object_r:sepgsql_table_t |   5 | beer  |240 | f | 15
 user_u:object_r:sepgsql_table_t |   6 | wine  |380 | f |  0
(6 rows)

kaigai=#

## A example of execution under lower authority:
## The two tuples which have 'SystemHigh' were filtered.

$ runcon -l s0 -- bash
$ id -Z
root:system_r:unconfined_t
$ psql -q
kaigai=# select sepgsql_getcon();
   sepgsql_getcon

 root:system_r:unconfined_t
(1 row)

kaigai=# select * from drink;
NOTICE:  SELinux: denied { select } scontext=root:system_r:unconfined_t 
tcontext=user_u:object_r:sepgsql_table_t:SystemHigh tclass=tuple
NOTICE:  SELinux: denied { select } scontext=root:system_r:unconfined_t 
tcontext=user_u:object_r:sepgsql_table_t:SystemHigh tclass=tuple
 did | dname | dprice | dsoft | dstock
-+---++---+
   1 | juice |110 | t | 35
   2 | coke  |110 | t | 20
   3 | milk  |130 | t |  5
   4 | water |100 | t | 10
(4 rows)

kaigai=#
$ exit

## We tried to connect from a domain which cannot access 
'sepgsql_secret_table_t'

$ runcon -t initrc_t -- bash
$ id -Z
root:system_r:initrc_t:SystemLow-SystemHigh
$ psql -q
kaigai=# select * from drink;
ERROR:  SELinux: denied { select } 
scontext=root:system_r:initrc_t:SystemLow-SystemHigh 
tcontext=user_u:object_r:sepgsql_secret_table_t tclass=column name=dstock

## The client in initrc_t domain cannot access dstock column which has
## sepgsql_table_t type, but we cann access the column via trusted
## procedure only.

kaigai=# select did, dname, dprice, drink_stock_exist(did) from drink;
 did | dname | dprice | drink_stock_exist
-+---++---
   1 | juice |110 | t
   2 | coke  |110 | t
   3 | milk  |130 | t
   4 | water |100 | t
   5 | beer  |240 | t
   6 | wine  |380 | f
(6 rows)

kaigai=#

==
[Hint]
* There is no compatibility between SE-PostgreSQL and PostgreSQL.
  You have to pay attention not to destroy your database files
  for native PostgreSQL.

* You can enable/disable access allowed/denied messages by using
  boolean stuff of SELinux. Set the following booleans by setsebool
  command.
  sepgsql_enable_auditallow
  sepgsql_enable_auditdeny
  sepgsql_enable_audittuple

* initrc_t is defined as a less power domain for test purpose.
  We cannot use DDL statement from initrc_t domain, and cannot
  access tables, columns and tuples with sepgsql_secret_table_t
  type.

* The security policy for SE-PostgreSQL under the strict policy is now
  under development. You have to switch to the targeted policy, if you
  try to use this version.
-- 
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [HACKERS] SE-Linux/PostgreSQL work?

2007-03-02 Thread KaiGai Kohei

Hello,

Josh Berkus wrote:

Folks,

I'm chasing a rumor that someone is working on integrating PostgreSQL with 
the SELinux security framework.   Anyone know anything about this?


I'm currently working on integration PostgreSQL with SELinux security framework.
It was named as SE-PostgreSQL.
Thanks for your interest.

It will provide finer grained mandatory access control on the various kinds of
database objects including columns, tuples and binary large objects, based on
the security policy of SELinux. Any clients cannot bypass this access control,
even if they are privileged database users.

Now, I have a plan to release the first alpha version of SE-PostgreSQL within
this week, to get any feedbacks from PostgreSQL/SELinux community.

Thanks,
--
KaiGai Kohei [EMAIL PROTECTED]

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

  http://www.postgresql.org/docs/faq


<    5   6   7   8   9   10