commit: 12977dbcd922fd1bc6175ed523033d08133e7718
Author: Kenton Groombridge <me <AT> concord <DOT> sh>
AuthorDate: Fri Dec 31 19:47:00 2021 +0000
Commit: Jason Zaman <perfinion <AT> gentoo <DOT> org>
CommitDate: Sun Jan 30 01:12:42 2022 +0000
URL:
https://gitweb.gentoo.org/proj/hardened-refpolicy.git/commit/?id=12977dbc
container, podman: add policy for conmon
Make conmon run in a separate domain and allow podman types to
transition to it.
Signed-off-by: Kenton Groombridge <me <AT> concord.sh>
Signed-off-by: Jason Zaman <perfinion <AT> gentoo.org>
policy/modules/services/container.if | 406 +++++++++++++++++++++++++++++++++++
policy/modules/services/podman.fc | 1 +
policy/modules/services/podman.if | 98 +++++++++
policy/modules/services/podman.te | 162 +++++++++++++-
4 files changed, 665 insertions(+), 2 deletions(-)
diff --git a/policy/modules/services/container.if
b/policy/modules/services/container.if
index 92b5a2f7..1c1950c7 100644
--- a/policy/modules/services/container.if
+++ b/policy/modules/services/container.if
@@ -356,6 +356,52 @@ interface(`container_engine_executable_file',`
application_executable_file($1)
')
+########################################
+## <summary>
+## Execute a generic container engine
+## executable with an automatic transition
+## to a private type.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+## <param name="target_domain">
+## <summary>
+## The type of the new process.
+## </summary>
+## </param>
+#
+interface(`container_generic_engine_domtrans',`
+ gen_require(`
+ type container_engine_exec_t;
+ ')
+
+ corecmd_search_bin($1)
+ domtrans_pattern($1, container_engine_exec_t, $2)
+')
+
+########################################
+## <summary>
+## Allow the generic container engine
+## executables to be an entrypoint
+## for the specified domain.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_engine_executable_entrypoint',`
+ gen_require(`
+ type container_engine_exec_t;
+ ')
+
+ allow $1 container_engine_exec_t:file entrypoint;
+')
+
########################################
## <summary>
## Send and receive messages from
@@ -377,6 +423,115 @@ interface(`container_engine_dbus_chat',`
allow container_engine_domain $1:dbus send_msg;
')
+########################################
+## <summary>
+## Allow the specified domain to manage
+## container engine temporary files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_engine_tmp_files',`
+ gen_require(`
+ type container_engine_tmp_t;
+ ')
+
+ files_search_tmp($1)
+ allow $1 container_engine_tmp_t:file manage_file_perms;
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## container engine temporary named sockets.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_engine_tmp_sock_files',`
+ gen_require(`
+ type container_engine_tmp_t;
+ ')
+
+ files_search_tmp($1)
+ allow $1 container_engine_tmp_t:sock_file manage_sock_file_perms;
+')
+
+########################################
+## <summary>
+## Allow the specified domain to create
+## objects in generic temporary directories
+## with an automatic type transition to
+## the container engine temporary file type.
+## </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(`container_engine_tmp_filetrans',`
+ gen_require(`
+ type container_engine_tmp_t;
+ ')
+
+ files_tmp_filetrans($1, container_engine_tmp_t, $2, $3)
+')
+
+########################################
+## <summary>
+## Read the process state (/proc/pid)
+## of all system containers.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_read_system_container_state',`
+ gen_require(`
+ attribute container_system_domain;
+ ')
+
+ ps_process_pattern($1, container_system_domain)
+')
+
+########################################
+## <summary>
+## Read the process state (/proc/pid)
+## of all user containers.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_read_user_container_state',`
+ gen_require(`
+ attribute container_user_domain;
+ ')
+
+ ps_process_pattern($1, container_user_domain)
+')
+
########################################
## <summary>
## All of the permissions necessary
@@ -611,6 +766,25 @@ interface(`container_manage_sock_files',`
manage_sock_files_pattern($1, container_file_t, container_file_t)
')
+########################################
+## <summary>
+## Allow the specified domain to read
+## and write container chr files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_rw_chr_files',`
+ gen_require(`
+ type container_file_t;
+ ')
+
+ allow $1 container_file_t:chr_file rw_chr_file_perms;
+')
+
########################################
## <summary>
## Do not audit attempts to read
@@ -701,6 +875,65 @@ interface(`container_config_home_filetrans',`
xdg_config_filetrans($1, container_conf_home_t, $2, $3)
')
+########################################
+## <summary>
+## Allow the specified domain to
+## manage container data home files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_home_data_files',`
+ gen_require(`
+ type container_data_home_t;
+ ')
+
+ manage_files_pattern($1, container_data_home_t, container_data_home_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to
+## manage container data home named
+## pipes.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_home_data_fifo_files',`
+ gen_require(`
+ type container_data_home_t;
+ ')
+
+ manage_fifo_files_pattern($1, container_data_home_t,
container_data_home_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to
+## manage container data home named
+## sockets.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_home_data_sock_files',`
+ gen_require(`
+ type container_data_home_t;
+ ')
+
+ manage_sock_files_pattern($1, container_data_home_t,
container_data_home_t)
+')
+
########################################
## <summary>
## Allow the specified domain to
@@ -760,6 +993,179 @@ interface(`container_getattr_fs',`
allow $1 container_file_t:filesystem getattr;
')
+########################################
+## <summary>
+## Allow the specified domain to search
+## runtime container directories.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_search_runtime',`
+ gen_require(`
+ type container_runtime_t;
+ ')
+
+ files_search_runtime($1)
+ allow $1 container_runtime_t:dir search_dir_perms;
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## runtime container files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_runtime_files',`
+ gen_require(`
+ type container_runtime_t;
+ ')
+
+ manage_files_pattern($1, container_runtime_t, container_runtime_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## runtime container named pipes.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_runtime_fifo_files',`
+ gen_require(`
+ type container_runtime_t;
+ ')
+
+ manage_fifo_files_pattern($1, container_runtime_t, container_runtime_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## runtime container named sockets.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_runtime_sock_files',`
+ gen_require(`
+ type container_runtime_t;
+ ')
+
+ manage_sock_files_pattern($1, container_runtime_t, container_runtime_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## user runtime container files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_user_runtime_files',`
+ gen_require(`
+ type container_user_runtime_t;
+ ')
+
+ manage_files_pattern($1, container_user_runtime_t,
container_user_runtime_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to search
+## container directories in /var/lib.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_search_var_lib',`
+ gen_require(`
+ type container_var_lib_t;
+ ')
+
+ files_search_var_lib($1)
+ allow $1 container_var_lib_t:dir search_dir_perms;
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## container files in /var/lib.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_var_lib_files',`
+ gen_require(`
+ type container_var_lib_t;
+ ')
+
+ manage_files_pattern($1, container_var_lib_t, container_var_lib_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## container named pipes in /var/lib.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_var_lib_fifo_files',`
+ gen_require(`
+ type container_var_lib_t;
+ ')
+
+ manage_fifo_files_pattern($1, container_var_lib_t, container_var_lib_t)
+')
+
+########################################
+## <summary>
+## Allow the specified domain to manage
+## container named sockets in /var/lib.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`container_manage_var_lib_sock_files',`
+ gen_require(`
+ type container_var_lib_t;
+ ')
+
+ manage_sock_files_pattern($1, container_var_lib_t, container_var_lib_t)
+')
+
########################################
## <summary>
## All of the rules required to
diff --git a/policy/modules/services/podman.fc
b/policy/modules/services/podman.fc
index fbf11fed..ece2d0dc 100644
--- a/policy/modules/services/podman.fc
+++ b/policy/modules/services/podman.fc
@@ -1 +1,2 @@
/usr/bin/podman -- gen_context(system_u:object_r:podman_exec_t,s0)
+/usr/bin/conmon --
gen_context(system_u:object_r:podman_conmon_exec_t,s0)
diff --git a/policy/modules/services/podman.if
b/policy/modules/services/podman.if
index a57ca9dc..3d03884e 100644
--- a/policy/modules/services/podman.if
+++ b/policy/modules/services/podman.if
@@ -94,6 +94,100 @@ interface(`podman_run_user',`
podman_domtrans_user($1)
')
+########################################
+## <summary>
+## Execute conmon in the conmon domain.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+#
+interface(`podman_domtrans_conmon',`
+ gen_require(`
+ type podman_conmon_t, podman_conmon_exec_t;
+ ')
+
+ corecmd_search_bin($1)
+ domtrans_pattern($1, podman_conmon_exec_t, podman_conmon_t)
+')
+
+########################################
+## <summary>
+## Execute conmon in the conmon domain,
+## and allow the specified role the
+## conmon domain.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+## <param name="role">
+## <summary>
+## The role to be allowed the conmon domain.
+## </summary>
+## </param>
+#
+interface(`podman_run_conmon',`
+ gen_require(`
+ type podman_conmon_t;
+ ')
+
+ role $2 types podman_conmon_t;
+
+ podman_domtrans_conmon($1)
+')
+
+########################################
+## <summary>
+## Execute conmon in the conmon user
+## domain (rootless podman).
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+#
+interface(`podman_domtrans_conmon_user',`
+ gen_require(`
+ type podman_conmon_user_t, podman_conmon_exec_t;
+ ')
+
+ corecmd_search_bin($1)
+ domtrans_pattern($1, podman_conmon_exec_t, podman_conmon_user_t)
+')
+
+########################################
+## <summary>
+## Execute conmon in the conmon user
+## domain, and allow the specified role
+## the conmon user domain (rootless
+## podman).
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+## <param name="role">
+## <summary>
+## The role to be allowed the conmon domain.
+## </summary>
+## </param>
+#
+interface(`podman_run_conmon_user',`
+ gen_require(`
+ type podman_conmon_user_t;
+ ')
+
+ role $2 types podman_conmon_user_t;
+
+ podman_domtrans_conmon_user($1)
+')
+
########################################
## <summary>
## Role access for rootless podman.
@@ -124,9 +218,11 @@ interface(`podman_run_user',`
template(`podman_user_role',`
gen_require(`
type podman_user_t;
+ type podman_conmon_user_t;
')
podman_run_user($3, $4)
+ podman_run_conmon_user($3, $4)
optional_policy(`
dbus_spec_session_bus_client($1, podman_user_t)
@@ -134,6 +230,7 @@ template(`podman_user_role',`
optional_policy(`
systemd_user_app_status($1, podman_user_t)
+ systemd_user_app_status($1, podman_conmon_user_t)
')
')
@@ -157,4 +254,5 @@ template(`podman_user_role',`
#
interface(`podman_admin',`
podman_run($1, $2)
+ podman_run_conmon($1, $2)
')
diff --git a/policy/modules/services/podman.te
b/policy/modules/services/podman.te
index 2bdd2f27..6efd2cd1 100644
--- a/policy/modules/services/podman.te
+++ b/policy/modules/services/podman.te
@@ -17,14 +17,30 @@ ifdef(`enable_mls',`
mls_trusted_object(podman_t)
container_engine_domain_template(podman_user)
+container_user_engine(podman_user_t)
application_domain(podman_user_t, podman_exec_t)
mls_trusted_object(podman_user_t)
+type podman_conmon_t;
+type podman_conmon_exec_t;
+application_domain(podman_conmon_t, podman_conmon_exec_t)
+
+type podman_conmon_user_t;
+application_domain(podman_conmon_user_t, podman_conmon_exec_t)
+
########################################
#
# Podman local policy
#
+allow podman_t podman_conmon_t:process { setsched signull };
+allow podman_t podman_conmon_t:fifo_file setattr;
+allow podman_t podman_conmon_t:unix_stream_socket { connectto
rw_stream_socket_perms };
+
+container_engine_executable_entrypoint(podman_t)
+
+domtrans_pattern(podman_t, podman_conmon_exec_t, podman_conmon_t)
+
logging_send_syslog_msg(podman_t)
userdom_list_user_home_content(podman_t)
@@ -38,11 +54,11 @@ userdom_relabel_generic_user_home_files(podman_t)
container_config_home_filetrans(podman_t, dir)
container_manage_home_config(podman_t)
+container_manage_sock_files(podman_t)
+
ifdef(`init_systemd',`
init_dbus_chat(podman_t)
init_setsched(podman_t)
- init_get_generic_units_status(podman_t)
- init_start_generic_units(podman_t)
init_start_system(podman_t)
init_stop_system(podman_t)
@@ -58,6 +74,14 @@ ifdef(`init_systemd',`
# Rootless Podman local policy
#
+allow podman_user_t podman_conmon_user_t:process signull;
+allow podman_user_t podman_conmon_user_t:fifo_file setattr;
+allow podman_user_t podman_conmon_user_t:unix_stream_socket { connectto
rw_stream_socket_perms };
+
+container_engine_executable_entrypoint(podman_user_t)
+
+domtrans_pattern(podman_user_t, podman_conmon_exec_t, podman_conmon_user_t)
+
# required by slirp4netns
files_mounton_etc_dirs(podman_user_t)
# required by slirp4netns
@@ -110,3 +134,137 @@ ifdef(`init_systemd',`
systemd_list_journal_dirs(podman_user_t)
systemd_read_journal_files(podman_user_t)
')
+
+########################################
+#
+# conmon local policy
+#
+
+allow podman_conmon_t self:process signal;
+allow podman_conmon_t self:capability { dac_override dac_read_search
sys_ptrace sys_resource };
+allow podman_conmon_t self:cap_userns sys_ptrace;
+allow podman_conmon_t self:fifo_file { rw_fifo_file_perms setattr };
+allow podman_conmon_t self:unix_dgram_socket create_socket_perms;
+dontaudit podman_conmon_t self:capability net_admin;
+
+# conmon will execute crun/runc to create the container
+container_generic_engine_domtrans(podman_conmon_t, podman_t)
+podman_domtrans(podman_conmon_t)
+
+allow podman_conmon_t podman_t:tcp_socket rw_stream_socket_perms;
+allow podman_conmon_t podman_t:unix_stream_socket rw_stream_socket_perms;
+allow podman_conmon_t podman_t:unix_dgram_socket rw_socket_perms;
+ps_process_pattern(podman_conmon_t, podman_t)
+
+domain_use_interactive_fds(podman_conmon_t)
+
+fs_getattr_cgroup(podman_conmon_t)
+fs_search_cgroup_dirs(podman_conmon_t)
+fs_read_cgroup_files(podman_conmon_t)
+fs_watch_cgroup_files(podman_conmon_t)
+
+fs_getattr_tmpfs(podman_conmon_t)
+fs_getattr_xattr_fs(podman_conmon_t)
+
+logging_send_syslog_msg(podman_conmon_t)
+
+miscfiles_read_localization(podman_conmon_t)
+
+userdom_use_user_ptys(podman_conmon_t)
+
+container_read_system_container_state(podman_conmon_t)
+
+# to send/receive data from container ttys
+container_rw_chr_files(podman_conmon_t)
+
+container_manage_runtime_files(podman_conmon_t)
+container_manage_runtime_fifo_files(podman_conmon_t)
+container_manage_runtime_sock_files(podman_conmon_t)
+
+container_search_var_lib(podman_conmon_t)
+container_manage_var_lib_files(podman_conmon_t)
+container_manage_var_lib_fifo_files(podman_conmon_t)
+container_manage_var_lib_sock_files(podman_conmon_t)
+
+container_engine_tmp_filetrans(podman_conmon_t, { file sock_file })
+container_manage_engine_tmp_files(podman_conmon_t)
+container_manage_engine_tmp_sock_files(podman_conmon_t)
+
+ifdef(`init_systemd',`
+ init_get_generic_units_status(podman_conmon_t)
+ init_start_generic_units(podman_conmon_t)
+ init_start_system(podman_conmon_t)
+ init_stop_system(podman_conmon_t)
+
+ # conmon can read logs from containers which are
+ # sent to the system journal
+ logging_search_logs(podman_conmon_t)
+ systemd_list_journal_dirs(podman_conmon_t)
+ systemd_read_journal_files(podman_conmon_t)
+')
+
+optional_policy(`
+ iptables_domtrans(podman_conmon_t)
+')
+
+########################################
+#
+# Rootless conmon local policy
+#
+
+allow podman_conmon_user_t self:process signal;
+allow podman_conmon_user_t self:cap_userns sys_ptrace;
+allow podman_conmon_user_t self:fifo_file { rw_fifo_file_perms setattr };
+allow podman_conmon_user_t self:unix_dgram_socket create_socket_perms;
+
+ps_process_pattern(podman_conmon_user_t, podman_user_t)
+allow podman_conmon_user_t podman_user_t:process signal;
+allow podman_conmon_user_t podman_user_t:unix_stream_socket
rw_stream_socket_perms;
+allow podman_conmon_user_t podman_user_t:unix_dgram_socket rw_socket_perms;
+
+# conmon will execute crun/runc to create the container
+container_generic_engine_domtrans(podman_conmon_user_t, podman_user_t)
+podman_domtrans_user(podman_conmon_user_t)
+
+domain_use_interactive_fds(podman_conmon_user_t)
+
+fs_getattr_cgroup(podman_conmon_user_t)
+fs_search_cgroup_dirs(podman_conmon_user_t)
+fs_read_cgroup_files(podman_conmon_user_t)
+fs_watch_cgroup_files(podman_conmon_user_t)
+
+fs_getattr_tmpfs(podman_conmon_user_t)
+fs_getattr_xattr_fs(podman_conmon_user_t)
+
+logging_send_syslog_msg(podman_conmon_user_t)
+
+miscfiles_read_localization(podman_conmon_user_t)
+
+userdom_use_user_ptys(podman_conmon_user_t)
+
+container_read_user_container_state(podman_conmon_user_t)
+
+# to send/receive data from container ttys
+container_rw_chr_files(podman_conmon_user_t)
+
+userdom_search_user_home_dirs(podman_conmon_user_t)
+xdg_search_data_dirs(podman_conmon_user_t)
+container_manage_home_data_files(podman_conmon_user_t)
+container_manage_home_data_fifo_files(podman_conmon_user_t)
+container_manage_home_data_sock_files(podman_conmon_user_t)
+
+userdom_search_user_runtime_root(podman_conmon_user_t)
+userdom_search_user_runtime(podman_conmon_user_t)
+container_manage_user_runtime_files(podman_conmon_user_t)
+
+container_engine_tmp_filetrans(podman_conmon_user_t, { file sock_file })
+container_manage_engine_tmp_files(podman_conmon_user_t)
+container_manage_engine_tmp_sock_files(podman_conmon_user_t)
+
+ifdef(`init_systemd',`
+ # conmon can read logs from containers which are
+ # sent to the system journal
+ logging_search_logs(podman_conmon_user_t)
+ systemd_list_journal_dirs(podman_conmon_user_t)
+ systemd_read_journal_files(podman_conmon_user_t)
+')