2011-06-13 08:20:06

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 0/7] Updates on zabbix service

Zabbix is an open-source/free software monitoring solution. A module already
exists in the refpolicy, but does not work properly. Also, the module does
not support a different domain for the agents (zabbix agents) although this
is greatly preferred.

The following set of patches introduce the following to this module set:

1. Zabbix server is a multi-process system requiring signals to be sent and
(exclusive) locks to be taken where needed (for instance used with
logging)
2. Zabbix servers use posix shared memory (using tmpfs backend), so create a
zabbix_tmpfs_t domain and allow the server access to manage it
3. Zabbix uses a dedicated port (10051) for its server. Allow the servers to
bind to it, and of course define it as a specific port in SELinux
4. Start with the definition of the zabbix_agent_t domain
5. Allow zabbix_agent to bind on its own port (10050) and connect to the
zabbix server (for the regular metric submissions)
6. The zabbix server also needs to connect to the agent (for what Zabbix
calls "active monitoring")
7. Give zabbix_agent_t the privileges it needs to scan the system (get
system state, read files, check services, ...)

Signed-off-by: Sven Vermeulen <[email protected]>


2011-06-13 08:25:50

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 1/7] zabbix server spawns multiple processes

The zabbix server process is a multi-process system.

In order to, for instance, shut it down, signalling within the domain is
necessary. Otherwise, the processes remain running.

Also, since there are multiple processes trying to use the same log file,
the zabbix server uses semaphores to ensure proper access to the log files
(concurrency).

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.te | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index c26ecf5..3dd76ca 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -27,7 +27,9 @@ files_pid_file(zabbix_var_run_t)

allow zabbix_t self:capability { setuid setgid };
allow zabbix_t self:fifo_file rw_file_perms;
+allow zabbix_t self:process { setsched getsched signal };
allow zabbix_t self:unix_stream_socket create_stream_socket_perms;
+allow zabbix_t self:sem create_sem_perms;

# log files
allow zabbix_t zabbix_log_t:dir setattr;
--
1.7.3.4

2011-06-13 08:28:15

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 2/7] Support shared memory

Zabbix servers use shared memory to keep common information and structures.
This is implemented on tmpfs. We support this by introducing a
zabbix_tmpfs_t type and allow the server proper access to it.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.te | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 3dd76ca..bec98e9 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -16,6 +16,10 @@ init_script_file(zabbix_initrc_exec_t)
type zabbix_log_t;
logging_log_file(zabbix_log_t)

+# shared memory
+type zabbix_tmpfs_t;
+files_tmpfs_file(zabbix_tmpfs_t);
+
# pid files
type zabbix_var_run_t;
files_pid_file(zabbix_var_run_t)
@@ -30,6 +34,7 @@ allow zabbix_t self:fifo_file rw_file_perms;
allow zabbix_t self:process { setsched getsched signal };
allow zabbix_t self:unix_stream_socket create_stream_socket_perms;
allow zabbix_t self:sem create_sem_perms;
+allow zabbix_t self:shm create_shm_perms;

# log files
allow zabbix_t zabbix_log_t:dir setattr;
@@ -41,6 +46,10 @@ manage_dirs_pattern(zabbix_t, zabbix_var_run_t, zabbix_var_run_t)
manage_files_pattern(zabbix_t, zabbix_var_run_t, zabbix_var_run_t)
files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file })

+# shared memory
+rw_files_pattern(zabbix_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
+fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, { dir file })
+
files_read_etc_files(zabbix_t)

miscfiles_read_localization(zabbix_t)
--
1.7.3.4

2011-06-13 08:29:30

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 3/7] Define zabbix port and allow server to listen/bind on it

The zabbix server uses a dedicated port (10051). We define it and allow the
zabbix server to bind/listen on it.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/kernel/corenetwork.te.in | 1 +
policy/modules/services/zabbix.te | 4 ++++
2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/policy/modules/kernel/corenetwork.te.in b/policy/modules/kernel/corenetwork.te.in
index 4676d6e..f4937b9 100644
--- a/policy/modules/kernel/corenetwork.te.in
+++ b/policy/modules/kernel/corenetwork.te.in
@@ -223,6 +223,7 @@ network_port(xen, tcp,8002,s0)
network_port(xfs, tcp,7100,s0)
network_port(xserver, tcp,6000-6020,s0)
network_port(zarafa, tcp,236,s0, tcp,237,s0)
+network_port(zabbix, tcp,10051,s0)
network_port(zookeeper_client, tcp,2181,s0)
network_port(zookeeper_election, tcp,3888,s0)
network_port(zookeeper_leader, tcp,2888,s0)
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index bec98e9..839422c 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -35,6 +35,7 @@ allow zabbix_t self:process { setsched getsched signal };
allow zabbix_t self:unix_stream_socket create_stream_socket_perms;
allow zabbix_t self:sem create_sem_perms;
allow zabbix_t self:shm create_shm_perms;
+allow zabbix_t self:tcp_socket create_stream_socket_perms;

