###############################################################################
# SELinux module for the NGINX Web Server
#
# Project Contact Information:
# Stuart Cianos
# Email: scianos@alphavida.com
#
###############################################################################
# (C) Copyright 2009 by Stuart Cianos, d/b/a AlphaVida. All Rights Reserved.
#
#
# Stuart Cianos licenses this file to You under the GNU General Public License,
# Version 3.0 (the "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.gnu.org/licenses/gpl.txt
#
# or in the COPYING file included in the original archive.
#
# Disclaimer of Warranty.
#
# THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
# APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
# HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
# IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
# ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
# Limitation of Liability.
#
# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
# THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
# GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
# USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
# DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
# PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
# EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGES.
###############################################################################
policy_module(nginx,1.0.10)
########################################
#
# Declarations
#
##
##
## Allow nginx to serve HTTP content (act as an http server)
##
##
gen_tunable(nginx_enable_http_server, false)
##
##
## Allow nginx to act as an imap proxy server)
##
##
gen_tunable(nginx_enable_imap_server, false)
##
##
## Allow nginx to act as a pop3 server)
##
##
gen_tunable(nginx_enable_pop3_server, false)
##
##
## Allow nginx to act as an smtp server)
##
##
gen_tunable(nginx_enable_smtp_server, false)
##
##
## Allow nginx to connect to remote HTTP servers
##
##
gen_tunable(nginx_can_network_connect_http, false)
##
##
## Allow nginx to connect to remote servers (regardless of protocol)
##
##
gen_tunable(nginx_can_network_connect, false)
type nginx_t;
type nginx_exec_t;
init_daemon_domain(nginx_t, nginx_exec_t)
type nginx_initrc_exec_t;
init_script_file(nginx_initrc_exec_t)
# conf files
type nginx_conf_t;
files_type(nginx_conf_t)
# var/lib files
type nginx_var_lib_t;
files_type(nginx_var_lib_t)
# log files
type nginx_log_t;
logging_log_file(nginx_log_t)
# pid files
type nginx_var_run_t;
files_pid_file(nginx_var_run_t)
# tmp files
type nginx_tmp_t;
files_tmp_file(nginx_tmp_t)
########################################
#
# nginx local policy
#
## Self rules
allow nginx_t self:fifo_file { read write };
allow nginx_t self:unix_stream_socket create_stream_socket_perms;
allow nginx_t self:tcp_socket { listen accept };
allow nginx_t self:capability { setuid net_bind_service setgid chown };
## Policy-owned type management rules
# log files
manage_files_pattern(nginx_t, nginx_log_t, nginx_log_t)
#manage_sock_files_pattern(nginx_t, nginx_log_t, nginx_log_t)
logging_log_filetrans(nginx_t, nginx_log_t, { file dir })
#logging_log_filetrans(nginx_t, nginx_log_t, { sock_file })
# pid file
#allow nginx_t nginx_var_run_t:sock_file manage_file_perms;
manage_dirs_pattern(nginx_t, nginx_var_run_t, nginx_var_run_t)
manage_files_pattern(nginx_t, nginx_var_run_t, nginx_var_run_t)
files_pid_filetrans(nginx_t, nginx_var_run_t, file)
#files_pid_filetrans(nginx_t, nginx_var_run_t, { file sock_file })
# conf files
read_files_pattern(nginx_t, nginx_conf_t, nginx_conf_t)
# tmp files
manage_files_pattern(nginx_t, nginx_tmp_t, nginx_tmp_t)
manage_dirs_pattern(nginx_t, nginx_tmp_t, nginx_tmp_t)
files_tmp_filetrans(nginx_t, nginx_tmp_t, dir)
# various
allow nginx_t nginx_var_lib_t:file create_file_perms;
allow nginx_t nginx_var_lib_t:sock_file create_file_perms;
allow nginx_t nginx_var_lib_t:dir create_dir_perms;
files_var_lib_filetrans(nginx_t,nginx_var_lib_t, { file dir sock_file })
## Kernel layer modules
kernel_read_kernel_sysctls(nginx_t)
corenet_tcp_bind_generic_node(nginx_t)
corenet_tcp_sendrecv_generic_if(nginx_t)
corenet_tcp_sendrecv_generic_node(nginx_t)
#corenet_tcp_sendrecv_all_ports(nginx_t)
#corenet_non_ipsec_sendrecv(nginx_t)
domain_use_interactive_fds(nginx_t)
files_read_etc_files(nginx_t)
## Perhaps as a policy tunable?
#corenet_tcp_bind_all_ports(nginx_t)
#corenet_tcp_bind_all_nodes(nginx_t)
## System layer modules
miscfiles_read_localization(nginx_t)
sysnet_dns_name_resolve(nginx_t)
## Other modules
#init_use_fds(nginx_t)
#init_use_script_ptys(nginx_t)
#libs_use_ld_so(nginx_t)
#libs_use_shared_libs(nginx_t)
#allow nginx_t fs_t:filesystem associate;
#allow nginx_t home_root_t:dir search;
#allow nginx_t user_home_dir_t:dir search;
tunable_policy(`nginx_enable_http_server',`
corenet_tcp_bind_http_port(nginx_t)
apache_read_sys_content(nginx_t)
')
tunable_policy(`nginx_enable_imap_server',`
corenet_tcp_bind_pop_port(nginx_t)
')
tunable_policy(`nginx_enable_pop3_server',`
corenet_tcp_bind_pop_port(nginx_t)
')
tunable_policy(`nginx_enable_smtp_server',`
corenet_tcp_bind_smtp_port(nginx_t)
')
tunable_policy(`nginx_can_network_connect_http',`
corenet_tcp_connect_http_port(nginx_t)
')
tunable_policy(`nginx_can_network_connect',`
corenet_tcp_connect_all_ports(nginx_t)
')