2 -- Regression Tests for Label Management
8 CREATE TABLE t1 (a int, b text);
9 INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'), (3, 'ccc');
10 CREATE TABLE t2 AS SELECT * FROM t1 WHERE a % 2 = 0;
12 CREATE FUNCTION f1 () RETURNS text
13 AS 'SELECT sepgsql_getcon()'
16 CREATE FUNCTION f2 () RETURNS text
17 AS 'SELECT sepgsql_getcon()'
19 SECURITY LABEL ON FUNCTION f2()
20 IS 'system_u:object_r:sepgsql_trusted_proc_exec_t:s0';
22 CREATE FUNCTION f3 () RETURNS text
24 RAISE EXCEPTION ''an exception from f3()'';
26 END;' LANGUAGE plpgsql;
27 SECURITY LABEL ON FUNCTION f3()
28 IS 'system_u:object_r:sepgsql_trusted_proc_exec_t:s0';
30 CREATE FUNCTION f4 () RETURNS text
31 AS 'SELECT sepgsql_getcon()'
33 SECURITY LABEL ON FUNCTION f4()
34 IS 'system_u:object_r:sepgsql_nosuch_trusted_proc_exec_t:s0';
36 CREATE FUNCTION f5 (text) RETURNS bool
37 AS 'SELECT sepgsql_setcon($1)'
39 SECURITY LABEL ON FUNCTION f5(text)
40 IS 'system_u:object_r:sepgsql_regtest_trusted_proc_exec_t:s0';
42 CREATE TABLE auth_tbl(uname text, credential text, label text);
44 VALUES ('foo', 'acbd18db4cc2f85cedef654fccc4a4d8', 'sepgsql_regtest_foo_t:s0'),
45 ('var', 'b2145aac704ce76dbe1ac7adac535b23', 'sepgsql_regtest_var_t:s0'),
46 ('baz', 'b2145aac704ce76dbe1ac7adac535b23', 'sepgsql_regtest_baz_t:s0');
47 SECURITY LABEL ON TABLE auth_tbl
48 IS 'system_u:object_r:sepgsql_secret_table_t:s0';
50 CREATE FUNCTION auth_func(text, text) RETURNS bool
52 AS 'SELECT sepgsql_setcon(regexp_replace(sepgsql_getcon(), ''_r:.*$'', ''_r:'' || label))
53 FROM auth_tbl WHERE uname = $1 AND credential = $2';
54 SECURITY LABEL ON FUNCTION auth_func(text,text)
55 IS 'system_u:object_r:sepgsql_regtest_trusted_proc_exec_t:s0';
57 CREATE TABLE foo_tbl(a int, b text);
58 INSERT INTO foo_tbl VALUES (1, 'aaa'), (2,'bbb'), (3,'ccc'), (4,'ddd');
59 SECURITY LABEL ON TABLE foo_tbl
60 IS 'system_u:object_r:sepgsql_regtest_foo_table_t:s0';
62 CREATE TABLE var_tbl(x int, y text);
63 INSERT INTO var_tbl VALUES (2,'xxx'), (3,'yyy'), (4,'zzz'), (5,'xyz');
64 SECURITY LABEL ON TABLE var_tbl
65 IS 'system_u:object_r:sepgsql_regtest_var_table_t:s0';
67 CREATE TABLE foo_ptbl(o int, p text) PARTITION BY RANGE (o);
68 CREATE TABLE foo_ptbl_ones PARTITION OF foo_ptbl FOR VALUES FROM ('0') TO ('10');
69 CREATE TABLE foo_ptbl_tens PARTITION OF foo_ptbl FOR VALUES FROM ('10') TO ('100');
71 INSERT INTO foo_ptbl VALUES (0, 'aaa'), (9,'bbb'), (10,'ccc'), (99,'ddd');
72 SECURITY LABEL ON TABLE foo_ptbl
73 IS 'system_u:object_r:sepgsql_regtest_foo_table_t:s0';
75 CREATE TABLE var_ptbl(q int, r text) PARTITION BY RANGE (q);
76 CREATE TABLE var_ptbl_ones PARTITION OF var_ptbl FOR VALUES FROM ('0') TO ('10');
77 CREATE TABLE var_ptbl_tens PARTITION OF var_ptbl FOR VALUES FROM ('10') TO ('100');
79 INSERT INTO var_ptbl VALUES (0,'xxx'), (9,'yyy'), (10,'zzz'), (99,'xyz');
80 SECURITY LABEL ON TABLE var_ptbl
81 IS 'system_u:object_r:sepgsql_regtest_var_table_t:s0';
84 -- Tests for default labeling behavior
86 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0
87 CREATE TABLE t3 (s int, t text);
88 INSERT INTO t3 VALUES (1, 'sss'), (2, 'ttt'), (3, 'uuu');
90 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_dba_t:s0
91 CREATE TABLE t4 (m int, n text);
92 INSERT INTO t4 VALUES (1,'mmm'), (2,'nnn'), (3,'ooo');
94 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0
95 CREATE TABLE tpart (o int, p text) PARTITION BY RANGE (o);
97 CREATE TABLE tpart_ones PARTITION OF tpart FOR VALUES FROM ('0') TO ('10');
98 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_dba_t:s0
99 CREATE TABLE tpart_tens PARTITION OF tpart FOR VALUES FROM ('10') TO ('100');
101 INSERT INTO tpart VALUES (0, 'aaa');
102 INSERT INTO tpart VALUES (9, 'bbb');
103 INSERT INTO tpart VALUES (99, 'ccc');
105 SELECT objtype, objname, label FROM pg_seclabels
106 WHERE provider = 'selinux' AND objtype = 'table' AND objname in ('t1', 't2', 't3',
110 ORDER BY objname COLLATE "C" ASC;
111 SELECT objtype, objname, label FROM pg_seclabels
112 WHERE provider = 'selinux' AND objtype = 'column' AND (objname like 't3.%'
113 OR objname like 't4.%'
114 OR objname like 'tpart.%'
115 OR objname like 'tpart_ones.%'
116 OR objname like 'tpart_tens.%')
117 ORDER BY objname COLLATE "C" ASC;
120 -- Tests for SECURITY LABEL
122 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_dba_t:s0
123 SECURITY LABEL ON TABLE t1
124 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- ok
125 SECURITY LABEL ON TABLE t2
126 IS 'invalid security context'; -- be failed
127 SECURITY LABEL ON COLUMN t2
128 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- be failed
129 SECURITY LABEL ON COLUMN t2.b
130 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- ok
131 SECURITY LABEL ON TABLE tpart
132 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- ok
133 SECURITY LABEL ON TABLE tpart
134 IS 'invalid security context'; -- failed
135 SECURITY LABEL ON COLUMN tpart
136 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- failed
137 SECURITY LABEL ON COLUMN tpart.o
138 IS 'system_u:object_r:sepgsql_ro_table_t:s0'; -- ok
141 -- Tests for Trusted Procedures
143 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0
144 SET sepgsql.debug_audit = true;
145 SET client_min_messages = log;
146 SELECT f1(); -- normal procedure
147 SELECT f2(); -- trusted procedure
148 SELECT f3(); -- trusted procedure that raises an error
149 SELECT f4(); -- failed on domain transition
150 SELECT sepgsql_getcon(); -- client's label must be restored
153 -- Test for Dynamic Domain Transition
156 -- validation of transaction aware dynamic-transition
157 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c25
158 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c15');
159 SELECT sepgsql_getcon();
161 SELECT sepgsql_setcon(NULL); -- failed to reset
162 SELECT sepgsql_getcon();
165 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c12');
166 SELECT sepgsql_getcon();
169 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c9');
170 SELECT sepgsql_getcon();
173 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c6');
174 SELECT sepgsql_getcon();
177 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c3');
178 SELECT sepgsql_getcon();
180 ROLLBACK TO SAVEPOINT svpt_2;
181 SELECT sepgsql_getcon(); -- should be 's0:c0.c9'
183 ROLLBACK TO SAVEPOINT svpt_1;
184 SELECT sepgsql_getcon(); -- should be 's0:c0.c12'
187 SELECT sepgsql_getcon(); -- should be 's0:c0.c15'
190 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c8');
191 SELECT sepgsql_getcon();
194 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c4');
195 SELECT sepgsql_getcon();
197 ROLLBACK TO SAVEPOINT svpt_1;
198 SELECT sepgsql_getcon(); -- should be 's0:c0.c8'
199 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0:c0.c6');
202 SELECT sepgsql_getcon(); -- should be 's0:c0.c6'
204 -- sepgsql_regtest_user_t is not available dynamic-transition,
205 -- unless sepgsql_setcon() is called inside of trusted-procedure
206 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0:c0.c15
208 -- sepgsql_regtest_user_t has no permission to switch current label
209 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0'); -- failed
210 SELECT sepgsql_getcon();
212 -- trusted procedure allows to switch, but unavailable to override MCS rules
213 SELECT f5('unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0:c0.c7'); -- OK
214 SELECT sepgsql_getcon();
216 SELECT f5('unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0:c0.c31'); -- Failed
217 SELECT sepgsql_getcon();
219 SELECT f5(NULL); -- Failed
220 SELECT sepgsql_getcon();
223 SELECT f5('unconfined_u:unconfined_r:sepgsql_regtest_user_t:s0:c0.c3'); -- OK
224 SELECT sepgsql_getcon();
227 SELECT sepgsql_getcon();
230 -- Test for simulation of typical connection pooling server
232 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_pool_t:s0
234 -- we shouldn't allow to switch client label without trusted procedure
235 SELECT sepgsql_setcon('unconfined_u:unconfined_r:sepgsql_regtest_foo_t:s0');
237 SELECT * FROM auth_tbl; -- failed, no permission to reference
240 SELECT auth_func('foo', 'acbd18db4cc2f85cedef654fccc4a4d8');
242 SELECT sepgsql_getcon();
244 SELECT * FROM foo_tbl; -- OK
245 SELECT * FROM foo_ptbl; -- OK
247 SELECT * FROM var_tbl; -- failed
248 SELECT * FROM var_ptbl; -- failed
250 SELECT * FROM auth_tbl; -- failed
252 SELECT sepgsql_setcon(NULL); -- end of session
253 SELECT sepgsql_getcon();
255 -- the pooler cannot touch these tables directly
256 SELECT * FROM foo_tbl; -- failed
257 SELECT * FROM foo_ptbl; -- failed
259 SELECT * FROM var_tbl; -- failed
260 SELECT * FROM var_ptbl; -- failed
263 SELECT auth_func('var', 'b2145aac704ce76dbe1ac7adac535b23');
265 SELECT sepgsql_getcon();
267 SELECT * FROM foo_tbl; -- failed
268 SELECT * FROM foo_ptbl; -- failed
270 SELECT * FROM var_tbl; -- OK
271 SELECT * FROM var_ptbl; -- OK
273 SELECT * FROM auth_tbl; -- failed
275 SELECT sepgsql_setcon(NULL); -- end of session
278 SELECT auth_func('var', 'invalid credential'); -- not works
279 SELECT sepgsql_getcon();
284 -- @SECURITY-CONTEXT=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0-s0:c0.c255
285 DROP TABLE IF EXISTS t1 CASCADE;
286 DROP TABLE IF EXISTS t2 CASCADE;
287 DROP TABLE IF EXISTS t3 CASCADE;
288 DROP TABLE IF EXISTS t4 CASCADE;
289 DROP TABLE IF EXISTS tpart CASCADE;
290 DROP FUNCTION IF EXISTS f1() CASCADE;
291 DROP FUNCTION IF EXISTS f2() CASCADE;
292 DROP FUNCTION IF EXISTS f3() CASCADE;
293 DROP FUNCTION IF EXISTS f4() CASCADE;
294 DROP FUNCTION IF EXISTS f5(text) CASCADE;