# log files
allow zabbix_t zabbix_log_t:dir setattr;
@@ -52,6 +53,9 @@ fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, { dir file })

files_read_etc_files(zabbix_t)

+corenet_tcp_bind_generic_node(zabbix_t)
+corenet_tcp_bind_zabbix_port(zabbix_t)
+
miscfiles_read_localization(zabbix_t)

optional_policy(`
--
1.7.3.4

2011-06-13 08:31:36

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 4/7] Support different domain for zabbix agent (start with skeleton)

The zabbix agent should be confined within its own domain. We start with the
definition of a small(er) skeleton to work from. This includes proper file
context definitions, standard interdomain privileges (which are quite
similar to those of the server) and the proper log- and pid access
privileges.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.fc | 4 +++-
policy/modules/services/zabbix.te | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/policy/modules/services/zabbix.fc b/policy/modules/services/zabbix.fc
index 3102286..125529a 100644
--- a/policy/modules/services/zabbix.fc
+++ b/policy/modules/services/zabbix.fc
@@ -1,6 +1,8 @@
/etc/rc\.d/init\.d/zabbix -- gen_context(system_u:object_r:zabbix_initrc_exec_t,s0)
+/etc/rc\.d/init\.d/zabbix-agentd -- gen_context(system_u:object_r:zabbix_agent_initrc_exec_t,s0)

-/usr/bin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0)
+/usr/(s)?bin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0)
+/usr/(s)?bin/zabbix_agentd -- gen_context(system_u:object_r:zabbix_agent_exec_t,s0)

/var/log/zabbix(/.*)? gen_context(system_u:object_r:zabbix_log_t,s0)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 839422c..83bb522 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -9,9 +9,16 @@ type zabbix_t;
type zabbix_exec_t;
init_daemon_domain(zabbix_t, zabbix_exec_t)

+type zabbix_agent_t;
+type zabbix_agent_exec_t;
+init_daemon_domain(zabbix_agent_t, zabbix_agent_exec_t)
+
type zabbix_initrc_exec_t;
init_script_file(zabbix_initrc_exec_t)

+type zabbix_agent_initrc_exec_t;
+init_script_file(zabbix_agent_initrc_exec_t)
+
# log files
type zabbix_log_t;
logging_log_file(zabbix_log_t)
@@ -65,3 +72,31 @@ optional_policy(`
optional_policy(`
postgresql_stream_connect(zabbix_t)
')
+
+########################################
+#
+# zabbix agent local policy
+#
+
+allow zabbix_agent_t self:capability { setuid setgid };
+allow zabbix_agent_t self:process { setsched getsched signal };
+allow zabbix_agent_t self:fifo_file rw_file_perms;
+allow zabbix_agent_t self:unix_stream_socket create_stream_socket_perms;
+allow zabbix_agent_t self:sem create_sem_perms;
+allow zabbix_agent_t self:tcp_socket create_stream_socket_perms;
+allow zabbix_agent_t self:shm create_shm_perms;
+
+## Rules relating to the objects managed by this policy file
+# Logging access
+filetrans_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t, file)
+manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t)
+# PID file management
+manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t)
+files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file)
+# Shared memory
+rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
+fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, { dir file })
+
+## kernel layer module calls
+
+## system layer module calls
--
1.7.3.4

2011-06-13 08:34:12

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 5/7] Zabbix agent binds on its own port, connects to zabbix server

The zabbix agent has its own dedicated port (10050) on which it needs to
bind/listen.

Also, the agent connects to the server so we add the zabbix_tcp_connect
interface (shamelessly copied from mysql_tcp_connect) and use it for the
zabbix_agent_t domain.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/kernel/corenetwork.te.in | 1 +
policy/modules/services/zabbix.if | 21 +++++++++++++++++++++
policy/modules/services/zabbix.te | 6 ++++++
3 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/policy/modules/kernel/corenetwork.te.in b/policy/modules/kernel/corenetwork.te.in
index f4937b9..fb5dd13 100644
--- a/policy/modules/kernel/corenetwork.te.in
+++ b/policy/modules/kernel/corenetwork.te.in
@@ -224,6 +224,7 @@ network_port(xfs, tcp,7100,s0)
network_port(xserver, tcp,6000-6020,s0)
network_port(zarafa, tcp,236,s0, tcp,237,s0)
network_port(zabbix, tcp,10051,s0)
+network_port(zabbix_agent, tcp,10050,s0)
network_port(zookeeper_client, tcp,2181,s0)
network_port(zookeeper_election, tcp,3888,s0)
network_port(zookeeper_leader, tcp,2888,s0)
diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index d77e631..7e37c21 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,27 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to the zabbix server
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_tcp_connect',`
+ gen_require(`
+ type zabbix_t;
+ ')
+
+ corenet_tcp_recvfrom_labeled($1, zabbix_t)
+ corenet_tcp_sendrecv_zabbix_port($1)
+ corenet_tcp_connect_zabbix_port($1)
+ corenet_sendrecv_zabbix_agent_packets($1)
+')
+
+########################################
+## <summary>
## All of the rules required to administrate
## an zabbix environment
## </summary>
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 83bb522..a5fc923 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -93,10 +93,16 @@ manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t)
# PID file management
manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t)
files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file)
+# Port access
+zabbix_tcp_connect(zabbix_agent_t)
# Shared memory
rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, { dir file })

## kernel layer module calls
+corenet_tcp_bind_generic_node(zabbix_agent_t)
+corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t)
+corenet_tcp_connect_zabbix_port(zabbix_agent_t)

## system layer module calls
+sysnet_dns_name_resolve(zabbix_agent_t)
--
1.7.3.4

2011-06-13 08:35:53

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 6/7] Allow zabbix server to connect to agent (active monitoring)

The zabbix server also connects to the agents (this is called "active
monitoring" in the zabbix terms). So we create a zabbix_agent_tcp_connect
interface, use it for the zabbix_t domain and, since zabbix can use
hostname-based connections, allow DNS resolving for the zabbix server.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.if | 21 +++++++++++++++++++++
policy/modules/services/zabbix.te | 4 ++++
2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index 7e37c21..9e8898d 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,27 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to a zabbix agent
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_agent_tcp_connect',`
+ gen_require(`
+ type zabbix_agent_t;
+ ')
+
+ corenet_tcp_recvfrom_labeled($1, zabbix_agent_t)
+ corenet_tcp_sendrecv_zabbix_agent_port($1)
+ corenet_tcp_connect_zabbix_agent_port($1)
+ corenet_sendrecv_zabbix_agent_packets($1)
+')
+
+########################################
+## <summary>
## Allow connectivity to the zabbix server
## </summary>
## <param name="domain">
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index a5fc923..ec4fccd 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -58,11 +58,15 @@ files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file })
rw_files_pattern(zabbix_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, { dir file })

+sysnet_dns_name_resolve(zabbix_t)
+
files_read_etc_files(zabbix_t)

corenet_tcp_bind_generic_node(zabbix_t)
corenet_tcp_bind_zabbix_port(zabbix_t)

+zabbix_agent_tcp_connect(zabbix_t)
+
miscfiles_read_localization(zabbix_t)

optional_policy(`
--
1.7.3.4

2011-06-13 08:40:17

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 7/7] Allow zabbix agent to query system state and other monitorable aspects

The zabbix agent is responsible for collecting the system state and other
monitorable aspects. This include
- information from /proc
- read attributes of various files (tamper detection)
- connect to the ssh service (check if it is reachable)
- get file system information
- read login information
- ...

It should be noted that the agent can do a lot more, depending on the target
system (what is being monitored) and the running services. The allowed
privileges here will in the future expand more as more templates are
checked.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.te | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index ec4fccd..939d827 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -104,9 +104,24 @@ rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, { dir file })

## kernel layer module calls
+kernel_read_all_sysctls(zabbix_agent_t)
+kernel_read_system_state(zabbix_agent_t)
+corecmd_read_all_executables(zabbix_agent_t)
corenet_tcp_bind_generic_node(zabbix_agent_t)
corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t)
+corenet_tcp_connect_ssh_port(zabbix_agent_t)
corenet_tcp_connect_zabbix_port(zabbix_agent_t)
+dev_getattr_all_blk_files(zabbix_agent_t)
+dev_getattr_all_chr_files(zabbix_agent_t)
+domain_search_all_domains_state(zabbix_agent_t)
+files_getattr_all_dirs(zabbix_agent_t)
+files_getattr_all_files(zabbxi_agent_t)
+files_read_all_symlinks(zabbix_agent_t)
+files_read_etc_files(zabbix_agent_t)
+fs_getattr_all_fs(zabbix_agent_t)

## system layer module calls
+init_read_utmp(zabbix_agent_t)
+logging_search_logs(zabbix_agent_t)
+miscfiles_read_localization(zabbix_agent_t)
sysnet_dns_name_resolve(zabbix_agent_t)
--
1.7.3.4

2011-06-13 10:10:38

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 2/7] Support shared memory

