policy_module(docker)

########################################
#
# Declarations
#

container_engine_domain_template(dockerd)
container_system_engine(dockerd_t)
optional_policy(`
	kubernetes_container_engine(dockerd_t)
')
type dockerd_exec_t;
container_engine_executable_file(dockerd_exec_t)
application_domain(dockerd_t, dockerd_exec_t)
init_daemon_domain(dockerd_t, dockerd_exec_t)
ifdef(`enable_mls',`
	init_ranged_daemon_domain(dockerd_t, dockerd_exec_t, s0 - mls_systemhigh)
')
mls_trusted_object(dockerd_t)

type dockerc_t;
type dockerc_exec_t;
container_engine_executable_file(dockerc_exec_t)
application_domain(dockerc_t, dockerc_exec_t)

container_engine_domain_template(dockerd_user)
container_user_engine(dockerd_user_t)
application_domain(dockerd_user_t, dockerd_exec_t)
mls_trusted_object(dockerd_user_t)

type dockerc_user_t;
application_domain(dockerc_user_t, dockerc_exec_t)

########################################
#
# Docker daemon local policy
#

allow dockerd_t self:process getattr;
allow dockerd_t self:netlink_netfilter_socket create_socket_perms;
allow dockerd_t self:netlink_xfrm_socket create_socket_perms;

init_write_runtime_socket(dockerd_t)
container_runtime_named_socket_activation(dockerd_t)

# docker fails to start if /proc/kallsyms is unreadable,
# but only when btrfs support is disabled
files_read_kernel_symbol_table(dockerd_t)
files_dontaudit_write_usr_dirs(dockerd_t)

kernel_relabelfrom_unlabeled_dirs(dockerd_t)
# docker wants to load binfmt_misc
kernel_request_load_module(dockerd_t)
kernel_dontaudit_search_fs_sysctls(dockerd_t)

logging_send_syslog_msg(dockerd_t)

container_stream_connect_system_containers(dockerd_t)

# docker manages key.json in /etc/docker
container_manage_config_files(dockerd_t)

# In btrfs mode, docker creates subvolumes which are unlabeled
# in /var/lib/docker/btrfs/subvolumes. The files inside will
# become labeled with a file transition, but the subvolume
# root will always be unlabeled.
container_unlabeled_var_lib_filetrans(dockerd_t, dir)

ifdef(`init_systemd',`
	init_dbus_chat(dockerd_t)
	init_get_transient_units_status(dockerd_t)
	init_start_transient_units(dockerd_t)
	init_start_system(dockerd_t)
	init_stop_system(dockerd_t)
	init_get_system_status(dockerd_t)
	init_stop_generic_units(dockerd_t)
')

########################################
#
# Docker CLI local policy
#

allow dockerc_t self:process { getsched signal };
allow dockerc_t self:fifo_file rw_fifo_file_perms;

allow dockerc_t dockerd_t:unix_stream_socket connectto;

corecmd_dontaudit_search_bin(dockerc_t)

domain_use_interactive_fds(dockerc_t)

auth_use_nsswitch(dockerc_t)

miscfiles_read_localization(dockerc_t)

userdom_use_user_ptys(dockerc_t)

container_stream_connect_system_containers(dockerc_t)

########################################
#
# Rootless Docker daemon local policy
#

# rootless docker is really just docker running as root, but in a user namespace

allow dockerd_user_t self:netlink_netfilter_socket create_socket_perms;
allow dockerd_user_t self:netlink_xfrm_socket create_socket_perms;

fs_getattr_fusefs(dockerd_user_t)
fs_mount_fusefs(dockerd_user_t)
fs_unmount_fusefs(dockerd_user_t)
fs_remount_fusefs(dockerd_user_t)
fs_manage_fusefs_dirs(dockerd_user_t)
fs_manage_fusefs_files(dockerd_user_t)
fs_manage_fusefs_symlinks(dockerd_user_t)
fs_exec_fusefs_files(dockerd_user_t)
fs_mounton_fusefs(dockerd_user_t)

kernel_dontaudit_request_load_module(dockerd_user_t)

storage_rw_fuse(dockerd_user_t)

init_write_runtime_socket(dockerd_user_t)

logging_send_syslog_msg(dockerd_user_t)

mount_exec(dockerd_user_t)

container_setattr_container_ptys(dockerd_user_t)
container_use_container_ptys(dockerd_user_t)

ifdef(`init_systemd',`
	systemd_search_user_runtime(dockerd_user_t)
	systemd_write_user_runtime_socket(dockerd_user_t)
	systemd_get_user_runtime_units_status(dockerd_user_t)
	systemd_start_user_runtime_units(dockerd_user_t)
	systemd_stop_user_runtime_units(dockerd_user_t)
')

optional_policy(`
	dbus_getattr_session_runtime_socket(dockerd_user_t)
	dbus_write_session_runtime_socket(dockerd_user_t)
')

optional_policy(`
	rootlesskit_exec(dockerd_user_t)
')

########################################
#
# Rootless Docker CLI local policy
#

allow dockerc_user_t self:process { getsched signal };
allow dockerc_user_t self:fifo_file rw_fifo_file_perms;

allow dockerc_user_t dockerd_user_t:unix_stream_socket connectto;

corecmd_search_bin(dockerc_user_t)

domain_use_interactive_fds(dockerc_user_t)

auth_use_nsswitch(dockerc_user_t)

miscfiles_read_localization(dockerc_user_t)

userdom_use_user_ptys(dockerc_user_t)
userdom_search_user_home_dirs(dockerc_user_t)
userdom_search_user_runtime(dockerc_user_t)

xdg_search_data_dirs(dockerc_user_t)

container_stream_connect_user_containers(dockerc_user_t)
