I noticed a miss on postgresql_unpriv_client() interface. Please check the newer one. Thanks, 2012/3/25 Kohei KaiGai <kaigai@xxxxxxxxxxxx>: > This patch provides a new trusted procedure type that allows to > switch the security label of database client, with interaction of new > sepgsql_setcon() function being supported at upcoming v9.2 release. > > The original idea was given by Joshua Brindle. The sepgsql_setcon() > provides an analogy of dynamic domain transition on operating system. > Although we don't give privileges to switch security label on confined > domains, but it allows to switch via trusted procedure. > > The new sepgsql_ranged_proc_exec_t is an entrypoint of > sepgsql_ranged_proc_t that has mcssetcats and mlsprocsetsl. > > We assume its typical usage is sepgsql_setcon() getting invoked > via trusted procedure that references secret credential tables at > beginning of the database session by connection pooling server. > > Usage example) > > (*) The credential table is labeled as "sepgsql_secret_table_t", > that holds a pair of username, credential and security context. > > postgres=# CREATE OR REPLACE FUNCTION client_switch(text) > RETURNS bool LANGUAGE sql > AS 'SELECT sepgsql_setcon(ucontext) FROM credential > WHERE uname = current_user AND ucred = $1'; > CREATE FUNCTION > postgres=# SECURITY LABEL ON FUNCTION client_switch(text) IS > 'system_u:object_r:sepgsql_ranged_proc_exec_t:s0'; > SECURITY LABEL > postgres=# CREATE OR REPLACE FUNCTION client_reset() > RETURNS bool LANGUAGE sql AS 'SELECT sepgsql_setcon(NULL)'; > CREATE FUNCTION > postgres=# SECURITY LABEL ON FUNCTION client_reset() IS > 'system_u:object_r:sepgsql_ranged_proc_exec_t:s0'; > SECURITY LABEL > > Then, it shows a scenario to switch the client label via trusted procedure. > > [alice@iwashi ~]$ psql postgres -q > postgres=# SELECT sepgsql_getcon(); > sepgsql_getcon > ---------------------------- > staff_u:staff_r:staff_t:s0 > (1 row) > > postgres=# SELECT * FROM info_c0; > ERROR: SELinux: security policy violation > postgres=# SELECT * FROM info_c1; > ERROR: SELinux: security policy violation > -- client have no permission neither info_c0 nor info_c1 > > postgres=# SELECT client_switch('6384e2b2184bcbf58eccf10ca7a6563c'); > client_switch > --------------- > t > (1 row) > > postgres=# SELECT sepgsql_getcon(); > sepgsql_getcon > ------------------------------- > staff_u:staff_r:staff_t:s0:c1 > (1 row) > > postgres=# SELECT * FROM info_c0; > ERROR: SELinux: security policy violation > postgres=# SELECT * FROM info_c1; > a | b > ---+----- > 3 | xxx > 4 | yyy > (2 rows) > > -- needless to say, credential table is not visible > postgres=# SELECT * FROM credential ; > ERROR: SELinux: security policy violation > > Also see, > http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=523176cbf14a3414170a83dd43686c0eccdc61c6 > > Signed-off-by: KaiGai Kohei <kohei.kaigai@xxxxxxxxxxxx> > -- > policy/modules/services/postgresql.if | 32 +++++++++++++++++++++++++++++++- > policy/modules/services/postgresql.te | 32 ++++++++++++++++++++++++++++---- > 2 files changed, 59 insertions(+), 5 deletions(-) > > diff --git a/policy/modules/services/postgresql.if > b/policy/modules/services/postgresql.if > index 09aeffa..24e9958 100644 > --- a/policy/modules/services/postgresql.if > +++ b/policy/modules/services/postgresql.if > @@ -32,6 +32,7 @@ interface(`postgresql_role',` > attribute sepgsql_schema_type, sepgsql_sysobj_table_type; > > type sepgsql_trusted_proc_exec_t, sepgsql_trusted_proc_t; > + type sepgsql_ranged_proc_exec_t, sepgsql_ranged_proc_t; > type user_sepgsql_blob_t, user_sepgsql_proc_exec_t; > type user_sepgsql_schema_t, user_sepgsql_seq_t; > type user_sepgsql_sysobj_t, user_sepgsql_table_t; > @@ -45,6 +46,7 @@ interface(`postgresql_role',` > > typeattribute $2 sepgsql_client_type; > role $1 types sepgsql_trusted_proc_t; > + role $1 types sepgsql_ranged_proc_t; > > ############################## > # > @@ -88,6 +90,10 @@ interface(`postgresql_role',` > > allow $2 sepgsql_trusted_proc_t:process transition; > type_transition $2 sepgsql_trusted_proc_exec_t:process sepgsql_trusted_proc_t; > + > + allow $2 sepgsql_ranged_proc_t:process transition; > + type_transition $2 sepgsql_ranged_proc_exec_t:process sepgsql_ranged_proc_t; > + allow sepgsql_ranged_proc_t $2:process dyntransition; > ') > > ######################################## > @@ -223,7 +229,7 @@ interface(`postgresql_view_object',` > ## </summary> > ## <param name="type"> > ## <summary> > -## Type marked as a database object type. > +## Type marked as a procedure object type. > ## </summary> > ## </param> > # > @@ -237,6 +243,26 @@ interface(`postgresql_procedure_object',` > > ######################################## > ## <summary> > +## Marks as a SE-PostgreSQL trusted procedure object type > +## </summary> > +## <param name="type"> > +## <summary> > +## Type marked as a trusted procedure object type. > +## </summary> > +## </param> > +# > +interface(`postgresql_trusted_procedure_object',` > + gen_require(` > + attribute sepgsql_procedure_type; > + attribute sepgsql_trusted_procedure_type; > + ') > + > + typeattribute $1 sepgsql_procedure_type; > + typeattribute $1 sepgsql_trusted_procedure_type; > +') > + > +######################################## > +## <summary> > ## Marks as a SE-PostgreSQL procedural language object type > ## </summary> > ## <param name="type"> > @@ -459,6 +485,10 @@ interface(`postgresql_unpriv_client',` > type_transition $1 sepgsql_trusted_proc_exec_t:process sepgsql_trusted_proc_t; > allow $1 sepgsql_trusted_proc_t:process transition; > > + type_transition $1 sepgsql_ranged_proc_exec_t:process sepgsql_ranged_proc_t; > + allow $1 sepgsql_ranged_proc_t:process transition; > + allow sepgsql_ranged_proc_t $1:process dyntransition; > + > tunable_policy(`sepgsql_enable_users_ddl',` > allow $1 unpriv_sepgsql_schema_t:db_schema { create drop setattr }; > allow $1 unpriv_sepgsql_table_t:db_table { create drop setattr }; > diff --git a/policy/modules/services/postgresql.te > b/policy/modules/services/postgresql.te > index 4d71f89..2457d10 100644 > --- a/policy/modules/services/postgresql.te > +++ b/policy/modules/services/postgresql.te > @@ -70,6 +70,7 @@ attribute sepgsql_sysobj_table_type; > attribute sepgsql_sequence_type; > attribute sepgsql_view_type; > attribute sepgsql_procedure_type; > +attribute sepgsql_trusted_procedure_type; > attribute sepgsql_language_type; > attribute sepgsql_blob_type; > attribute sepgsql_module_type; > @@ -122,7 +123,10 @@ type sepgsql_table_t; > postgresql_table_object(sepgsql_table_t) > > type sepgsql_trusted_proc_exec_t; > -postgresql_procedure_object(sepgsql_trusted_proc_exec_t) > +postgresql_trusted_procedure_object(sepgsql_trusted_proc_exec_t) > + > +type sepgsql_ranged_proc_exec_t; > +postgresql_trusted_procedure_object(sepgsql_ranged_proc_exec_t) > > type sepgsql_view_t; > postgresql_view_object(sepgsql_view_t) > @@ -133,6 +137,26 @@ domain_type(sepgsql_trusted_proc_t) > postgresql_unconfined(sepgsql_trusted_proc_t) > role system_r types sepgsql_trusted_proc_t; > > +# Ranged Trusted Procedure Domain > +# > +# XXX - the purpose of this domain is to switch security context of > +# the database client using dynamic domain transition; typically, > +# used for connection pooling software that shall assign a security > +# context at beginning of the user session based on the credentials > +# being invisible from unprivileged domains. > +# > +type sepgsql_ranged_proc_t; > +domain_type(sepgsql_ranged_proc_t) > +postgresql_unconfined(sepgsql_ranged_proc_t) > +allow sepgsql_ranged_proc_t self:process { setcurrent }; > +role system_r types sepgsql_ranged_proc_t; > +optional_policy(` > + mcs_process_set_categories(sepgsql_ranged_proc_t) > +') > +optional_policy(` > + mls_process_set_level(sepgsql_ranged_proc_t) > +') > + > # Types for unprivileged client > type unpriv_sepgsql_blob_t; > postgresql_blob_object(unpriv_sepgsql_blob_t) > @@ -404,7 +428,7 @@ allow sepgsql_client_type > sepgsql_seq_t:db_sequence { getattr get_value next_val > allow sepgsql_client_type sepgsql_view_t:db_view { getattr expand }; > > allow sepgsql_client_type sepgsql_proc_exec_t:db_procedure { getattr > execute install }; > -allow sepgsql_client_type sepgsql_trusted_proc_exec_t:db_procedure { > getattr execute entrypoint }; > +allow sepgsql_client_type sepgsql_trusted_procedure_type:db_procedure > { getattr execute entrypoint }; > > allow sepgsql_client_type sepgsql_lang_t:db_language { getattr }; > allow sepgsql_client_type sepgsql_safe_lang_t:db_language { getattr execute }; > @@ -493,7 +517,7 @@ tunable_policy(`sepgsql_unconfined_dbadm',` > allow sepgsql_admin_type sepgsql_view_type:db_view *; > > allow sepgsql_admin_type sepgsql_proc_exec_t:db_procedure *; > - allow sepgsql_admin_type sepgsql_trusted_proc_exec_t:db_procedure ~install; > + allow sepgsql_admin_type sepgsql_trusted_procedure_type:db_procedure ~install; > allow sepgsql_admin_type sepgsql_procedure_type:db_procedure ~{ > execute install }; > > allow sepgsql_admin_type sepgsql_language_type:db_language ~implement; > @@ -528,7 +552,7 @@ allow sepgsql_unconfined_type sepgsql_view_type:db_view *; > # unconfined domain is not allowed to invoke user defined procedure directly. > # They have to confirm and relabel it at first. > allow sepgsql_unconfined_type sepgsql_proc_exec_t:db_procedure *; > -allow sepgsql_unconfined_type > sepgsql_trusted_proc_exec_t:db_procedure ~install; > +allow sepgsql_unconfined_type > sepgsql_trusted_procedure_type:db_procedure ~install; > allow sepgsql_unconfined_type sepgsql_procedure_type:db_procedure ~{ > execute install }; > > allow sepgsql_unconfined_type sepgsql_language_type:db_language ~implement; > > -- > KaiGai Kohei <kaigai@xxxxxxxxxxxx> -- KaiGai Kohei <kaigai@xxxxxxxxxxxx>
Attachment:
refpolicy-sepgsql-1of4-connection-pooling-support.20120502.patch
Description: Binary data