On Mon, Jun 13, 2011 at 10:28:15AM +0200, Sven Vermeulen wrote:
> Zabbix servers use shared memory to keep common information and structures.
> This is implemented on tmpfs. We support this by introducing a
> zabbix_tmpfs_t type and allow the server proper access to it.

After a small discussion and a few more tests, drop the "dir" in
fs_tmpfs_filetrans.

For posterity's sake, this is the denial one gets when no tmpfs_t related
privileges are given:

Jun 13 11:24:06 build kernel: [ 213.054230] type=1400
audit(1307957046.001:106): avc: denied { read write } for pid=3162
comm="zabbix_agentd" path=2F535953563663303132323534202864656C6574656429
dev=tmpfs ino=32768 scontext=system_u:system_r:zabbix_agent_t
tcontext=system_u:object_r:tmpfs_t tclass=file

With fs_tmpfs_filetrans(..., file) the same denial is given, but as
tcontext=zabbix_tmpfs_t. Hence the rw_files_pattern() enhancement.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.te | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 3dd76ca..bec98e9 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -16,6 +16,10 @@ init_script_file(zabbix_initrc_exec_t)
type zabbix_log_t;
logging_log_file(zabbix_log_t)

+# shared memory
+type zabbix_tmpfs_t;
+files_tmpfs_file(zabbix_tmpfs_t);
+
# pid files
type zabbix_var_run_t;
files_pid_file(zabbix_var_run_t)
@@ -30,6 +34,7 @@ allow zabbix_t self:fifo_file rw_file_perms;
allow zabbix_t self:process { setsched getsched signal };
allow zabbix_t self:unix_stream_socket create_stream_socket_perms;
allow zabbix_t self:sem create_sem_perms;
+allow zabbix_t self:shm create_shm_perms;

