Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp671901ybi; Sat, 15 Jun 2019 09:08:32 -0700 (PDT) X-Google-Smtp-Source: APXvYqyobJTlXJD0UtZjZKLCuEWXX8PfJI5EQv5czbo1NWGYhDvchWx0MVv7+dtHw/EPgjOFpFoR X-Received: by 2002:aa7:8203:: with SMTP id k3mr99892735pfi.124.1560614912367; Sat, 15 Jun 2019 09:08:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560614912; cv=none; d=google.com; s=arc-20160816; b=d5+aCj9ThOf693g2uI6vJ/foIB4BH5aH5mzfVQS/EltKgiY4Z6Z64MU/W5j9G0huA+ +FU4QCkE8bV2xF++ye6wbed1NpZLs38sp6eZ/4Qh6SlPd+862EKgDOQRQjYhfVZlcBqL 5npynLOwsfLHetGcW3vk9e8cXU3JXYTrhUzDE74q7+UXYYoKRwNjrmOXiFksS6LB4N2z AnYm4Tyeyg288DUhFfzI258kVtXQegpLr4uQia9H4xKT3v8iejJwBVeC4j3f4HQaIS0W tfdN8sAAQnuwDagdw/rX51wMzEqMyBw95fJzDIw4qU0TawLCkhwRMxg2/+AOB7FNOAf+ xHPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject:dkim-signature; bh=3ATuukYeNgyDxEaaoFoGOI9YWATjpSI1TqA6GO3T3tI=; b=yufEzICNJIkpxpxuaW0vjG7aHc1NoS5z+hmq4vGKpA3Qi4yVZLAa/yMF4aUFBSirEF V+kmIJiTPZoZ9eNX4LeeOx6A5XpKvTTdzllLjIC84lOfXkgxA5Lb4ubDghYqQSDMOMev zp4HMiMApvPzW9x0U43M93MacSfsHOWzFl34TiEFWePiJWmIHSLByq2/bivrwh3qqvON VsFQUWad9m9ruzveQvuNCSNNYKTJKfQhjHSrlVAHeOYzoquCI80E3D7K+i6dqJNvKkVg QRtUWWyiAL/zda8CItftOJrVqD6V/TkoSpbw1UkffYhcmJAYm9fvGuI814DFFkN0UFzQ BJzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ieee.org header.s=google header.b=LRgiTGZo; spf=pass (google.com: best guess record for domain of selinux-refpolicy-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=selinux-refpolicy-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ieee.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 199si5498988pga.123.2019.06.15.09.08.28; Sat, 15 Jun 2019 09:08:32 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of selinux-refpolicy-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ieee.org header.s=google header.b=LRgiTGZo; spf=pass (google.com: best guess record for domain of selinux-refpolicy-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=selinux-refpolicy-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ieee.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726703AbfFOQIT (ORCPT + 11 others); Sat, 15 Jun 2019 12:08:19 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:33021 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726405AbfFOQIT (ORCPT ); Sat, 15 Jun 2019 12:08:19 -0400 Received: by mail-qt1-f196.google.com with SMTP id x2so6143777qtr.0 for ; Sat, 15 Jun 2019 09:08:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ieee.org; s=google; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=3ATuukYeNgyDxEaaoFoGOI9YWATjpSI1TqA6GO3T3tI=; b=LRgiTGZo7paHoBgk95/gvEYdP1eejqWPVptl2cGfnsYLjfGCQvrsQIo3Q+FH0RhVMu fWCqCruOqMTQ0m9xxXUhbdlgn15a2PgIEzLZpDi98a+6u3IwdgNCBLE5AjH2xer75aEJ Xnd+quWXrHr0RP0PyH3Q/eHPF5Ja1NCJ6bS3c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=3ATuukYeNgyDxEaaoFoGOI9YWATjpSI1TqA6GO3T3tI=; b=qjLzaObDqOLGtAaGu3ba6ohtBgWkDWSQKMvlJ/OAe2gK7zE5oniJXg2lIXvlLrP7go C48mv44ptyC1LCL8dRv5j5TPRdFEZVdMCVyfXve8ndMWpB1kQHRKTUyYSqUdY7iVBGO3 19I+8RgtHgROhD5YsCUfTwiAtD5H+OEGRRGyhqyaGnSptk5B2XXPKwjcDYGLG82RWtrD nn6AYWHt3z6TKjcEwaiwPHAVgbV89bvR+/WoxPgqz2Zz6EHYqWpoHDVqNcldfrZ3zA/R 19zQi1+fyZWnGhHrRC6ll/dN5j/nb/LV2TiIcpDYD4HHzvqUJz0ZvTEN0Cb1cpgZ6X+9 r5qA== X-Gm-Message-State: APjAAAXYwdvhrnnsu4H4gmdU0ST7oaclK4JFAeiCEaK0uldXqrz7khLt YDOEUMd6EId6GGao39YBDL0LIhMz5U8= X-Received: by 2002:ac8:2d69:: with SMTP id o38mr72382276qta.169.1560614897922; Sat, 15 Jun 2019 09:08:17 -0700 (PDT) Received: from [192.168.1.190] (pool-108-15-23-247.bltmmd.fios.verizon.net. [108.15.23.247]) by smtp.gmail.com with ESMTPSA id g188sm3088357qkc.52.2019.06.15.09.08.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 15 Jun 2019 09:08:17 -0700 (PDT) Subject: Re: [PATCH] add lldpd policy To: Alexander Miroshnichenko , selinux-refpolicy@vger.kernel.org References: <20190610142004.2719-1-alex@millerson.name> From: Chris PeBenito Message-ID: <749388e0-6da1-4b06-c62c-35302a5aba78@ieee.org> Date: Sat, 15 Jun 2019 12:08:16 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <20190610142004.2719-1-alex@millerson.name> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: selinux-refpolicy-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: selinux-refpolicy@vger.kernel.org On 6/10/19 10:20 AM, Alexander Miroshnichenko wrote: > New policy for lldpd ( http://vincentbernat.github.io/lldpd ). > > Signed-off-by: Alexander Miroshnichenko > --- > policy/modules/roles/sysadm.te | 4 + > policy/modules/services/lldpd.fc | 9 ++ > policy/modules/services/lldpd.if | 206 +++++++++++++++++++++++++++++++ > policy/modules/services/lldpd.te | 80 ++++++++++++ > 4 files changed, 299 insertions(+) > create mode 100644 policy/modules/services/lldpd.fc > create mode 100644 policy/modules/services/lldpd.if > create mode 100644 policy/modules/services/lldpd.te > > diff --git a/policy/modules/roles/sysadm.te b/policy/modules/roles/sysadm.te > index 8f891c83865f..ea4e06a29e30 100644 > --- a/policy/modules/roles/sysadm.te > +++ b/policy/modules/roles/sysadm.te > @@ -595,6 +595,10 @@ optional_policy(` > lldpad_admin(sysadm_t, sysadm_r) > ') > > +optional_policy(` > + lldp_admin(sysadm_t, sysadm_r) A whitespace problem here (spaces instead of tab). > +') > + > optional_policy(` > lockdev_role(sysadm_r, sysadm_t) > ') > diff --git a/policy/modules/services/lldpd.fc b/policy/modules/services/lldpd.fc > new file mode 100644 > index 000000000000..997a80a3baf9 > --- /dev/null > +++ b/policy/modules/services/lldpd.fc > @@ -0,0 +1,9 @@ > +/etc/lldpd.conf -- gen_context(system_u:object_r:lldpd_etc_t,s0) > +/etc/lldpd.d(/.*)? gen_context(system_u:object_r:lldpd_etc_t,s0) > + > +/usr/sbin/lldpd -- gen_context(system_u:object_r:lldpd_exec_t,s0) > +/usr/sbin/lldpcli -- gen_context(system_u:object_r:lldp_cli_exec_t,s0) > + > +/run/lldpd -d gen_context(system_u:object_r:lldpd_var_run_t,s0) > +/run/lldpd(/.*)? gen_context(system_u:object_r:lldpd_var_run_t,s0) > +/run/lldpd.pid -- gen_context(system_u:object_r:lldpd_var_run_t,s0) > diff --git a/policy/modules/services/lldpd.if b/policy/modules/services/lldpd.if > new file mode 100644 > index 000000000000..f7030b1ead19 > --- /dev/null > +++ b/policy/modules/services/lldpd.if > @@ -0,0 +1,206 @@ > + > +## policy for lldpd > + > +######################################## > +## > +## Execute lldpd_exec_t in the lldpd domain. > +## > +## > +## > +## Domain allowed to transition. > +## > +## > +# > +interface(`lldpd_domtrans',` > + gen_require(` > + type lldpd_t, lldpd_exec_t; > + ') > + > + corecmd_search_bin($1) > + domtrans_pattern($1, lldpd_exec_t, lldpd_t) > +') > + > +######################################## > +## > +## Execute a domain transition to run lldpcli. > +## > +## > +## > +## Domain allowed to transition. > +## > +## > +# > +interface(`lldp_cli_domtrans',` Interface name should be lldp_domtrans_cli > + gen_require(` > + type lldp_cli_t, lldp_cli_exec_t; > + ') > + > + corecmd_search_bin($1) > + can_exec($1, lldp_cli_exec_t) This can_exec should not be in a domtrans interface, as it provides execute_no_trans, which isn't necessary for domtrans. > + domtrans_pattern($1, lldp_cli_exec_t, lldp_cli_t) > +') > + > +######################################## > +## > +## Execute lldpcli in the lldp_cli domain, > +## and allow the specified role > +## the lldp_cli domain. > +## > +## > +## > +## Domain allowed to transition. > +## > +## > +## > +## > +## Role allowed access. > +## > +## > +# > +interface(`lldp_cli_run',` lldp_run_cli > + gen_require(` > + type lldp_cli_t; > + ') > + > + lldp_cli_domtrans($1) > + role $2 types lldp_cli_t; > +') > + > +###################################### > +## > +## Execute lldpd in the caller domain. > +## > +## > +## > +## Domain allowed access. > +## > +## > +# > +interface(`lldpd_exec',` > + gen_require(` > + type lldpd_exec_t; > + ') > + > + corecmd_search_bin($1) > + can_exec($1, lldpd_exec_t) > +') > + > +######################################## > +## > +## Search lldpd conf directories. > +## > +## > +## > +## Domain allowed access. > +## > +## > +# > +interface(`lldpd_search_conf',` > + gen_require(` > + type lldpd_etc_t; > + ') > + > + allow $1 lldpd_etc_t:dir search_dir_perms; > + files_search_etc($1) > +') > + > +######################################## > +## > +## Read lldpd conf files. > +## > +## > +## > +## Domain allowed access. > +## > +## > +# > +interface(`lldpd_read_conf_files',` > + gen_require(` > + type lldpd_etc_t; > + ') > + > + allow $1 lldpd_etc_t:dir list_dir_perms; > + read_files_pattern($1, lldpd_etc_t, lldpd_etc_t) > + files_search_etc($1) > +') > + > +######################################## > +## > +## Manage lldpd conf files. > +## > +## > +## > +## Domain allowed access. > +## > +## > +# > +interface(`lldpd_manage_conf_files',` > + gen_require(` > + type lldpd_etc_t; > + ') > + > + manage_files_pattern($1, lldpd_etc_t, lldpd_etc_t) > + files_search_etc($1) > +') > + > +######################################## > +## > +## Create, read, write, and delete > +## lldpd PID files. > +## > +## > +## > +## Domain allowed access. > +## > +## > +# > +interface(`lldpd_manage_pid_files',` > + gen_require(` > + type lldpd_var_run_t; > + ') > + > + files_search_pids($1) > + manage_files_pattern($1, lldpd_var_run_t, lldpd_var_run_t) > + manage_dirs_pattern($1, lldpd_var_run_t, lldpd_var_run_t) > +') > + > + > +######################################## > +## > +## All of the rules required to administrate > +## an lldpd environment > +## > +## > +## > +## Domain allowed access. > +## > +## > +## > +## > +## Role allowed access. > +## > +## > +## > +# > +interface(`lldp_admin',` > + gen_require(` > + type lldpd_t; > + type lldpd_etc_t; > + type lldpd_var_run_t; > + ') > + > + allow $1 lldpd_t:process { signal_perms }; > + ps_process_pattern($1, lldpd_t) > + > + tunable_policy(`allow_ptrace',` > + allow $1 lldpd_t:process ptrace; > + ') allow_ptrace is not a global tunable and cannot be used here. Also there are whitespace problems. > + files_search_etc($1) > + admin_pattern($1, lldpd_etc_t) > + > + files_search_pids($1) > + admin_pattern($1, lldpd_var_run_t) > + > + lldp_cli_run($1, $2) > +') > diff --git a/policy/modules/services/lldpd.te b/policy/modules/services/lldpd.te > new file mode 100644 > index 000000000000..9a0f68dc4b7b > --- /dev/null > +++ b/policy/modules/services/lldpd.te > @@ -0,0 +1,80 @@ > +policy_module(lldpd, 1.0.0) > + > +######################################## > +# > +# Declarations > +# > + > +type lldpd_t; > +type lldpd_exec_t; > +init_daemon_domain(lldpd_t, lldpd_exec_t) > + > +type lldp_cli_t; > +type lldp_cli_exec_t; > +init_system_domain(lldp_cli_t, lldp_cli_exec_t) > +application_domain(lldp_cli_t, lldp_cli_exec_t) > + > +type lldpd_etc_t; Please rename to lldpd_conf_t, as I'd like to try to get away from encoding paths into type names. > +files_config_file(lldpd_etc_t) > + > +type lldpd_var_run_t; Same thing here, lldpd_runtime_t. > +files_pid_file(lldpd_var_run_t) > +init_daemon_pid_file(lldpd_var_run_t, dir, "lldpd") > +typealias lldpd_var_run_t alias lldp_sock_t; Not really a necessary alias. I'd prefer to keep aliases for backwards compatibility situations. > + > +######################################## > +# > +# lldpd local policy > +# > +allow lldpd_t self:capability { chown dac_override fowner fsetid kill net_admin net_raw setgid setuid sys_chroot }; > +allow lldpd_t self:process { fork signal_perms }; > +allow lldpd_t self:fifo_file rw_fifo_file_perms; > +allow lldpd_t self:unix_stream_socket { accept listen }; These perms should probably be create_stream_socket_perms. > +allow lldpd_t lldp_sock_t:sock_file { create_sock_file_perms delete_sock_file_perms setattr }; This is not necessary, as there is a sock_file rule below. > +allow lldpd_t self:packet_socket create_socket_perms; > + > +lldp_cli_domtrans(lldpd_t) The daemon runs the cli tool? > +kernel_read_net_sysctls(lldpd_t) > + > +lldpd_read_conf_files(lldpd_t) > + > +lldpd_manage_pid_files(lldpd_t) Since there are other rules that explicitly operate on lldpd_var_run_t, it would be clearer to do the same for files instead of calling its own interface. > +manage_sock_files_pattern(lldpd_t, lldpd_var_run_t, lldpd_var_run_t) > +manage_lnk_files_pattern(lldpd_t, lldpd_var_run_t, lldpd_var_run_t) > +files_pid_filetrans(lldpd_t, lldpd_var_run_t, {file dir sock_file}) > + > +domain_use_interactive_fds(lldpd_t) This does not seem likely since it is a daemon, not an interactive process. > +files_read_etc_files(lldpd_t) > + > +logging_send_syslog_msg(lldpd_t) > + > +miscfiles_read_localization(lldpd_t) > + > +sysnet_dns_name_resolve(lldpd_t) > + > +######################################## > +# > +# lldp_cli local policy > +# > +allow lldp_cli_t self:capability dac_override; > +allow lldp_cli_t self:unix_dgram_socket { connect create }; > +allow lldp_cli_t self:unix_stream_socket { connect create read write }; > +allow lldp_cli_t self:process signal; > + > +allow lldp_cli_t lldpd_t:unix_stream_socket connectto; > +allow lldp_cli_t lldpd_var_run_t:sock_file { read write }; Please use stream_connect_pattern() > + > +lldpd_read_conf_files(lldp_cli_t) > + > +logging_send_syslog_msg(lldp_cli_t) > + > +files_dontaudit_read_etc_files(lldp_cli_t) > + > +miscfiles_read_localization(lldp_cli_t) > + > +domain_use_interactive_fds(lldp_cli_t) This line is in the wrong place. > +userdom_use_user_ptys(lldp_cli_t) > +init_dontaudit_use_script_ptys(lldp_cli_t) This should not be necessary, as this is allowed via init_system_domain(). -- Chris PeBenito