Fedora 25에서 systemd를 통해 네트워크 네임스페이스에서 OpenVPN을 실행하려고 합니다. myns
SELinux가 작동을 방해하는 것 같습니다.
그것을 보면 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.io
VPN 서버의 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을 실행할 수 있었습니다.
이 규칙이 얼마나 안전한지, 이 문제를 해결하는 더 좋은 방법이 있는지는 아직 잘 모르겠습니다.