# log files
allow zabbix_t zabbix_log_t:dir setattr;
@@ -41,6 +46,10 @@ manage_dirs_pattern(zabbix_t, zabbix_var_run_t, zabbix_var_run_t)
manage_files_pattern(zabbix_t, zabbix_var_run_t, zabbix_var_run_t)
files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file })

+# shared memory
+rw_files_pattern(zabbix_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
+fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, file)
+
files_read_etc_files(zabbix_t)

miscfiles_read_localization(zabbix_t)
--
1.7.3.4

2011-06-13 10:13:07

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 5/7] Zabbix agent binds on its own port, connects to zabbix server

On Mon, Jun 13, 2011 at 10:34:12AM +0200, Sven Vermeulen wrote:
> The zabbix agent has its own dedicated port (10050) on which it needs to
> bind/listen.
>
> Also, the agent connects to the server so we add the zabbix_tcp_connect
> interface (shamelessly copied from mysql_tcp_connect) and use it for the
> zabbix_agent_t domain.

I should copy better. Old patch referred to corenet_sendrecv_zabbix_packets
which doesn't exist, it's corenet_sendrecv_zabbix_client_packets.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/kernel/corenetwork.te.in | 1 +
policy/modules/services/zabbix.if | 21 +++++++++++++++++++++
policy/modules/services/zabbix.te | 6 ++++++
3 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/policy/modules/kernel/corenetwork.te.in b/policy/modules/kernel/corenetwork.te.in
index f4937b9..fb5dd13 100644
--- a/policy/modules/kernel/corenetwork.te.in
+++ b/policy/modules/kernel/corenetwork.te.in
@@ -224,6 +224,7 @@ network_port(xfs, tcp,7100,s0)
network_port(xserver, tcp,6000-6020,s0)
network_port(zarafa, tcp,236,s0, tcp,237,s0)
network_port(zabbix, tcp,10051,s0)
+network_port(zabbix_agent, tcp,10050,s0)
network_port(zookeeper_client, tcp,2181,s0)
network_port(zookeeper_election, tcp,3888,s0)
network_port(zookeeper_leader, tcp,2888,s0)
diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index d77e631..7e37c21 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,27 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to the zabbix server
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_tcp_connect',`
+ gen_require(`
+ type zabbix_t;
+ ')
+
+ corenet_tcp_recvfrom_labeled($1, zabbix_t)
+ corenet_tcp_sendrecv_zabbix_port($1)
+ corenet_tcp_connect_zabbix_port($1)
+ corenet_sendrecv_zabbix_client_packets($1)
+')
+
+########################################
+## <summary>
## All of the rules required to administrate
## an zabbix environment
## </summary>
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 83bb522..a5fc923 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -93,10 +93,16 @@ manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t)
# PID file management
manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t)
files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file)
+# Port access
+zabbix_tcp_connect(zabbix_agent_t)
# Shared memory
rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, { dir file })

## kernel layer module calls
+corenet_tcp_bind_generic_node(zabbix_agent_t)
+corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t)
+corenet_tcp_connect_zabbix_port(zabbix_agent_t)

## system layer module calls
+sysnet_dns_name_resolve(zabbix_agent_t)
--
1.7.3.4

2011-06-13 10:14:13

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 6/7] Allow zabbix server to connect to agent (active monitoring)

On Mon, Jun 13, 2011 at 10:35:53AM +0200, Sven Vermeulen wrote:
> The zabbix server also connects to the agents (this is called "active
> monitoring" in the zabbix terms). So we create a zabbix_agent_tcp_connect
> interface, use it for the zabbix_t domain and, since zabbix can use
> hostname-based connections, allow DNS resolving for the zabbix server.

Should've copied better.

corenet_sendrecv_zabbix_agent_packets doesn't exist, it's
corenet_sendrecv_zabbix_agent_client_packets.

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.if | 21 +++++++++++++++++++++
policy/modules/services/zabbix.te | 4 ++++
2 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index 7e37c21..9e8898d 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,27 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to a zabbix agent
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_agent_tcp_connect',`
+ gen_require(`
+ type zabbix_agent_t;
+ ')
+
+ corenet_tcp_recvfrom_labeled($1, zabbix_agent_t)
+ corenet_tcp_sendrecv_zabbix_agent_port($1)
+ corenet_tcp_connect_zabbix_agent_port($1)
+ corenet_sendrecv_zabbix_agent_client_packets($1)
+')
+
+########################################
+## <summary>
## Allow connectivity to the zabbix server
## </summary>
## <param name="domain">
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index a5fc923..ec4fccd 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -58,11 +58,15 @@ files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file })
rw_files_pattern(zabbix_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, { dir file })

+sysnet_dns_name_resolve(zabbix_t)
+
files_read_etc_files(zabbix_t)

corenet_tcp_bind_generic_node(zabbix_t)
corenet_tcp_bind_zabbix_port(zabbix_t)

+zabbix_agent_tcp_connect(zabbix_t)
+
miscfiles_read_localization(zabbix_t)

optional_policy(`
--
1.7.3.4

2011-06-15 13:26:45

by cpebenito

[permalink] [raw]
Subject: [refpolicy] [PATCH 7/7] Allow zabbix agent to query system state and other monitorable aspects

On 06/13/11 04:40, Sven Vermeulen wrote:
> The zabbix agent is responsible for collecting the system state and other
> monitorable aspects. This include
> - information from /proc
> - read attributes of various files (tamper detection)
> - connect to the ssh service (check if it is reachable)
> - get file system information
> - read login information
> - ...
>
> It should be noted that the agent can do a lot more, depending on the target
> system (what is being monitored) and the running services. The allowed
> privileges here will in the future expand more as more templates are
> checked.

The style in this patch (and the others adding zabbix_agent_t) needs to
be cleaned up.

> Signed-off-by: Sven Vermeulen <[email protected]>
> ---
> policy/modules/services/zabbix.te | 15 +++++++++++++++
> 1 files changed, 15 insertions(+), 0 deletions(-)
>
> diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
> index ec4fccd..939d827 100644
> --- a/policy/modules/services/zabbix.te
> +++ b/policy/modules/services/zabbix.te
> @@ -104,9 +104,24 @@ rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
> fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, { dir file })
>
> ## kernel layer module calls
> +kernel_read_all_sysctls(zabbix_agent_t)
> +kernel_read_system_state(zabbix_agent_t)
> +corecmd_read_all_executables(zabbix_agent_t)
> corenet_tcp_bind_generic_node(zabbix_agent_t)
> corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t)
> +corenet_tcp_connect_ssh_port(zabbix_agent_t)
> corenet_tcp_connect_zabbix_port(zabbix_agent_t)
> +dev_getattr_all_blk_files(zabbix_agent_t)
> +dev_getattr_all_chr_files(zabbix_agent_t)
> +domain_search_all_domains_state(zabbix_agent_t)
> +files_getattr_all_dirs(zabbix_agent_t)
> +files_getattr_all_files(zabbxi_agent_t)
> +files_read_all_symlinks(zabbix_agent_t)
> +files_read_etc_files(zabbix_agent_t)
> +fs_getattr_all_fs(zabbix_agent_t)
>
> ## system layer module calls
> +init_read_utmp(zabbix_agent_t)
> +logging_search_logs(zabbix_agent_t)
> +miscfiles_read_localization(zabbix_agent_t)
> sysnet_dns_name_resolve(zabbix_agent_t)


