Fedora 25에서 systemd를 사용할 때 SELinux는 명령 실행을 차단합니다.

Fedora 25에서 systemd를 사용할 때 SELinux는 명령 실행을 차단합니다.

Fedora 25에서 systemd를 통해 네트워크 네임스페이스에서 OpenVPN을 실행하려고 합니다. mynsSELinux가 작동을 방해하는 것 같습니다.

그것을 보면 journalctl -xe이것이 관련 부분이라고 생각합니다.

-- 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이것을 보여주세요:
-rw-r--r--. 1 root root system_u:object_r:net_conf_t:s0 61 Jul 9 17:26 /etc/resolv.conf


서비스 파일은 다음과 같습니다.

[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

selinux를 permissive()로 설정하면 setenforce 0정상적으로 작동합니다.


명령을 직접 실행하면 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내 공용 IP를 반환하고
ip netns exec myns curl ifconfig.ioVPN 서버의 IP를 반환합니다.


SELinux를 완전히 비활성화하지 않고도 systemd 스크립트가 작동할 수 있도록 SELinux를 얻으려면 어떻게 해야 합니까?

답변1

실행할 때 setenforce 0다음을 사용하여 다음 허용 규칙을 얻을 수 있었습니다 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 };

나도 같은 로그에서 이 규칙을 얻었습니다.

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

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

이를 허용하지 않기 위해 openvpn_tmp_t레이블이 있는 하위 폴더를 만들고 /tmp해당 디렉터리를 가리키는 인수를 사용하여 실행했습니다.openvpn--tmp-dir


이 후에도 여전히 서비스를 시작할 수 없습니다. 을 살펴보면 journalctl -xe구성 파일을 로드하는 데 문제가 있는 것을 확인했습니다.

-- 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.

다시 시도했는데 setenforce 0부팅되었습니다. 놀랍게도 있습니다아무것도 없다이는 감사 로그에 기록되어 있습니다.

검색해서 하나 찾았는데Fedora selinux 메일링 리스트에 대한 오래된 질문. dontaudit특정 메시지가 기록되지 않도록 하는 규칙이 있는 것 같습니다 . 이 기능은 semodule -DB(re-enabled 사용 ) 을 사용하여 끌 수 있습니다 semodule -B.

나머지 오류를 기록한 후 몇 줄을 더 얻었고 이를 규칙으로 변환했습니다 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 };

이러한 전략을 결합함으로써 systemd를 통해 네트워크 네임스페이스 내에서 openvpn을 실행할 수 있었습니다.

이 규칙이 얼마나 안전한지, 이 문제를 해결하는 더 좋은 방법이 있는지는 아직 잘 모르겠습니다.

관련 정보