Blob Blame History Raw
#DESC Exim - Mail server
#
# Author:  David Hampton <hampton@employees.org>
# From postfix.te by Russell Coker <russell@coker.com.au>
# Depends: mta.te
#

type exim_spool_t, file_type, sysadmfile;
type exim_spool_db_t, file_type, sysadmfile;


##########
# Exim daemon
##########
daemon_domain(exim, `, mta_delivery_agent, mail_server_domain, mail_server_sender, nscd_client_domain, privlog, privhome', nosysadm)
exim_common(exim);
etcdir_domain(exim)
logdir_domain(exim)
########################################
########################################
role sysadm_r types exim_t;

# Server side networking
can_network_tcp(exim_t);
allow exim_t { smtp_port_t amavisd_send_port_t }:tcp_socket name_bind;
# The exim daemon gets to listen to mail coming back from amavisd
# For identd lookups
allow exim_t inetd_child_port_t:tcp_socket name_connect;
allow exim_t self:unix_dgram_socket create_socket_perms;

# Lock file between exim processes. Exim creates a lock file in /tmp
# that doesn't transition to the exim_tmp_t domain for some reason,
# thus the allow statement.
tmp_domain(exim)
allow exim_t tmp_t:file { getattr read };

# Lock files for the actual mail delivery.  Exim wants to create a
# 'hitching post' file in the same directory as the delivery file.
# These are the additiona privileges over and above what's defined for
# an mta_delivery_agent. Additional privs for maildir mail files
allow exim_t mail_spool_t:dir remove_name;
allow exim_t mail_spool_t:file { link setattr unlink write rename };

# For access to users .forward files
allow exim_t home_dir_type:dir { getattr search };

allow exim_t self:capability { dac_read_search net_bind_service };

# Create exim spool files, update spool database
create_dir_file(exim_t, exim_spool_t)
rw_dir_file(exim_t, exim_spool_db_t)

# Start daemon/child processes
can_exec(exim_t, exim_exec_t)

allow exim_t sbin_t:dir r_dir_perms;

# Read aliases file
allow exim_t etc_aliases_t:file r_file_perms;

#
allow exim_t devpts_t:chr_file getattr;

ifdef(`crond.te', `
system_crond_entry(exim_exec_t, exim_t)
domain_auto_trans(crond_t, exim_exec_t, exim_t)
allow exim_t system_crond_tmp_t:file { getattr read append };
#logwatch
allow system_crond_t exim_log_t:file read;
')

# For squirrelmail
ifdef(`httpd.te', `
domain_auto_trans(httpd_sys_script_t, exim_exec_t, exim_t)
allow exim_t httpd_t:fd use;
allow exim_t httpd_t:process sigchld;
allow exim_t httpd_log_t:file { append getattr };
allow exim_t httpd_squirrelmail_t:file { append read };
allow exim_t httpd_t:fifo_file { read write getattr };
allow exim_t httpd_t:tcp_socket { read write };
')

########################################
########################################


##  --------------------------------------------------
##		 exim_ro, exim_ro_net
##
##  Many of the subsequent applications call exim for
##  the sole purpose of extracting configuration or
##  other information.  Lock down the permissions on
##  these instances to be pretty much read-only
##  everything.
##
##  One of the applications calls exim only to
##  determine whether an address is valid.  It does
##  this by having exim attempt to deliver an empty
##  message, without doing the actual deliver.
##  These function are aplit out here to keep all the
##  access controls on exim itself in poe part of the
##  file.
##  --------------------------------------------------

define(`exim_ro_base', `
application_domain($1)
role system_r types $1_t;
read_sysctl($1_t)
r_dir_file($1_t, etc_t)		#for nsswitch.conf
r_dir_file($1_t, var_spool_t)
r_dir_file($1_t, exim_spool_t)
allow $1_t devpts_t:chr_file { getattr read write };
allow $1_t self:capability { dac_override setgid setuid };
')

exim_ro_base(exim_ro)
dontaudit exim_ro_t self:unix_stream_socket { connect create };

exim_ro_base(exim_ro_net)
can_network(exim_ro_net_t)
general_proc_read_access(exim_ro_net_t)
read_locale(exim_ro_net_t)
allow exim_ro_net_t mail_spool_t:dir search;
allow exim_ro_net_t etc_aliases_t:file r_file_perms;
allow exim_ro_net_t self:unix_stream_socket { create connect };




##  --------------------------------------------------
##  exim_helper_base
##
##  Define the base attributes for an exim helper
##  program.
##  --------------------------------------------------
define(`exim_helper_base',`
application_domain($1)
role system_r types $1_t;
can_exec_any($1_t)

allow $1_t devpts_t:dir search;

# Needed for perl
general_domain_access($1_t)
general_proc_read_access($1_t)
allow $1_t urandom_device_t:chr_file read;
allow $1_t { devtty_t devpts_t }:chr_file { read write ioctl };
read_locale($1_t)
allow $1_t sbin_t:dir r_dir_perms;
')




##  --------------------------------------------------
##  exim_helper_script_base
##  --------------------------------------------------
define(`exim_helper_script_base',`
exim_helper_base($1)

# Needed for bash
allow $1_t { devtty_t devpts_t }:chr_file { read write getattr };
allow $1_t devpts_t:dir search;
allow $1_t fs_t:filesystem getattr;
rw_dir_create_file($1_t, tmp_t)		# Script uses a "here" document
dontaudit $1_t etc_runtime_t:file { getattr read };	# mtab
dontaudit $1_t selinux_config_t:dir { search };
dontaudit $1_t selinux_config_t:file { getattr read };	# mtab
allow $1_t var_spool_t:dir search;		# Needed to traverse to get to /var/spool/exim

')


##  --------------------------------------------------
##  exicyclog
##  --------------------------------------------------

exim_helper_script_base(exicyclog)
allow exicyclog_t self:capability { dac_override setuid setgid };
create_dir_file(exicyclog_t, exim_log_t)
allow exicyclog_t var_t:dir r_dir_perms;
allow exicyclog_t var_log_t:dir r_dir_perms;
allow exicyclog_t exim_spool_t:dir r_dir_perms;




##  --------------------------------------------------
##  exigrep
##  --------------------------------------------------

exim_helper_base(exigrep)
allow exigrep_t self:capability dac_override;
r_dir_file(exigrep_t, var_log_t)
r_dir_file(exigrep_t, exim_log_t)




##  --------------------------------------------------
##  exipick
##  --------------------------------------------------

exim_helper_base(exipick)
domain_auto_trans(exipick_t, exim_exec_t, exim_ro_t)
r_dir_file(exipick_t, var_spool_t)
r_dir_file(exipick_t, exim_spool_t)
allow exipick_t self:capability dac_override;




##  --------------------------------------------------
##  exiqgrep
##  --------------------------------------------------

exim_helper_base(exiqgrep)
domain_auto_trans(exiqgrep_t, exim_exec_t, exim_ro_t)



application_domain(exim_lock)
role system_r types exim_lock_t;


##  --------------------------------------------------
##  exiwhat
##     1) Runs exim to extract config info
##     2) Sends a signal to all running exim processes
##     3) Collects the status files they drop in the spool directory
##  --------------------------------------------------

exim_helper_script_base(exiwhat)
domain_auto_trans(exiwhat_t, exim_exec_t, exim_ro_t)
allow exiwhat_t exim_spool_t:dir { rw_dir_perms };
allow exiwhat_t exim_spool_t:file { r_file_perms unlink };

# killall
r_dir_file(exiwhat_t, exim_t)
r_dir_file(exiwhat_t, selinux_config_t)
allow exiwhat_t exim_t:process signal;
allow exiwhat_t self:capability { dac_override kill sys_nice };

dontaudit exiwhat_t file_type:dir search;
dontaudit exiwhat_t file_type:file { getattr read };

# rm
allow exiwhat_t devpts_t:chr_file ioctl;




##  --------------------------------------------------
##  exim_check_access
##     1) Runs exim to simulate mail receipt
##     2) Checks on whether the mail address is allowed from the ip address
##  --------------------------------------------------

exim_helper_script_base(exim_checkaccess)
domain_auto_trans(exim_checkaccess_t, exim_exec_t, exim_ro_net_t)
allow exim_checkaccess_t exim_spool_t:dir { r_dir_perms };
allow exim_checkaccess_t self:capability dac_override;





##  --------------------------------------------------
##  exim_helper
##  --------------------------------------------------
application_domain(exim_helper)
domain_auto_trans(exim_helper_t, exim_exec_t, exim_ro_t)
can_exec(exim_helper_t, bin_t)
role system_r types exim_helper_t;
general_domain_access(exim_helper_t)
read_locale(exim_helper_t)

allow exim_helper_t { devtty_t devpts_t }:chr_file { read write };

# Have to walk through /var/log to get to /var/log/exim
allow exim_helper_t var_t:dir r_dir_perms;
r_dir_file(exim_helper_t, exim_log_t)






##  --------------------------------------------------
##  exim database maintenance programs
##     exim_dump_db, exim_fixdb, exim_tidydb
##  --------------------------------------------------
define(`exim_db_base',`
application_domain($1)
role system_r types $1_t;
read_locale($1_t)
general_proc_read_access($1_t)
allow $1_t devpts_t:chr_file { getattr read write };
allow $1_t self:capability { dac_override setgid setuid };
allow $1_t tmp_t:dir { getattr };
r_dir_file($1_t, var_spool_t)
r_dir_file($1_t, exim_spool_t)
r_dir_file($1_t, exim_spool_db_t)
dontaudit $1_t etc_runtime_t:file { getattr read };	# mtab
')

exim_db_base(exim_db_ro)
exim_db_base(exim_db_rw)
rw_dir_file(exim_db_rw_t, exim_spool_db_t)