--
Chris PeBenito
Tresys Technology, LLC
http://www.tresys.com | oss.tresys.com

2011-06-15 16:56:35

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 4/7] Support different domain for zabbix agent (start with skeleton)

The zabbix agent should be confined within its own domain. We start with the
definition of a small(er) skeleton to work from. This includes proper file
context definitions, standard interdomain privileges (which are quite
similar to those of the server) and the proper log- and pid access
privileges.

Update: attempt to follow styleguide more closely

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.fc | 4 ++-
policy/modules/services/zabbix.te | 39 +++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletions(-)

diff --git a/policy/modules/services/zabbix.fc b/policy/modules/services/zabbix.fc
index 3102286..fb88f70 100644
--- a/policy/modules/services/zabbix.fc
+++ b/policy/modules/services/zabbix.fc
@@ -1,6 +1,8 @@
/etc/rc\.d/init\.d/zabbix -- gen_context(system_u:object_r:zabbix_initrc_exec_t,s0)
+/etc/rc\.d/init\.d/zabbix-agentd -- gen_context(system_u:object_r:zabbix_agent_initrc_exec_t,s0)

-/usr/bin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0)
+/usr/(s)?bin/zabbix_server -- gen_context(system_u:object_r:zabbix_exec_t,s0)
+/usr/(s)?bin/zabbix_agentd -- gen_context(system_u:object_r:zabbix_agent_t,s0)

