Skip to content

Commit

Permalink
Add policy for nbdkit
Browse files Browse the repository at this point in the history
Add interfaces to virt and fix policy for nbdkit

Resolves: rhbz#2182505
  • Loading branch information
5umm3r15 committed Oct 10, 2023
1 parent 45eaab4 commit 1b55f9f
Show file tree
Hide file tree
Showing 4 changed files with 288 additions and 0 deletions.
5 changes: 5 additions & 0 deletions policy/modules/contrib/nbdkit.fc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
HOME_DIR/tmp(/.*)? gen_context(system_u:object_r:nbdkit_home_t,s0)

/usr/sbin/nbdkit -- gen_context(system_u:object_r:nbdkit_exec_t,s0)

/usr/lib/systemd/system/nbdkit.* gen_context(system_u:object_r:nbdkit_unit_file_t,s0)
115 changes: 115 additions & 0 deletions policy/modules/contrib/nbdkit.if
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
[root@ci-vm-10-0-136-52 policy]# cat nbdkit.if

## <summary>policy for nbdkit</summary>

########################################
## <summary>
## Execute nbdkit_exec_t in the nbdkit domain.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to transition.
## </summary>
## </param>
#
interface(`nbdkit_domtrans',`
gen_require(`
type nbdkit_t, nbdkit_exec_t;
')

corecmd_search_bin($1)
domtrans_pattern($1, nbdkit_exec_t, nbdkit_t)
')

######################################
## <summary>
## Execute nbdkit in the caller domain.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
#
interface(`nbdkit_exec',`
gen_require(`
type nbdkit_exec_t;
')

corecmd_search_bin($1)
can_exec($1, nbdkit_exec_t)
')

########################################
## <summary>
## Execute nbdkit in the nbdkit domain, and
## allow the specified role the nbdkit domain.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed to transition
## </summary>
## </param>
## <param name="role">
## <summary>
## The role to be allowed the nbdkit domain.
## </summary>
## </param>
#
interface(`nbdkit_run',`
gen_require(`
type nbdkit_t;
attribute_role nbdkit_roles;
')

nbdkit_domtrans($1)
roleattribute $2 nbdkit_roles;
')

########################################
## <summary>
## Role access for nbdkit
## </summary>
## <param name="role">
## <summary>
## Role allowed access
## </summary>
## </param>
## <param name="domain">
## <summary>
## User domain for the role
## </summary>
## </param>
#
interface(`nbdkit_role',`
gen_require(`
type nbdkit_t;
attribute_role nbdkit_roles;
')

roleattribute $1 nbdkit_roles;

nbdkit_domtrans($2)

ps_process_pattern($2, nbdkit_t)
allow $2 nbdkit_t:process { signull signal sigkill };
')

########################################
## <summary>
## Allow attempts to connect to nbdkit
## with a unix stream socket.
## </summary>
## <param name="domain">
## <summary>
## Domain to not audit.
## </summary>
## </param>
#
interface(`nbdkit_stream_connect',`
gen_require(`
type nbdkit_t;
')

allow $1 nbdkit_t:unix_stream_socket connectto;
')
114 changes: 114 additions & 0 deletions policy/modules/contrib/nbdkit.te
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
policy_module(nbdkit, 1.0.0)

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

gen_require(`
type unconfined_t;
')

type nbdkit_t;
type nbdkit_exec_t;
application_domain(nbdkit_t, nbdkit_exec_t)
mcs_constrained(nbdkit_t)
role system_r types nbdkit_t;

type nbdkit_home_t;
userdom_user_home_content(nbdkit_home_t)

type nbdkit_tmp_t;
files_tmp_file(nbdkit_tmp_t)

type nbdkit_unit_file_t;
systemd_unit_file(nbdkit_unit_file_t)

permissive nbdkit_t;

########################################
#
# nbdkit local policy
#
allow nbdkit_t self:capability { setgid setuid };
allow nbdkit_t self:fifo_file rw_fifo_file_perms;
allow nbdkit_t self:netlink_route_socket { bind create getattr nlmsg_read read write };
allow nbdkit_t self:process { fork setsockcreate signal_perms };
allow nbdkit_t self:tcp_socket { bind listen accept connect create getattr getopt read setopt write };
allow nbdkit_t self:udp_socket { connect create getattr read write setopt };

manage_dirs_pattern(nbdkit_t, nbdkit_tmp_t, nbdkit_tmp_t)
manage_files_pattern(nbdkit_t, nbdkit_tmp_t, nbdkit_tmp_t)
userdom_user_tmp_filetrans(nbdkit_t, nbdkit_tmp_t, { dir file })

manage_dirs_pattern(nbdkit_t, nbdkit_home_t, nbdkit_home_t)
manage_files_pattern(nbdkit_t, nbdkit_home_t, nbdkit_home_t)
userdom_user_home_dir_filetrans(nbdkit_t, nbdkit_home_t, { dir file })

allow unconfined_t nbdkit_exec_t:file entrypoint;

corenet_tcp_connect_http_port(nbdkit_t)
corenet_tcp_connect_ssh_port(nbdkit_t)
corenet_tcp_connect_tftp_port(nbdkit_t)
corenet_tcp_bind_generic_port(nbdkit_t)
corenet_tcp_bind_generic_node(nbdkit_t)

domain_use_interactive_fds(nbdkit_t)

files_read_etc_files(nbdkit_t)

init_abstract_socket_activation(nbdkit_t)
init_ioctl_stream_sockets(nbdkit_t)
init_rw_stream_sockets(nbdkit_t)

optional_policy(`
auth_use_nsswitch(nbdkit_t)
')

optional_policy(`
logging_send_syslog_msg(nbdkit_t)
')

optional_policy(`
miscfiles_read_localization(nbdkit_t)
miscfiles_read_generic_certs(nbdkit_t)
')

optional_policy(`
sysnet_dns_name_resolve(nbdkit_t)
sysnet_read_config(nbdkit_t)
')

optional_policy(`
userdom_use_inherited_user_ptys(nbdkit_t)
')

optional_policy(`
virt_create_svirt_image_sock_files(nbdkit_t)
virt_read_qemu_pid_files(nbdkit_t)
virtlogd_rw_pipes(nbdkit_t)
virt_rw_svirt_image(nbdkit_t)
virt_rw_svirt_image_dirs(nbdkit_t)
virt_search_lib(nbdkit_t)
virt_stream_connect_svirt(nbdkit_t)
')

########################################
#
# virt policy
#
require {
type svirt_t;
type virtd_t;
}

nbdkit_domtrans(virtd_t)
nbdkit_stream_connect(svirt_t)
nbdkit_stream_connect(svirt_tcg_t)
nbdkit_stream_connect(virtd_t)

# FIXME: It would be nice to allow libvirt to transition nbdkit_exec_t to
# nbdkit_t when libvirtd was started manually from the commandline (i.e. in
# unconfined_t), but we don't want this transition to happen automatically
# when starting directly from the shell. I'm not sure how to achieve this...
#nbdkit_domtrans(unconfined_t, nbdkit_exec_t, nbdkit_t)
54 changes: 54 additions & 0 deletions policy/modules/contrib/virt.if
Original file line number Diff line number Diff line change
Expand Up @@ -1540,6 +1540,42 @@ interface(`virt_rw_svirt_image',`
allow $1 svirt_image_t:file rw_file_perms;
')

########################################
## <summary>
## Read and write to svirt_image dirs.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
#
interface(`virt_rw_svirt_image_dirs',`
gen_require(`
type svirt_image_t;
')

allow $1 svirt_image_t:dir rw_dir_perms;
')

########################################
## <summary>
## Create svirt_image sock_files.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
#
interface(`virt_create_svirt_image_sock_files',`
gen_require(`
type svirt_image_t;
')

allow $1 svirt_image_t:sock_file create_sock_file_perms;
')

########################################
## <summary>
## Read and write to svirt_image devices.
Expand Down Expand Up @@ -1855,3 +1891,21 @@ interface(`virt_manage_qemu_pid_sock_files',`
files_search_pids($1)
manage_sock_files_pattern($1, qemu_var_run_t, qemu_var_run_t)
')

########################################
## <summary>
## Read and write virtlogd pipes.
## </summary>
## <param name="domain">
## <summary>
## Domain allowed access.
## </summary>
## </param>
#
interface(`virtlogd_rw_pipes',`
gen_require(`
type virtlogd_t;
')

allow $1 virtlogd_t:fifo_file rw_fifo_file_perms;
')

0 comments on commit 1b55f9f

Please sign in to comment.