Index: refpolicy/policy/flask/security_classes =================================================================== --- refpolicy/policy/flask/security_classes (revision 2385) +++ refpolicy/policy/flask/security_classes (working copy) @@ -99,4 +99,12 @@ class memprotect +# SE-PostgreSQL relation +class database # userspace +class table # userspace +class procedure # userspace +class column # userspace +class tuple # userspace +class blob # userspace + # FLASK Index: refpolicy/policy/flask/access_vectors =================================================================== --- refpolicy/policy/flask/access_vectors (revision 2385) +++ refpolicy/policy/flask/access_vectors (working copy) @@ -80,6 +80,20 @@ } # +# Define a common prefix for userspace database object access vectors. +# + +common database +{ + create + drop + getattr + setattr + relabelfrom + relabelto +} + +# # Define the access vectors. # # class class_name [ inherits common_name ] { permission_name ... } @@ -655,3 +669,61 @@ { mmap_zero } + +# definition for SE-PostgreSQL +class database +inherits database +{ + access + install_module + load_module + get_param + set_param +} + +class table +inherits database +{ + use + select + update + insert + delete + lock +} + +class procedure +inherits database +{ + execute + entrypoint +} + +class column +inherits database +{ + use + select + update + insert +} + +class tuple +{ + relabelfrom + relabelto + use + select + update + insert + delete +} + +class blob +inherits database +{ + read + write + import + export +} Index: refpolicy/policy/mcs =================================================================== --- refpolicy/policy/mcs (revision 2385) +++ refpolicy/policy/mcs (working copy) @@ -98,4 +98,28 @@ mlsconstrain process { sigkill sigstop } (( h1 dom h2 ) or ( t1 == mcskillall )); +# MCS policy for SE-PostgreSQL +#------------------------------- + +# Any database object must be dominated by the relabeling subject +# clearance, also the objects are single-level. +mlsconstrain { database table procedure column blob } { create relabelto } + ((h1 dom h2) and ( l1 domby h2 ) and ( l2 eq h2 )); +mlsconstrain tuple { insert relabelto } + (( h1 dom h2 ) and ( l1 domby h2 ) and ( l2 eq h2 )); + +# Access control for any database objects based on MCS rules. +mlsconstrain database { drop setattr relabelfrom access install_module load_module get_param set_param } + ( h1 dom h2 ); +mlsconstrain table { drop setattr relabelfrom select update insert delete use } + ( h1 dom h2 ); +mlsconstrain column { drop setattr relabelfrom select update insert use } + ( h1 dom h2 ); +mlsconstrain tuple { relabelfrom select update delete use } + ( h1 dom h2 ); +mlsconstrain procedure { execute } + ( h1 dom h2 ); +mlsconstrain blob { drop setattr relabelfrom read write } + ( h1 dom h2 ); + ') dnl end enable_mcs Index: refpolicy/policy/modules/kernel/mls.te =================================================================== --- refpolicy/policy/modules/kernel/mls.te (revision 2385) +++ refpolicy/policy/modules/kernel/mls.te (working copy) @@ -43,6 +43,14 @@ attribute mlsxwinwritecolormap; attribute mlsxwinwritexinput; +attribute mlsdatabaseread; +attribute mlsdatabasereadtoclr; +attribute mlsdatabasewrite; +attribute mlsdatabasewritetoclr; +attribute mlsdatabasewriteinrange; +attribute mlsdatabaseupgrade; +attribute mlsdatabasedowngrade; + attribute mlstrustedobject; attribute privrangetrans; Index: refpolicy/policy/modules/kernel/mls.if =================================================================== --- refpolicy/policy/modules/kernel/mls.if (revision 2385) +++ refpolicy/policy/modules/kernel/mls.if (working copy) @@ -406,6 +406,82 @@ ######################################## ## +## Make specified domain MLS trusted +## for reading from databases at higher levels. +## +## +## +## Domain allowed access. +## +## +# +interface(`mls_database_read_up',` + gen_require(` + attribute mlsdatabaseread; + ') + + typeattribute $1 mlsdatabaseread; +') + +######################################## +## +## Make specified domain MLS trusted +## for writing to databases at lower levels. +## +## +## +## Domain allowed access. +## +## +# +interface(`mls_database_write_down',` + gen_require(` + attribute mlsdatabasewrite; + ') + + typeattribute $1 mlsdatabasewrite; +') + +######################################## +## +## Make specified domain MLS trusted +## for raising the level of databases. +## +## +## +## Domain allowed access. +## +## +# +interface(`mls_database_upgrade',` + gen_require(` + attribute mlsdatabaseupgrade; + ') + + typeattribute $1 mlsdatabaseupgrade; +') + +######################################## +## +## Make specified domain MLS trusted +## for lowering the level of databases. +## +## +## +## Domain allowed access. +## +## +# +interface(`mls_database_downgrade',` + gen_require(` + attribute mlsdatabasedowngrade; + ') + + typeattribute $1 mlsdatabasedowngrade; +') + +######################################## +## ## Make specified object MLS trusted. ## ## Index: refpolicy/policy/mls =================================================================== --- refpolicy/policy/mls (revision 2385) +++ refpolicy/policy/mls (working copy) @@ -600,4 +600,109 @@ mlsconstrain context contains ( h1 dom h2 ); +# +# MLS policy for the database related classes +# + +# make sure these database classes are "single level" +mlsconstrain { database table procedure column blob } { create relabelto } + ( l2 eq h2 ); +mlsconstrain { tuple } { insert relabelto } + ( l2 eq h2 ); + +# new file labels must be dominated by the relabeling subjects clearance +mlsconstrain { database table procedure column tuple blob } { relabelto } + ( h1 dom h2 ); + +# the database "read" ops (note the check is dominance of the low level) +mlsconstrain { database table procedure column blob } { getattr } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { database } { access get_param } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { table column } { use select } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { procedure } { execute } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { blob } { read } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { tuple } { use select } + (( l1 dom l2 ) or + (( t1 == mlsdatabasereadtoclr ) and ( h1 dom l2 )) or + ( t1 == mlsdatabaseread ) or + ( t2 == mlstrustedobject )); + +# the "single level" file "write" ops +mlsconstrain { database table procedure column blob } { create drop setattr relabelfrom } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { database } { install_module load_module set_param } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { table } { update insert delete lock } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { column } { update insert } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { blob } { write import export } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +mlsconstrain { tuple } { relabelfrom update insert delete } + (( l1 eq l2 ) or + (( t1 == mlsdatabasewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or + (( t2 == mlsdatabasewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or + ( t1 == mlsdatabasewrite ) or + ( t2 == mlstrustedobject )); + +# the database upgrade/downgrade rule +mlsvalidatetrans { database table procedure column tuple blob } + ((( l1 eq l2 ) or + (( t3 == mlsdatabaseupgrade ) and ( l1 domby l2 )) or + (( t3 == mlsdatabasedowngrade ) and ( l1 dom l2 )) or + (( t3 == mlsdatabasedowngrade ) and ( l1 incomp l2 ))) and + (( l1 eq h2 ) or + (( t3 == mlsdatabaseupgrade ) and ( h1 domby h2 )) or + (( t3 == mlsdatabasedowngrade ) and ( h1 dom h2 )) or + (( t3 == mlsdatabasedowngrade ) and ( h1 incomp h2 )))); + ') dnl end enable_mls