/var/log/zabbix(/.*)? gen_context(system_u:object_r:zabbix_log_t,s0)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 163f581..457aa2f 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -12,6 +12,14 @@ init_daemon_domain(zabbix_t, zabbix_exec_t)
type zabbix_initrc_exec_t;
init_script_file(zabbix_initrc_exec_t)

+# agent definition
+type zabbix_agent_t;
+type zabbix_agent_exec_t;
+init_daemon_domain(zabbix_agent_t, zabbix_agent_exec_t)
+
+type zabbix_agent_initrc_exec_t;
+init_script_file(zabbix_agent_initrc_exec_t)
+
# log files
type zabbix_log_t;
logging_log_file(zabbix_log_t)
@@ -65,3 +73,34 @@ optional_policy(`
optional_policy(`
postgresql_stream_connect(zabbix_t)
')
+
+########################################
+#
+# zabbix agent local policy
+#
+
+allow zabbix_agent_t self:capability { setuid setgid };
+allow zabbix_agent_t self:process { setsched getsched signal };
+allow zabbix_agent_t self:fifo_file rw_file_perms;
+allow zabbix_agent_t self:sem create_sem_perms;
+allow zabbix_agent_t self:shm create_shm_perms;
+allow zabbix_agent_t self:tcp_socket create_stream_socket_perms;
+allow zabbix_agent_t self:unix_stream_socket create_stream_socket_perms;
+
+## Rules related to the types managed by this policy file
+
+# Logging access
+filetrans_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t, file)
+manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t)
+
+# PID file management
+manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t)
+files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file)
+
+# Shared Memory support
+rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
+fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file)
+
+## Kernel layer module calls
+
+## System layer module calls
--
1.7.3.4

2011-06-15 16:57:43

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 5/7] Zabbix agent binds on its own port, connects to zabbix server

The zabbix agent has its own dedicated port (10050) on which it needs to
bind/listen.

Also, the agent connects to the server so we add the zabbix_tcp_connect
interface (shamelessly copied from mysql_tcp_connect) and use it for the
zabbix_agent_t domain.

