]> git.ipfire.org Git - people/stevee/selinux-policy.git/blame - policy/modules/services/postgresql.te
trunk: Enable open permission checks policy capability.
[people/stevee/selinux-policy.git] / policy / modules / services / postgresql.te
CommitLineData
a1fcff33 1
5d4f4b53 2policy_module(postgresql, 1.7.0)
e8cb08ae
CP
3
4gen_require(`
5 class db_database all_db_database_perms;
6 class db_table all_db_table_perms;
7 class db_procedure all_db_procedure_perms;
8 class db_column all_db_column_perms;
9 class db_tuple all_db_tuple_perms;
10 class db_blob all_db_blob_perms;
11')
a1fcff33
CP
12
13#################################
14#
15# Declarations
16#
e8cb08ae
CP
17
18## <desc>
19## <p>
20## Allow unprived users to execute DDL statement
21## </p>
22## </desc>
23gen_tunable(sepgsql_enable_users_ddl, true)
24
a1fcff33
CP
25type postgresql_t;
26type postgresql_exec_t;
0bfccda4 27init_daemon_domain(postgresql_t, postgresql_exec_t)
a1fcff33
CP
28
29type postgresql_db_t;
30files_type(postgresql_db_t)
31
9bbc757a
CP
32type postgresql_etc_t;
33files_config_file(postgresql_etc_t)
a1fcff33
CP
34
35type postgresql_lock_t;
36files_lock_file(postgresql_lock_t)
37
38type postgresql_log_t;
39logging_log_file(postgresql_log_t)
40
41type postgresql_tmp_t;
42files_tmp_file(postgresql_tmp_t)
43
44type postgresql_var_run_t;
45files_pid_file(postgresql_var_run_t)
46
e8cb08ae
CP
47# database clients attribute
48attribute sepgsql_client_type;
49attribute sepgsql_unconfined_type;
50
51# database objects attribute
52attribute sepgsql_database_type;
53attribute sepgsql_table_type;
54attribute sepgsql_sysobj_table_type;
55attribute sepgsql_procedure_type;
56attribute sepgsql_blob_type;
57attribute sepgsql_module_type;
58
59# database object types
60type sepgsql_blob_t;
61postgresql_blob_object(sepgsql_blob_t)
62
63type sepgsql_db_t;
64postgresql_database_object(sepgsql_db_t)
65
66type sepgsql_fixed_table_t;
67postgresql_table_object(sepgsql_fixed_table_t)
68
69type sepgsql_proc_t;
70postgresql_procedure_object(sepgsql_proc_t)
71
72type sepgsql_ro_blob_t;
73postgresql_blob_object(sepgsql_ro_blob_t)
74
75type sepgsql_ro_table_t;
76postgresql_table_object(sepgsql_ro_table_t)
77
78type sepgsql_secret_blob_t;
79postgresql_blob_object(sepgsql_secret_blob_t)
80
81type sepgsql_secret_table_t;
82postgresql_table_object(sepgsql_secret_table_t)
83
84type sepgsql_sysobj_t;
85postgresql_system_table_object(sepgsql_sysobj_t)
86
87type sepgsql_table_t;
88postgresql_table_object(sepgsql_table_t)
89
7f4005e3
CP
90type sepgsql_trusted_proc_exec_t;
91postgresql_procedure_object(sepgsql_trusted_proc_exec_t)
e8cb08ae
CP
92
93# Trusted Procedure Domain
7f4005e3
CP
94type sepgsql_trusted_proc_t;
95domain_type(sepgsql_trusted_proc_t)
96postgresql_unconfined(sepgsql_trusted_proc_t)
97role system_r types sepgsql_trusted_proc_t;
e8cb08ae 98
a1fcff33
CP
99########################################
100#
101# postgresql Local policy
102#
103allow postgresql_t self:capability { kill dac_override dac_read_search chown fowner fsetid setuid setgid sys_nice sys_tty_config sys_admin };
165b42d2 104dontaudit postgresql_t self:capability { sys_tty_config sys_admin };
57d8e6c7 105allow postgresql_t self:process signal_perms;
0b36a214 106allow postgresql_t self:fifo_file rw_fifo_file_perms;
a1fcff33
CP
107allow postgresql_t self:sem create_sem_perms;
108allow postgresql_t self:shm create_shm_perms;
109allow postgresql_t self:tcp_socket create_stream_socket_perms;
110allow postgresql_t self:udp_socket create_stream_socket_perms;
111allow postgresql_t self:unix_dgram_socket create_socket_perms;
112allow postgresql_t self:unix_stream_socket create_stream_socket_perms;
e8cb08ae
CP
113allow postgresql_t self:netlink_selinux_socket create_socket_perms;
114
115allow postgresql_t sepgsql_database_type:db_database *;
116type_transition postgresql_t postgresql_t:db_database sepgsql_db_t;
117
118allow postgresql_t sepgsql_module_type:db_database install_module;
119# Database/Loadable module
120allow sepgsql_database_type sepgsql_module_type:db_database load_module;
121
122allow postgresql_t sepgsql_table_type:{ db_table db_column db_tuple } *;
123type_transition postgresql_t sepgsql_database_type:db_table sepgsql_sysobj_t;
124
125allow postgresql_t sepgsql_procedure_type:db_procedure *;
126type_transition postgresql_t sepgsql_database_type:db_procedure sepgsql_proc_t;
127
128allow postgresql_t sepgsql_blob_type:db_blob *;
129type_transition postgresql_t sepgsql_database_type:db_blob sepgsql_blob_t;
a1fcff33 130
0bfccda4
CP
131manage_dirs_pattern(postgresql_t, postgresql_db_t, postgresql_db_t)
132manage_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t)
133manage_lnk_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t)
134manage_fifo_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t)
135manage_sock_files_pattern(postgresql_t, postgresql_db_t, postgresql_db_t)
103fe280 136files_var_lib_filetrans(postgresql_t, postgresql_db_t, { dir file lnk_file sock_file fifo_file })
a1fcff33 137
c0868a7a 138allow postgresql_t postgresql_etc_t:dir list_dir_perms;
0bfccda4
CP
139read_files_pattern(postgresql_t, postgresql_etc_t, postgresql_etc_t)
140read_lnk_files_pattern(postgresql_t, postgresql_etc_t, postgresql_etc_t)
a1fcff33
CP
141
142allow postgresql_t postgresql_exec_t:lnk_file { getattr read };
143can_exec(postgresql_t, postgresql_exec_t )
144
c0868a7a 145allow postgresql_t postgresql_lock_t:file manage_file_perms;
1c1ac67f 146files_lock_filetrans(postgresql_t,postgresql_lock_t,file)
a1fcff33 147
0bfccda4
CP
148manage_files_pattern(postgresql_t, postgresql_log_t, postgresql_log_t)
149logging_log_filetrans(postgresql_t, postgresql_log_t, { file dir })
a1fcff33 150
0bfccda4
CP
151manage_dirs_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t)
152manage_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t)
153manage_lnk_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t)
154manage_fifo_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t)
155manage_sock_files_pattern(postgresql_t, postgresql_tmp_t, postgresql_tmp_t)
103fe280
CP
156files_tmp_filetrans(postgresql_t, postgresql_tmp_t, { dir file sock_file })
157fs_tmpfs_filetrans(postgresql_t, postgresql_tmp_t, { dir file lnk_file sock_file fifo_file })
a1fcff33 158
0bfccda4
CP
159manage_files_pattern(postgresql_t, postgresql_var_run_t, postgresql_var_run_t)
160manage_sock_files_pattern(postgresql_t, postgresql_var_run_t, postgresql_var_run_t)
161files_pid_filetrans(postgresql_t, postgresql_var_run_t, file)
a1fcff33 162
445522dc 163kernel_read_kernel_sysctls(postgresql_t)
a1fcff33
CP
164kernel_read_system_state(postgresql_t)
165kernel_list_proc(postgresql_t)
445522dc 166kernel_read_all_sysctls(postgresql_t)
a1fcff33 167kernel_read_proc_symlinks(postgresql_t)
a1fcff33 168
19006686
CP
169corenet_all_recvfrom_unlabeled(postgresql_t)
170corenet_all_recvfrom_netlabel(postgresql_t)
a1fcff33
CP
171corenet_tcp_sendrecv_all_if(postgresql_t)
172corenet_udp_sendrecv_all_if(postgresql_t)
a1fcff33
CP
173corenet_tcp_sendrecv_all_nodes(postgresql_t)
174corenet_udp_sendrecv_all_nodes(postgresql_t)
a1fcff33
CP
175corenet_tcp_sendrecv_all_ports(postgresql_t)
176corenet_udp_sendrecv_all_ports(postgresql_t)
177corenet_tcp_bind_all_nodes(postgresql_t)
a1fcff33
CP
178corenet_tcp_bind_postgresql_port(postgresql_t)
179corenet_tcp_connect_auth_port(postgresql_t)
141cffdd
CP
180corenet_sendrecv_postgresql_server_packets(postgresql_t)
181corenet_sendrecv_auth_client_packets(postgresql_t)
a1fcff33
CP
182
183dev_read_sysfs(postgresql_t)
184dev_read_urand(postgresql_t)
185
186fs_getattr_all_fs(postgresql_t)
187fs_search_auto_mountpoints(postgresql_t)
770c015f 188fs_rw_hugetlbfs_files(postgresql_t)
a1fcff33 189
e8cb08ae
CP
190selinux_get_enforce_mode(postgresql_t)
191selinux_validate_context(postgresql_t)
192selinux_compute_access_vector(postgresql_t)
193selinux_compute_create_context(postgresql_t)
194selinux_compute_relabel_context(postgresql_t)
195
a1fcff33 196term_use_controlling_term(postgresql_t)
a1fcff33
CP
197
198corecmd_exec_bin(postgresql_t)
a1fcff33
CP
199corecmd_exec_shell(postgresql_t)
200
1815bad1 201domain_dontaudit_list_all_domains_state(postgresql_t)
15722ec9 202domain_use_interactive_fds(postgresql_t)
a1fcff33
CP
203
204files_dontaudit_search_home(postgresql_t)
205files_manage_etc_files(postgresql_t)
206files_search_etc(postgresql_t)
207files_read_etc_runtime_files(postgresql_t)
208files_read_usr_files(postgresql_t)
209
09e21686
CP
210auth_use_nsswitch(postgresql_t)
211
68228b33 212init_read_utmp(postgresql_t)
a1fcff33
CP
213
214libs_use_ld_so(postgresql_t)
215libs_use_shared_libs(postgresql_t)
216
217logging_send_syslog_msg(postgresql_t)
218
219miscfiles_read_localization(postgresql_t)
220
e8cb08ae 221seutil_libselinux_linked(postgresql_t)
a1fcff33 222
15722ec9 223userdom_dontaudit_use_unpriv_user_fds(postgresql_t)
a1fcff33
CP
224
225mta_getattr_spool(postgresql_t)
226
e9c6cda7
CP
227sysadm_dontaudit_search_home_dirs(postgresql_t)
228sysadm_dontaudit_use_ttys(postgresql_t)
229
a1fcff33
CP
230tunable_policy(`allow_execmem',`
231 allow postgresql_t self:process execmem;
232')
233
bb7170f6 234optional_policy(`
a1fcff33
CP
235 consoletype_exec(postgresql_t)
236')
237
bb7170f6 238optional_policy(`
a1fcff33
CP
239 cron_search_spool(postgresql_t)
240 cron_system_entry(postgresql_t,postgresql_exec_t)
241')
242
bb7170f6 243optional_policy(`
a1fcff33
CP
244 hostname_exec(postgresql_t)
245')
246
0b6acad1
CP
247optional_policy(`
248 ipsec_match_default_spd(postgresql_t)
249')
250
bb7170f6 251optional_policy(`
a1fcff33
CP
252 kerberos_use(postgresql_t)
253')
254
bb7170f6 255optional_policy(`
a1fcff33
CP
256 seutil_sigchld_newrole(postgresql_t)
257')
258
bb7170f6 259optional_policy(`
a1fcff33
CP
260 udev_read_db(postgresql_t)
261')
e8cb08ae
CP
262
263########################################
264#
265# Rules common to all clients
266#
267
268allow sepgsql_client_type sepgsql_db_t:db_database { getattr access get_param set_param };
269type_transition sepgsql_client_type sepgsql_client_type:db_database sepgsql_db_t;
270
271allow sepgsql_client_type sepgsql_fixed_table_t:db_table { getattr use select insert };
272allow sepgsql_client_type sepgsql_fixed_table_t:db_column { getattr use select insert };
273allow sepgsql_client_type sepgsql_fixed_table_t:db_tuple { use select insert };
274
275allow sepgsql_client_type sepgsql_table_t:db_table { getattr use select update insert delete };
276allow sepgsql_client_type sepgsql_table_t:db_column { getattr use select update insert };
277allow sepgsql_client_type sepgsql_table_t:db_tuple { use select update insert delete };
278
279allow sepgsql_client_type sepgsql_ro_table_t:db_table { getattr use select };
280allow sepgsql_client_type sepgsql_ro_table_t:db_column { getattr use select };
281allow sepgsql_client_type sepgsql_ro_table_t:db_tuple { use select };
282
283allow sepgsql_client_type sepgsql_secret_table_t:db_table getattr;
284allow sepgsql_client_type sepgsql_secret_table_t:db_column getattr;
285
286allow sepgsql_client_type sepgsql_sysobj_t:db_table { getattr use select };
287allow sepgsql_client_type sepgsql_sysobj_t:db_column { getattr use select };
288allow sepgsql_client_type sepgsql_sysobj_t:db_tuple { use select };
289
290allow sepgsql_client_type sepgsql_proc_t:db_procedure { getattr execute };
291allow sepgsql_client_type sepgsql_trusted_proc_t:db_procedure { getattr execute entrypoint };
292
293allow sepgsql_client_type sepgsql_blob_t:db_blob { create drop getattr setattr read write };
294allow sepgsql_client_type sepgsql_ro_blob_t:db_blob { getattr read };
295allow sepgsql_client_type sepgsql_secret_blob_t:db_blob getattr;
296
297# The purpose of the dontaudit rule in row-level access control is to prevent a flood of logs.
298# If a client tries to SELECT a table including violated tuples, these are filtered from
299# the result set as if not exist, but its access denied longs can be recorded within log files.
300# In generally, the number of tuples are much larger than the number of columns, tables and so on.
301# So, it makes a flood of logs when many tuples are violated.
302#
303# The default policy does not prevent anything for sepgsql_client_type sepgsql_unconfined_type,
304# so we don't need "dontaudit" rules in Type-Enforcement. However, MLS/MCS can prevent them
305# to access classified tuples and can make a audit record.
306#
307# Therefore, the following rule is applied for any domains which can connect SE-PostgreSQL.
308dontaudit { postgresql_t sepgsql_client_type sepgsql_unconfined_type } { sepgsql_table_type -sepgsql_sysobj_table_type }:db_tuple { use select update insert delete };
309
310tunable_policy(`sepgsql_enable_users_ddl',`
0bfccda4 311 allow sepgsql_client_type sepgsql_table_t:db_table { create drop setattr };
e8cb08ae 312 allow sepgsql_client_type sepgsql_table_t:db_column { create drop setattr };
0bfccda4 313 allow sepgsql_client_type sepgsql_sysobj_t:db_tuple { update insert delete };
e8cb08ae
CP
314')
315
316########################################
317#
318# Unconfined access to this module
319#
320
321allow sepgsql_unconfined_type sepgsql_database_type:db_database *;
322type_transition sepgsql_unconfined_type sepgsql_unconfined_type:db_database sepgsql_db_t;
323
324type_transition sepgsql_unconfined_type sepgsql_database_type:db_table sepgsql_table_t;
325type_transition sepgsql_unconfined_type sepgsql_database_type:db_procedure sepgsql_proc_t;
326type_transition sepgsql_unconfined_type sepgsql_database_type:db_blob sepgsql_blob_t;
327
328allow sepgsql_unconfined_type sepgsql_table_type:{ db_table db_column db_tuple } *;
329
330# unconfined domain is not allowed to invoke user defined procedure directly.
331# They have to confirm and relabel it at first.
332allow sepgsql_unconfined_type { sepgsql_proc_t sepgsql_trusted_proc_t }:db_procedure *;
333allow sepgsql_unconfined_type sepgsql_procedure_type:db_procedure { create drop getattr setattr relabelfrom relabelto };
334
335allow sepgsql_unconfined_type sepgsql_blob_type:db_blob *;
336
337allow sepgsql_unconfined_type sepgsql_module_type:db_database install_module;
338
339kernel_relabelfrom_unlabeled_database(sepgsql_unconfined_type)