On 22 February 2016 at 20:18, Flavio Leitner <f...@sysclose.org> wrote:

> On Mon, 15 Feb 2016 17:40:25 -0800
> Ansis Atteka <ansisatt...@gmail.com> wrote:
>
> > From: Ansis Atteka <aatt...@nicira.com>
> >
> > CentOS, RHEL and Fedora distributions ship with their own Open vSwitch
> > SELinux policy that is too strict and prevents Open vSwitch to work
> > normally out of the box.
> >
> > As a solution, this patch introduces a new package which will "loosen"
> > up "openvswitch_t" SELinux domain so that Open vSwitch could operate
> > normally.
> >
> > Intended use-cases of this package are:
> > 1. to allow users to install newer Open vSwitch on already released
> Fedora,
> > RHEL and CentOS distributions where the default Open vSwitch SELinux
> policy
> > that shipped with the corresponding Linux distribution is not up to date
> > and did not anticipate that a newer Open vSwitch version might need to
> > invoke new system calls or need to access certain system resources that
> > it did not before; And
> > 2. to provide alternative means through which Open vSwitch developers
> > can proactively fix SELinux related policy issues without waiting for
> > corresponding Linux distribution maintainers to update their central
> > Open vSwitch SELinux policy.
> >
> > This patch was tested on Fedora 23 and CentOS 7. I verified that now
> > on Fedora 23 Open vSwitch can create a NetLink socket; and that I did
> > not see following error messages:
> >
> > vlog|INFO|opened log file /var/log/openvswitch/ovs-vswitchd.log
> > ovs_numa|INFO|Discovered 2 CPU cores on NUMA node 0
> > ovs_numa|INFO|Discovered 1 NUMA nodes and 2 CPU cores
> > reconnect|INFO|unix:/var/run/openvswitch/db.sock: connecting...
> > reconnect|INFO|unix:/var/run/openvswitch/db.sock: connected
> > netlink_socket|ERR|fcntl: Permission denied
> > dpif_netlink|ERR|Generic Netlink family 'ovs_datapath' does not exist.
> >                  The Open vSwitch kernel module is p robably not loaded.
> > dpif|WARN|failed to enumerate system datapaths: Permission denied
> > dpif|WARN|failed to create datapath ovs-system: Permission denied
> >
> > I did not test all Open vSwitch features so there still could be some
> > OVS configuration that would get "Permission denied" errors.
> >
> > Since, Open vSwitch daemons on Ubuntu 15.10 by default run under
> "unconfined"
> > SELinux domain, then there is no need to create a similar debian package
> > for Ubuntu, because it works on default Ubuntu installation.
> >
> > Signed-Off-By: Ansis Atteka <aatt...@nicira.com>
> > ---
> >  INSTALL.SELinux.md              | 166
> ++++++++++++++++++++++++++++++++++++++++
> >  Makefile.am                     |   2 +
> >  README.md                       |   2 +
> >  rhel/openvswitch-fedora.spec.in |  27 +++++++
> >  selinux/automake.mk             |   9 +++
> >  selinux/openvswitch-custom.te   |   9 +++
> >  6 files changed, 215 insertions(+)
> >  create mode 100644 INSTALL.SELinux.md
> >  create mode 100644 selinux/automake.mk
> >  create mode 100644 selinux/openvswitch-custom.te
> >
> > diff --git a/INSTALL.SELinux.md b/INSTALL.SELinux.md
> > new file mode 100644
> > index 0000000..dc93d6d
> > --- /dev/null
> > +++ b/INSTALL.SELinux.md
> > @@ -0,0 +1,166 @@
> > +Running Open vSwitch under SELinux
> > +==================================
> > +
> > +Security-Enhanced Linux (SELinux) is a Linux kernel security
> > +module that limits "the malicious things" that certain processes,
> > +including OVS, can do to the system in case they get compromised.
> > +In our case SELinux basically serves as the "second line of defense"
> > +that limits the things that OVS processes are allowed to do.  The
> > +"first line of defense" is proper input validation that eliminates
> > +code paths that could be used by attacker to do any sort of
> > +"escape attacks" (e.g. file name escape, shell escape, command
> > +line argument escape, buffer escape).  Since developers don't
> > +always implement proper input validation, then SELinux Access
> > +Control's goal is to confine damage of such attacks, if they
> > +turned out to be possible.
> > +
> > +Besides Type Enforcement there are other SELinux
> > +features, but they are out of scope for this document.
> > +
> > +Currently there are two SELinux policies for Open vSwitch:
> > +1. the one that ships with your Linux distribution (i.e.
> > +   selinux-policy-targeted package); And
> > +2. the one that ships with OVS (i.e. openvswitch-selinux-policy
> > +   package).
> > +
> > +
> > +Limitations
> > +-----------
> > +
> > +If Open vSwitch is directly started from command line, then it
> > +will run under "unconfined_t" SELinux domain that basically lets
> > +daemon to do whatever it likes.  This is very important for developers
> > +to understand, because they might introduced code in OVS that invokes
> > +new system calls that SELinux policy did not anticipate.  This means
> > +that their feature may have worked out just fine for them.  However,
> > +if someone else would try to run the same code when Open vSwitch is
> > +started through systemctl, then Open vSwitch would get Permission Denied
> > +errors.
> > +
> > +Currently the only distributions that enforce SELinux on OVS by
> > +default are RHEL, CentOS and Fedora.  While Ubuntu and Debian also
> > +have some SELinux support, they run Open vSwitch under the unrestricted
> > +"unconfined" domain.  Also, it seems that Ubuntu is leaning towards
> > +Apparmor that works slightly differently than SELinux.
> > +
> > +SELinux and Open vSwitch are moving targets.  What this means
> > +is that, if you solely rely on your Linux distribution's SELinux policy,
> > +then this policy might not have correctly anticipated that a newer
> > +Open vSwitch version needs extra white list rules.  However, if you
> > +solely rely on SELinux policy that ships with Open vSwitch, then
> > +Open vSwitch developers might not have correctly anticipated the
> > +feature set that your SELinux implementation supports.
> > +
> > +
> > +Installation
> > +------------
> > +
> > +Refer to [INSTALL.Fedora.md] for instructions on how to build all
> > +Open vSwitch rpm packages.
> > +
> > +Once the package is built, install it on your Linux distribution with:
> > +
> > +   # yum install
> openvswitch-selinux-policy-2.4.1-1.el7.centos.noarch.rpm
> > +
> > +And, then restart Open vSwitch:
> > +
> > +   # systemctl restart openvswitch
> > +
> > +
> > +Troubleshooting
> > +---------------
> > +
> > +When SELinux was implemented some of the standard system utilities
> > +acquired "-Z" flag (e.g. "ps -Z", "ls -Z").  For example, to find out
> > +under which SELinux security domain process runs, use:
> > +
> > +   # ps -AZ | grep ovs-vswitchd
> > +   system_u:system_r:openvswitch_t:s0 854 ?    ovs-vswitchd
> > +
> > +To find out the SELinux label of file or directory, use:
> > +
> > +   # ls -Z /etc/openvswitch/conf.db
> > +   system_u:object_r:openvswitch_rw_t:s0 /etc/openvswitch/conf.db
> > +
> > +
> > +If, for example, SELinux policy for Open vSwitch is too strict,
> > +then you might see in Open vSwitch log files "Permission Denied"
> > +errors:
> > +
> > +    # cat /var/log/openvswitch/ovs-vswitchd.log
> > +    vlog|INFO|opened log file /var/log/openvswitch/ovs-vswitchd.log
> > +    ovs_numa|INFO|Discovered 2 CPU cores on NUMA node 0
> > +    ovs_numa|INFO|Discovered 1 NUMA nodes and 2 CPU cores
> > +    reconnect|INFO|unix:/var/run/openvswitch/db.sock: connecting...
> > +    reconnect|INFO|unix:/var/run/openvswitch/db.sock: connected
> > +    netlink_socket|ERR|fcntl: Permission denied
> > +    dpif_netlink|ERR|Generic Netlink family 'ovs_datapath' does not
> exist.
> > +                     The Open vSwitch kernel module is probably not
> loaded.
> > +    dpif|WARN|failed to enumerate system datapaths: Permission denied
> > +    dpif|WARN|failed to create datapath ovs-system: Permission denied
> > +
> > +
> > +
> > +However, not all "Permission denied" errors are caused by SELinux.  So,
> > +before blaming too strict SELinux policy, make sure that indeed SELinux
> > +was the one that denied OVS access to certain resources, for example,
> run:
> > +
> > +   # grep "openvswitch_t" /var/log/audit/audit.log | tail
> > +   type=AVC msg=audit(1453235431.640:114671): avc:  denied  { getopt }
> for  pid=4583 comm="ovs-vswitchd"
> scontext=system_u:system_r:openvswitch_t:s0
> tcontext=system_u:system_r:openvswitch_t:s0 tclass=netlink_generic_socket
> permissive=0
> > +
> > +
> > +If SELinux denied OVS access to certain resources, then make sure that
> you
> > +have installed our SELinux policy package that "loosens" up
> distribution's
> > +SELinux policy:
> > +
> > +   # rpm -qa | grep openvswitch-selinux
> > +   openvswitch-selinux-policy-2.4.1-1.el7.centos.noarch
> > +
> > +And, then verify that this module was indeed loaded:
> > +
> > +   # semodule -l | grep openvswitch
> > +   openvswitch-custom    1.0
> > +   openvswitch          1.1.1
> > +
> > +If you still see Permission denied errors, then take a look
> > +into selinux/openvswitch.te file in the OVS source tree and
> > +try to add white list rules.  This is really simple, just run
> > +SELinux audit2allow tool:
> > +
> > +   # grep "openvswitch_t" /var/log/audit/audit.log | audit2allow -M
> ovslocal
> > +
> > +
> > +Contributing SELinux policy patches
> > +-----------------------------------
> > +
> > +Here are few things to consider before proposing SELinux policy
> > +patches to Open vSwitch developer mailing list:
> > +
> > +1. The SELinux policy that resides in Open vSwitch source tree
> > +   amends SELinux policy that ships with your distributions.
> > +
> > +   Implications of this are that it is assumed that the distribution's
> > +   Open vSwitch SELinux module must be already loaded to satisfy
> > +   dependencies.
> > +
> > +2. The SELinux policy that resides in Open vSwitch source tree
> > +   must work on all currently relevant Linux distributions.
> > +
> > +   Implications of this are that you should use only those SELinux
> > +   policy features that are supported by the lowest SELinux version
> > +   out there.
> > +
> > +3. The SELinux policy is enforced only when state transition to
> > +   openvswitch_t domain happens.
> > +
> > +   Implications of this are that perhaps instead of loosening SELinux
> > +   policy you can do certain things at the time rpm package is
> installed.
> > +
> > +
> > +
> > +Reporting Bugs
> > +--------------
> > +
> > +Please report problems to b...@openvswitch.org.
> > +
> > +[INSTALL.md]:INSTALL.md
> > diff --git a/Makefile.am b/Makefile.am
> > index 75ccadf..a71a4d6 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -79,6 +79,7 @@ docs = \
> >       INSTALL.Libvirt.md \
> >       INSTALL.NetBSD.md \
> >       INSTALL.RHEL.md \
> > +        INSTALL.SELinux.md \
>
> Makefile uses TABs.
>
>
> >       INSTALL.SSL.md \
> >       INSTALL.XenServer.md \
> >       INSTALL.userspace.md \
> > @@ -431,3 +432,4 @@ include datapath-windows/automake.mk
> >  include datapath-windows/include/automake.mk
> >  include windows/automake.mk
> >  include ovn/automake.mk
> > +include selinux/automake.mk
> > diff --git a/README.md b/README.md
> > index b590928..82065c7 100644
> > --- a/README.md
> > +++ b/README.md
> > @@ -97,6 +97,8 @@ To use Open vSwitch...
> >
> >  - ...without using a kernel module, read [INSTALL.userspace.md].
> >
> > +- ...with SELinux, read [INSTALL.SELinux.md].
> > +
> >  For answers to common questions, read [FAQ.md].
> >
> >  To learn how to set up SSL support for Open vSwitch, read [
> INSTALL.SSL.md].
> > diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/
> openvswitch-fedora.spec.in
> > index 00e491b..c018370 100644
> > --- a/rhel/openvswitch-fedora.spec.in
> > +++ b/rhel/openvswitch-fedora.spec.in
> > @@ -46,6 +46,7 @@ BuildRequires: systemd-units openssl openssl-devel
> >  BuildRequires: python python-twisted-core python-zope-interface PyQt4
> python-six
> >  BuildRequires: desktop-file-utils
> >  BuildRequires: groff graphviz
> > +BuildRequires: checkpolicy, selinux-policy-devel
> >  # make check dependencies
> >  BuildRequires: procps-ng
> >  %if %{with libcapng}
> > @@ -72,6 +73,15 @@ Open vSwitch provides standard network bridging
> functions and
> >  support for the OpenFlow protocol for remote per-flow control of
> >  traffic.
> >
> > +%package selinux-policy
> > +Summary: Open vSwitch SELinux policy
> > +License: ASL 2.0
> > +BuildArch: noarch
> > +Requires: selinux-policy-targeted
> > +
> > +%description selinux-policy
> > +Tailored Open vSwitch SELinux policy
> > +
> >  %package -n python-openvswitch
> >  Summary: Open vSwitch python bindings
> >  License: ASL 2.0
> > @@ -131,6 +141,8 @@ overlays and security groups.
> >       --with-pkidir=%{_sharedstatedir}/openvswitch/pki
> >
> >  make %{?_smp_mflags}
> > +cd selinux
> > +make -f %{_datadir}/selinux/devel/Makefile
> >
> >  %install
> >  rm -rf $RPM_BUILD_ROOT
> > @@ -172,6 +184,9 @@ install -d -m 0755
> $RPM_BUILD_ROOT/%{_sharedstatedir}/openvswitch
> >  touch $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/conf.db
> >  touch $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/system-id.conf
> >
> > +install -p -m 644 -D selinux/openvswitch-custom.pp \
> > +
> $RPM_BUILD_ROOT%{_datadir}/selinux/packages/%{name}/openvswitch-custom.pp
> > +
> >  # remove unpackaged files
> >  rm -f $RPM_BUILD_ROOT%{_bindir}/ovs-parse-backtrace \
> >          $RPM_BUILD_ROOT%{_bindir}/ovs-pcap \
> > @@ -245,6 +260,9 @@ rm -rf $RPM_BUILD_ROOT
> >      fi
> >  %endif
> >
> > +%post selinux-policy
> > +/usr/sbin/semodule -i
> %{_datadir}/selinux/packages/%{name}/openvswitch-custom.pp &> /dev/null || :
> > +
> >  %postun
> >  %if 0%{?systemd_postun_with_restart:1}
> >      %systemd_postun_with_restart %{name}.service
> > @@ -271,6 +289,15 @@ rm -rf $RPM_BUILD_ROOT
> >      fi
> >  %endif
> >
> > +%postun selinux-policy
> > +if [ $1 -eq 0 ] ; then
> > +  /usr/sbin/semodule -r openvswitch-custom &> /dev/null || :
> > +fi
> > +
> > +%files selinux-policy
> > +%defattr(-,root,root)
> > +%{_datadir}/selinux/packages/%{name}/openvswitch-custom.pp
> > +
> >  %files -n python-openvswitch
> >  %{python_sitelib}/ovs
> >  %doc COPYING
> > diff --git a/selinux/automake.mk b/selinux/automake.mk
> > new file mode 100644
> > index 0000000..1088f36
> > --- /dev/null
> > +++ b/selinux/automake.mk
> > @@ -0,0 +1,9 @@
> > +# Copyright (C) 2016 Nicira, Inc.
> > +#
> > +# Copying and distribution of this file, with or without modification,
> > +# are permitted in any medium without royalty provided the copyright
> > +# notice and this notice are preserved.  This file is offered as-is,
> > +# without warranty of any kind.
> > +
> > +EXTRA_DIST += \
> > +        selinux/openvswitch-custom.te
> > diff --git a/selinux/openvswitch-custom.te
> b/selinux/openvswitch-custom.te
> > new file mode 100644
> > index 0000000..fc32b97
> > --- /dev/null
> > +++ b/selinux/openvswitch-custom.te
> > @@ -0,0 +1,9 @@
> > +module openvswitch-custom 1.0;
> > +
> > +require {
> > +        type openvswitch_t;
> > +        class netlink_socket { setopt getopt create connect getattr
> write read };
> > +}
> > +
> > +#============= openvswitch_t ==============
> > +allow openvswitch_t self:netlink_socket { setopt getopt create connect
> getattr write read };
>
> There is a macro in Fedora 23 called create_socket_perms which expands to:
> { create ioctl read getattr lock write setattr append bind connect \
>   getopt setopt shutdown }
>
> and Fedora is shipping the following line instead:
> allow openvswitch_t self:netlink_socket create_socket_perms;
>
> What I am saying is that your version is more restrictive and if you
> haven't tested all use-cases, there might be some still restricted.
>
> I am fine either way.
>
> Therefore, after fixing the Makefile issue:
>
> Acked-by: Flavio Leitner <f...@sysclose.org>
>

Thanks, I fixed Makefile and pushed it.

>
> Thanks!
> --
> fbl
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to