Update: structure interface calls more closely to styleguide

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/kernel/corenetwork.te.in | 1 +
policy/modules/services/zabbix.if | 21 +++++++++++++++++++++
policy/modules/services/zabbix.te | 7 +++++++
3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/policy/modules/kernel/corenetwork.te.in b/policy/modules/kernel/corenetwork.te.in
index f4937b9..fb5dd13 100644
--- a/policy/modules/kernel/corenetwork.te.in
+++ b/policy/modules/kernel/corenetwork.te.in
@@ -224,6 +224,7 @@ network_port(xfs, tcp,7100,s0)
network_port(xserver, tcp,6000-6020,s0)
network_port(zarafa, tcp,236,s0, tcp,237,s0)
network_port(zabbix, tcp,10051,s0)
+network_port(zabbix_agent, tcp,10050,s0)
network_port(zookeeper_client, tcp,2181,s0)
network_port(zookeeper_election, tcp,3888,s0)
network_port(zookeeper_leader, tcp,2888,s0)
diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index d77e631..e1cc9b5 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,27 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to the zabbix server
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_tcp_connect',`
+ gen_require(`
+ type zabbix_t;
+ ')
+
+ corenet_sendrecv_zabbix_agent_packets($1)
+ corenet_tcp_connect_zabbix_port($1)
+ corenet_tcp_recvfrom_labeled($1, zabbix_t)
+ corenet_tcp_sendrecv_zabbix_port($1)
+')
+
+########################################
+## <summary>
## All of the rules required to administrate
## an zabbix environment
## </summary>
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index 457aa2f..f0b241b 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -97,6 +97,9 @@ manage_files_pattern(zabbix_agent_t, zabbix_log_t, zabbix_log_t)
manage_files_pattern(zabbix_agent_t, zabbix_var_run_t, zabbix_var_run_t)
files_pid_filetrans(zabbix_agent_t, zabbix_var_run_t, file)

+# Network access to zabbix server
+zabbix_tcp_connect(zabbix_agent_t)
+
# Shared Memory support
rw_files_pattern(zabbix_agent_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file)
@@ -104,3 +107,7 @@ fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file)
## Kernel layer module calls

## System layer module calls
+
+# sysnetwork module
+sysnet_dns_name_resolve(zabbix_agent_t)
+
--
1.7.3.4

2011-06-15 16:58:43

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 6/7] Allow zabbix server to connect to agent (active monitoring)

The zabbix server also connects to the agents (this is called "active
monitoring" in the zabbix terms). So we create a zabbix_agent_tcp_connect
interface, use it for the zabbix_t domain and, since zabbix can use
hostname-based connections, allow DNS resolving for the zabbix server.

Update: Follow styleguide

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.if | 22 ++++++++++++++++++++++
policy/modules/services/zabbix.te | 15 ++++++++++++++-
2 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/policy/modules/services/zabbix.if b/policy/modules/services/zabbix.if
index e1cc9b5..3aa16ab 100644
--- a/policy/modules/services/zabbix.if
+++ b/policy/modules/services/zabbix.if
@@ -79,6 +79,28 @@ interface(`zabbix_read_pid_files',`

########################################
## <summary>
+## Allow connectivity to a zabbix agent
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`zabbix_agent_tcp_connect',`
+ gen_require(`
+ type zabbix_agent_t;
+ ')
+
+ corenet_sendrecv_zabbix_agent_packets($1)
+ corenet_tcp_connect_zabbix_agent_port($1)
+ corenet_tcp_recvfrom_labeled($1, zabbix_t)
+ corenet_tcp_sendrecv_zabbix_agent_port($1)
+')
+
+
+########################################
+## <summary>
## Allow connectivity to the zabbix server
## </summary>
## <param name="domain">
diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index f0b241b..da44bfa 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -59,13 +59,26 @@ files_pid_filetrans(zabbix_t, zabbix_var_run_t, { dir file })
rw_files_pattern(zabbix_t, zabbix_tmpfs_t, zabbix_tmpfs_t)
fs_tmpfs_filetrans(zabbix_t, zabbix_tmpfs_t, file)

-files_read_etc_files(zabbix_t)
+# network access to zabbix agent
+zabbix_agent_tcp_connect(zabbix_t)
+
+## Kernel layer module calls

+# corenetwork module
corenet_tcp_bind_generic_node(zabbix_t)
corenet_tcp_bind_zabbix_port(zabbix_t)

+# files module
+files_read_etc_files(zabbix_t)
+
+## System layer module calls
+
+# miscfiles module
miscfiles_read_localization(zabbix_t)

+# sysnetwork module
+sysnet_dns_name_resolve(zabbix_t)
+
optional_policy(`
mysql_stream_connect(zabbix_t)
')
--
1.7.3.4

2011-06-15 16:59:27

by sven.vermeulen

[permalink] [raw]
Subject: [refpolicy] [PATCH 7/7] Allow zabbix agent to query system state and other monitorable aspects

The zabbix agent is responsible for collecting the system state and other
monitorable aspects. This include
- information from /proc
- read attributes of various files (tamper detection)
- connect to the ssh service (check if it is reachable)
- get file system information
- read login information
- ...

It should be noted that the agent can do a lot more, depending on the target
system (what is being monitored) and the running services. The allowed
privileges here will in the future expand more as more templates are
checked.

Update: follow styleguide

Signed-off-by: Sven Vermeulen <[email protected]>
---
policy/modules/services/zabbix.te | 38 +++++++++++++++++++++++++++++++++++++
1 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/policy/modules/services/zabbix.te b/policy/modules/services/zabbix.te
index da44bfa..df90d73 100644
--- a/policy/modules/services/zabbix.te
+++ b/policy/modules/services/zabbix.te
@@ -119,8 +119,46 @@ fs_tmpfs_filetrans(zabbix_agent_t, zabbix_tmpfs_t, file)

## Kernel layer module calls

+# kernel module
+kernel_read_all_sysctls(zabbix_agent_t)
+kernel_read_system_state(zabbix_agent_t)
+
+# corecommands module
+corecmd_read_all_executables(zabbix_agent_t)
+
+# corenetwork module
+corenet_tcp_bind_generic_node(zabbix_agent_t)
+corenet_tcp_bind_zabbix_agent_port(zabbix_agent_t)
+corenet_tcp_connect_ssh_port(zabbix_agent_t)
+corenet_tcp_connect_zabbix_port(zabbix_agent_t)
+
+# devices module
+dev_getattr_all_blk_files(zabbix_agent_t)
+dev_getattr_all_chr_files(zabbix_agent_t)
+
+# domain module
+domain_search_all_domains_state(zabbix_agent_t)
+
+# files module
+files_getattr_all_dirs(zabbix_agent_t)
+files_getattr_all_files(zabbix_agent_t)
+files_read_all_symlinks(zabbix_agent_t)
+files_read_etc_files(zabbix_agent_t)
+
+# filesystem module
+fs_getattr_all_fs(zabbix_agent_t)
+
## System layer module calls

+# init module
+init_read_utmp(zabbix_agent_t)
+
+# logging module
+logging_search_logs(zabbix_agent_t)
+
+# miscfiles module
+miscfiles_read_localization(zabbix_agent_t)
+
# sysnetwork module
sysnet_dns_name_resolve(zabbix_agent_t)

--
1.7.3.4

2011-06-15 18:20:18

by cpebenito

[permalink] [raw]
Subject: [refpolicy] [PATCH 0/7] Updates on zabbix service

On 06/13/11 04:20, Sven Vermeulen wrote:
> Zabbix is an open-source/free software monitoring solution. A module already
> exists in the refpolicy, but does not work properly. Also, the module does
> not support a different domain for the agents (zabbix agents) although this
> is greatly preferred.
>
> The following set of patches introduce the following to this module set:
>
> 1. Zabbix server is a multi-process system requiring signals to be sent and
> (exclusive) locks to be taken where needed (for instance used with
> logging)
> 2. Zabbix servers use posix shared memory (using tmpfs backend), so create a
> zabbix_tmpfs_t domain and allow the server access to manage it
> 3. Zabbix uses a dedicated port (10051) for its server. Allow the servers to
> bind to it, and of course define it as a specific port in SELinux
> 4. Start with the definition of the zabbix_agent_t domain
> 5. Allow zabbix_agent to bind on its own port (10050) and connect to the
> zabbix server (for the regular metric submissions)
> 6. The zabbix server also needs to connect to the agent (for what Zabbix
> calls "active monitoring")
> 7. Give zabbix_agent_t the privileges it needs to scan the system (get
> system state, read files, check services, ...)

Merged. In the future, when you revise a patch set, please resend the
entire set. Then I know for sure I have all of the up-to-date patches,
rather than digging through the replies for the right patch.

--
Chris PeBenito
Tresys Technology, LLC
http://www.tresys.com | oss.tresys.com