Merge pull request #607 from bluca/mempressure

Add support for memory pressure notifications protocol
This commit is contained in:
Chris PeBenito 2023-05-18 09:13:34 -04:00 committed by GitHub
commit 429b26878b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 132 additions and 41 deletions

View File

@ -725,10 +725,10 @@ interface(`fs_manage_bpf_files',`
# #
interface(`fs_mount_cgroup', ` interface(`fs_mount_cgroup', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:filesystem mount; allow $1 cgroup_types:filesystem mount;
') ')
######################################## ########################################
@ -743,10 +743,10 @@ interface(`fs_mount_cgroup', `
# #
interface(`fs_remount_cgroup', ` interface(`fs_remount_cgroup', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:filesystem remount; allow $1 cgroup_types:filesystem remount;
') ')
######################################## ########################################
@ -761,10 +761,10 @@ interface(`fs_remount_cgroup', `
# #
interface(`fs_unmount_cgroup', ` interface(`fs_unmount_cgroup', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:filesystem unmount; allow $1 cgroup_types:filesystem unmount;
') ')
######################################## ########################################
@ -779,10 +779,10 @@ interface(`fs_unmount_cgroup', `
# #
interface(`fs_getattr_cgroup',` interface(`fs_getattr_cgroup',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:filesystem getattr; allow $1 cgroup_types:filesystem getattr;
') ')
######################################## ########################################
@ -797,10 +797,10 @@ interface(`fs_getattr_cgroup',`
# #
interface(`fs_search_cgroup_dirs',` interface(`fs_search_cgroup_dirs',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
search_dirs_pattern($1, cgroup_t, cgroup_t) search_dirs_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -816,10 +816,10 @@ interface(`fs_search_cgroup_dirs',`
# #
interface(`fs_list_cgroup_dirs', ` interface(`fs_list_cgroup_dirs', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
list_dirs_pattern($1, cgroup_t, cgroup_t) list_dirs_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -873,10 +873,10 @@ interface(`fs_create_cgroup_dirs',`
# #
interface(`fs_delete_cgroup_dirs', ` interface(`fs_delete_cgroup_dirs', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
delete_dirs_pattern($1, cgroup_t, cgroup_t) delete_dirs_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -892,11 +892,11 @@ interface(`fs_delete_cgroup_dirs', `
# #
interface(`fs_manage_cgroup_dirs',` interface(`fs_manage_cgroup_dirs',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
manage_dirs_pattern($1, cgroup_t, cgroup_t) manage_dirs_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -912,10 +912,10 @@ interface(`fs_manage_cgroup_dirs',`
# #
interface(`fs_relabel_cgroup_dirs',` interface(`fs_relabel_cgroup_dirs',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
relabel_dirs_pattern($1, cgroup_t, cgroup_t) relabel_dirs_pattern($1, cgroup_types, cgroup_types)
') ')
######################################## ########################################
@ -930,10 +930,10 @@ interface(`fs_relabel_cgroup_dirs',`
# #
interface(`fs_getattr_cgroup_files',` interface(`fs_getattr_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
getattr_files_pattern($1, cgroup_t, cgroup_t) getattr_files_pattern($1, cgroup_types, cgroup_types)
fs_search_tmpfs($1) fs_search_tmpfs($1)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -950,12 +950,12 @@ interface(`fs_getattr_cgroup_files',`
# #
interface(`fs_read_cgroup_files',` interface(`fs_read_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
read_files_pattern($1, cgroup_t, cgroup_t) read_files_pattern($1, cgroup_types, cgroup_types)
read_lnk_files_pattern($1, cgroup_t, cgroup_t) read_lnk_files_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -991,11 +991,11 @@ interface(`fs_create_cgroup_files',`
# #
interface(`fs_watch_cgroup_files',` interface(`fs_watch_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:file watch; allow $1 cgroup_types:file watch;
') ')
######################################## ########################################
@ -1010,11 +1010,11 @@ interface(`fs_watch_cgroup_files',`
# #
interface(`fs_create_cgroup_links',` interface(`fs_create_cgroup_links',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
create_lnk_files_pattern($1, cgroup_t, cgroup_t) create_lnk_files_pattern($1, cgroup_types, cgroup_types)
rw_lnk_files_pattern($1, cgroup_t, cgroup_t) rw_lnk_files_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -1030,10 +1030,10 @@ interface(`fs_create_cgroup_links',`
# #
interface(`fs_write_cgroup_files', ` interface(`fs_write_cgroup_files', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
write_files_pattern($1, cgroup_t, cgroup_t) write_files_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -1049,11 +1049,11 @@ interface(`fs_write_cgroup_files', `
# #
interface(`fs_rw_cgroup_files',` interface(`fs_rw_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
rw_files_pattern($1, cgroup_t, cgroup_t) rw_files_pattern($1, cgroup_types, cgroup_types)
read_lnk_files_pattern($1, cgroup_t, cgroup_t) read_lnk_files_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -1071,10 +1071,10 @@ interface(`fs_rw_cgroup_files',`
# #
interface(`fs_dontaudit_rw_cgroup_files',` interface(`fs_dontaudit_rw_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
dontaudit $1 cgroup_t:file rw_file_perms; dontaudit $1 cgroup_types:file rw_file_perms;
') ')
######################################## ########################################
@ -1089,11 +1089,11 @@ interface(`fs_dontaudit_rw_cgroup_files',`
# #
interface(`fs_manage_cgroup_files',` interface(`fs_manage_cgroup_files',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
manage_files_pattern($1, cgroup_t, cgroup_t) manage_files_pattern($1, cgroup_types, cgroup_types)
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
@ -1109,10 +1109,10 @@ interface(`fs_manage_cgroup_files',`
# #
interface(`fs_relabel_cgroup_symlinks',` interface(`fs_relabel_cgroup_symlinks',`
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
relabel_lnk_files_pattern($1, cgroup_t, cgroup_t) relabel_lnk_files_pattern($1, cgroup_types, cgroup_types)
') ')
######################################## ########################################
@ -1145,10 +1145,28 @@ interface(`fs_watch_cgroup_dirs', `
# #
interface(`fs_mounton_cgroup', ` interface(`fs_mounton_cgroup', `
gen_require(` gen_require(`
type cgroup_t; attribute cgroup_types;
') ')
allow $1 cgroup_t:dir mounton; allow $1 cgroup_types:dir mounton;
')
########################################
## <summary>
## Mount on cgroup files.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
#
interface(`fs_mounton_cgroup_files', `
gen_require(`
attribute cgroup_types;
')
allow $1 cgroup_types:file mounton;
') ')
######################################## ########################################
@ -1187,6 +1205,53 @@ interface(`fs_cgroup_filetrans',`
dev_search_sysfs($1) dev_search_sysfs($1)
') ')
########################################
## <summary>
## Create an object in a cgroup tmpfs filesystem, with the memory_pressure_t
## type using a type transition.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
## <param name="object">
## <summary>
## The object class of the object being created.
## </summary>
## </param>
## <param name="name" optional="true">
## <summary>
## The name of the object being created.
## </summary>
## </param>
#
interface(`fs_cgroup_filetrans_memory_pressure',`
gen_require(`
type memory_pressure_t;
')
fs_cgroup_filetrans($1, memory_pressure_t, $2, $3)
')
########################################
## <summary>
## Allow managing a cgroup's memory.pressure file to get notifications
## </summary>
## <param name="domain">
## <summary>
## Source domain
## </summary>
## </param>
#
interface(`fs_watch_memory_pressure',`
gen_require(`
type memory_pressure_t;
')
allow $1 memory_pressure_t:file { rw_file_perms setattr };
')
######################################## ########################################
## <summary> ## <summary>
## Do not audit attempts to read ## Do not audit attempts to read

View File

@ -86,12 +86,20 @@ fs_type(capifs_t)
files_mountpoint(capifs_t) files_mountpoint(capifs_t)
genfscon capifs / gen_context(system_u:object_r:capifs_t,s0) genfscon capifs / gen_context(system_u:object_r:capifs_t,s0)
attribute cgroup_types;
type cgroup_t; type cgroup_t;
typeattribute cgroup_t cgroup_types;
fs_type(cgroup_t) fs_type(cgroup_t)
files_mountpoint(cgroup_t) files_mountpoint(cgroup_t)
dev_associate_sysfs(cgroup_t) dev_associate_sysfs(cgroup_t)
genfscon cgroup / gen_context(system_u:object_r:cgroup_t,s0) genfscon cgroup / gen_context(system_u:object_r:cgroup_t,s0)
genfscon cgroup2 / gen_context(system_u:object_r:cgroup_t,s0) genfscon cgroup2 / gen_context(system_u:object_r:cgroup_t,s0)
# When running under systemd, the cgroup file memory.pressure will have this
# separate label, to allow unprivileged process to access it without accessing
# the rest of the cgroup tree.
type memory_pressure_t;
typeattribute memory_pressure_t cgroup_types;
dev_associate_sysfs(memory_pressure_t)
type configfs_t; type configfs_t;
fs_type(configfs_t) fs_type(configfs_t)

View File

@ -156,6 +156,7 @@ ifdef(`init_systemd',`
allow ntpd_t self:capability { fowner setpcap }; allow ntpd_t self:capability { fowner setpcap };
init_read_state(ntpd_t) init_read_state(ntpd_t)
init_reload(ntpd_t) init_reload(ntpd_t)
fs_watch_memory_pressure(ntpd_t)
# for /var/lib/systemd/clock # for /var/lib/systemd/clock
init_list_var_lib_dirs(ntpd_t) init_list_var_lib_dirs(ntpd_t)

View File

@ -1171,6 +1171,16 @@ ifdef(`init_systemd',`
systemd_start_power_units(initrc_t) systemd_start_power_units(initrc_t)
systemd_watch_networkd_runtime_dirs(initrc_t) systemd_watch_networkd_runtime_dirs(initrc_t)
# Ensures the memory.pressure cgroup file is labelled differently, so
# that processes can manage it without having access to the rest of the
# cgroup tree. This is a special file so each open is an independent,
# separate instance that cannot affect already opened ones, so it is not
# necessary to lock it down on a process-by-process base. This is useful
# to allow receiving notifications when memory pressure is high, see:
# https://systemd.io/MEMORY_PRESSURE/
fs_cgroup_filetrans_memory_pressure(init_t, file, "memory.pressure")
fs_mounton_cgroup_files(init_t)
optional_policy(` optional_policy(`
# create /var/lock/lvm/ # create /var/lock/lvm/
lvm_create_lock_dirs(initrc_t) lvm_create_lock_dirs(initrc_t)

View File

@ -549,6 +549,7 @@ ifdef(`init_systemd',`
domain_read_all_domains_state(syslogd_t) domain_read_all_domains_state(syslogd_t)
fs_list_cgroup_dirs(syslogd_t) fs_list_cgroup_dirs(syslogd_t)
fs_watch_memory_pressure(syslogd_t)
init_create_runtime_dirs(syslogd_t) init_create_runtime_dirs(syslogd_t)
init_daemon_runtime_file(syslogd_runtime_t, dir, "syslogd") init_daemon_runtime_file(syslogd_runtime_t, dir, "syslogd")

View File

@ -873,6 +873,7 @@ fs_read_efivarfs_files(systemd_logind_t)
fs_relabelfrom_tmpfs_dirs(systemd_logind_t) fs_relabelfrom_tmpfs_dirs(systemd_logind_t)
fs_unmount_tmpfs(systemd_logind_t) fs_unmount_tmpfs(systemd_logind_t)
fs_getattr_xattr_fs(systemd_logind_t) fs_getattr_xattr_fs(systemd_logind_t)
fs_watch_memory_pressure(systemd_logind_t)
selinux_use_status_page(systemd_logind_t) selinux_use_status_page(systemd_logind_t)
@ -1020,6 +1021,7 @@ fs_getattr_cgroup(systemd_machined_t)
fs_getattr_tmpfs(systemd_machined_t) fs_getattr_tmpfs(systemd_machined_t)
fs_getattr_xattr_fs(systemd_machined_t) fs_getattr_xattr_fs(systemd_machined_t)
fs_read_nsfs_files(systemd_machined_t) fs_read_nsfs_files(systemd_machined_t)
fs_watch_memory_pressure(systemd_machined_t)
selinux_getattr_fs(systemd_machined_t) selinux_getattr_fs(systemd_machined_t)
@ -1126,6 +1128,7 @@ files_list_runtime(systemd_networkd_t)
fs_getattr_all_fs(systemd_networkd_t) fs_getattr_all_fs(systemd_networkd_t)
fs_search_cgroup_dirs(systemd_networkd_t) fs_search_cgroup_dirs(systemd_networkd_t)
fs_read_nsfs_files(systemd_networkd_t) fs_read_nsfs_files(systemd_networkd_t)
fs_watch_memory_pressure(systemd_networkd_t)
auth_use_nsswitch(systemd_networkd_t) auth_use_nsswitch(systemd_networkd_t)
@ -1248,6 +1251,7 @@ fs_mount_tmpfs(systemd_nspawn_t)
fs_remount_tmpfs(systemd_nspawn_t) fs_remount_tmpfs(systemd_nspawn_t)
fs_remount_xattr_fs(systemd_nspawn_t) fs_remount_xattr_fs(systemd_nspawn_t)
fs_read_cgroup_files(systemd_nspawn_t) fs_read_cgroup_files(systemd_nspawn_t)
fs_watch_memory_pressure(systemd_nspawn_t)
term_getattr_generic_ptys(systemd_nspawn_t) term_getattr_generic_ptys(systemd_nspawn_t)
term_getattr_pty_fs(systemd_nspawn_t) term_getattr_pty_fs(systemd_nspawn_t)
@ -1505,6 +1509,7 @@ fs_getattr_all_fs(systemd_resolved_t)
fs_search_cgroup_dirs(systemd_resolved_t) fs_search_cgroup_dirs(systemd_resolved_t)
fs_search_tmpfs(systemd_resolved_t) fs_search_tmpfs(systemd_resolved_t)
fs_search_ramfs(systemd_resolved_t) fs_search_ramfs(systemd_resolved_t)
fs_watch_memory_pressure(systemd_resolved_t)
init_dgram_send(systemd_resolved_t) init_dgram_send(systemd_resolved_t)

View File

@ -143,6 +143,7 @@ fs_read_cgroup_files(udev_t)
fs_rw_anon_inodefs_files(udev_t) fs_rw_anon_inodefs_files(udev_t)
fs_search_tracefs(udev_t) fs_search_tracefs(udev_t)
fs_manage_efivarfs_files(udev_t) fs_manage_efivarfs_files(udev_t)
fs_watch_memory_pressure(udev_t)
mls_file_read_all_levels(udev_t) mls_file_read_all_levels(udev_t)
mls_file_write_all_levels(udev_t) mls_file_write_all_levels(udev_t)