O SELinux impede o comando de execução ao usar o systemd no Fedora 25

1

Estou tentando executar o OpenVPN em um namespace de rede myns através de systemd no Fedora 25. Parece que o SELinux está impedindo que ele funcione.

Olhando para journalctl -xe , acho que esta é a parte relevante:

-- Subject: Unit myvpn.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit myvpn.service has begun starting up.
Jul 11 16:26:19 castiel audit[32456]: AVC avc:  denied  { mounton } for  pid=32456 comm="ip" path="/etc/resolv.conf" dev="sda1" ino=1572869 scontext=system_u:system_r:ifconfig_t:s0 tcontext=system_u:o
bject_r:net_conf_t:s0 tclass=file permissive=0
Jul 11 16:26:19 castiel audit[32456]: AVC avc:  denied  { execute } for  pid=32456 comm="ip" name="openvpn" dev="sda1" ino=1705174 scontext=system_u:system_r:ifconfig_t:s0 tcontext=system_u:object_r:o
penvpn_exec_t:s0 tclass=file permissive=0
Jul 11 16:26:19 castiel ip[32456]: Bind /etc/netns/myns/resolv.conf -> /etc/resolv.conf failed: Permission denied
Jul 11 16:26:19 castiel ip[32456]: exec of "/sbin/openvpn" failed: Permission denied
Jul 11 16:26:19 castiel systemd[1]: myvpn.service: Control process exited, code=exited status=1
Jul 11 16:26:19 castiel audit[1]: SERVICE_START pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=nordvpn comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? a
ddr=? terminal=? res=failed'
Jul 11 16:26:19 castiel systemd[1]: Failed to start OpenVPN connection to myvpn.
-- Subject: Unit myvpn.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit myvpn.service has failed.

/var/log/audit/audit.log :

type=AVC msg=audit(1499799030.259:16264): avc:  denied  { mounton }
    for  pid=1419 comm="ip" path="/etc/resolv.conf" dev="sda1" ino=1572869
    scontext=system_u:system_r:ifconfig_t:s0
    tcontext=system_u:object_r:net_conf_t:s0
    tclass=file permissive=0
type=AVC msg=audit(1499799030.259:16265): avc:  denied  { execute }
    for  pid=1419 comm="ip" name="openvpn" dev="sda1" ino=1705174
    scontext=system_u:system_r:ifconfig_t:s0
    tcontext=system_u:object_r:openvpn_exec_t:s0
    tclass=file permissive=0
type=SERVICE_START msg=audit(1499799030.268:16266):
    pid=1 uid=0 auid=4294967295 ses=4294967295
    subj=system_u:system_r:init_t:s0 msg='unit=myvpn
    comm="systemd" exe="/usr/lib/systemd/systemd"
    hostname=? addr=? terminal=? res=failed'
type=SERVICE_START msg=audit(1499800402.528:16267):
    pid=1 uid=0 auid=4294967295 ses=4294967295 
    subj=system_u:system_r:init_t:s0 msg='unit=dnf-makecache comm="systemd" 
    exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=SERVICE_STOP msg=audit(1499800402.528:16268): 
    pid=1 uid=0 auid=4294967295 ses=4294967295 
    subj=system_u:system_r:init_t:s0 msg='unit=dnf-makecache comm="systemd" 
    exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'

# ll -Z /etc/resolv.conf mostra isso: -rw-r--r--. 1 root root system_u:object_r:net_conf_t:s0 61 Jul 9 17:26 /etc/resolv.conf

É assim que o arquivo de serviço se parece:

[Unit]
[Service]
Type=forking
ExecStart=/sbin/ip netns exec myns /sbin/openvpn --config /etc/openvpn/profiles/myprofile.ovpn --auth-user-pass /etc/openvpn/credentials --daemon [email protected] --writepid /run/[email protected]
PIDFile=/run/[email protected]

[Install]
WantedBy=multi-user.target

Se eu definir o selinux como permissivo ( setenforce 0 ), tudo funciona bem.

Se eu executar o comando self-end, ele funcionará bem com a aplicação de selinux:

/sbin/ip netns exec myns /sbin/openvpn --config /etc/openvpn/profiles/myprofile.ovpn --auth-user-pass /etc/openvpn/credentials --daemon [email protected] --writepid /run/[email protected]

curl ifconfig.io retorna meu IP público e ip netns exec myns curl ifconfig.io retorna o IP do servidor VPN.

O que devo fazer para que o SELinux permita que o script systemd funcione sem desabilitar o SELinux?

    
por mjuopperi 15.07.2017 / 10:47

1 resposta

2

A execução com setenforce 0 foi capaz de obter as seguintes regras de permissão usando audit2allow :

#============= ifconfig_t ==============
allow ifconfig_t net_conf_t:file mounton;
allow ifconfig_t openvpn_etc_t:file { getattr open read };
allow ifconfig_t openvpn_exec_t:file { execute execute_no_trans open read };
allow ifconfig_t openvpn_tmp_t:dir { read write };

Eu também tenho essa regra dos mesmos registros

#============= ifconfig_t ==============

#!!!! WARNING: 'tmp_t' is a base type.
allow ifconfig_t tmp_t:dir { read write };

Para não permitir isso, criei uma subpasta com o rótulo openvpn_tmp_t em /tmp e executei openvpn com o argumento --tmp-dir apontando para esse diretório.

Depois disso, ainda não consegui iniciar o serviço. Olhando para journalctl -xe , vi que houve um problema ao carregar um arquivo de configuração:

-- Unit myvpn.service has begun starting up.
Jul 17 06:19:56 castiel ip[22825]: Options error: In [CMD-LINE]:1: Error opening configuration file: /etc/openvpn/profiles/myprofile.ovpn
Jul 17 06:19:56 castiel ip[22825]: Use --help for more information.
Jul 17 06:19:56 castiel systemd[1]: myvpn.service: Control process exited, code=exited status=1
Jul 17 06:19:56 castiel systemd[1]: Failed to start OpenVPN connection to myprofile.ovpn.

Eu tentei novamente com setenforce 0 e foi possível inicializar. Surpreendentemente não havia nada no log de auditoria sobre isso.

Eu pesquisei e deparei com uma velha pergunta na lista de discussão do Fedora selinux . Aparentemente, há uma regra de dontaudit que bloqueia o registro de algumas mensagens. Isso pode ser desativado com semodule -DB (reativado com semodule -B ).

Com o restante dos erros registrados, recebi mais algumas linhas que enviei para as regras com audit2allow :

#============= ifconfig_t ==============
allow ifconfig_t openvpn_etc_t:dir search;
allow ifconfig_t openvpn_tmp_t:dir search;

#============= init_t ==============
allow init_t ifconfig_t:process noatsecure;
allow init_t kernel_t:unix_stream_socket { read write };

Com essas políticas combinadas, consegui executar o openvpn dentro do namespace da rede por meio do systemd.

Ainda não tenho certeza de como essas regras são seguras ou se há uma maneira melhor de fazer isso.

    
por 17.07.2017 / 09:57