openvpn post-up script falha com “Operação não permitida” se e somente se o openvpn for executado pelo systemd

3

Eu tenho este script de post-up que é executado pelo openvpn:

#!/bin/bash
echo "I am: 'whoami'"
echo "Moving interface into the netns"
ip link set dev "$1" up netns hydrogenvpn mtu "$2"
echo "Listing"
ip netns ls
echo "test"
ip netns exec hydrogenvpn cat /tmp/foobar

Se eu executar o openvpn com qualquer um desses comandos: service openvpn start , /etc/init.d/openvpn start , systemctl start [email protected] , recebo isso nos meus logs:

Sun Oct  9 11:19:15 2016 us=851109 /sbin/ip link set dev tun-hyd2 up mtu 1500
Sun Oct  9 11:19:15 2016 us=858267 /sbin/ip addr add dev tun-hyd2 10.43.43.3/24 broadcast 10.43.43.255
Sun Oct  9 11:19:15 2016 us=872474 /etc/openvpn/hydrogen_postup.sh tun-hyd2 1500 1542 10.43.43.3 255.255.255.0 init
I am: root
Moving interface into the netns
Listing
novpn (id: 1)
hydrogenvpn (id: 0)
test
setting the network namespace "hydrogenvpn" failed: Operation not permitted

No entanto, se eu executar o openvpn com o mesmo comando que o systemd usa, ele funciona:

# systemctl status [email protected] | grep Process
  Process: 7722 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, status=0/SUCCESS)
# /usr/sbin/openvpn --daemon ovpn-hydrogen --status /run/openvpn/hydrogen.status 10 --cd /etc/openvpn --config /etc/openvpn/hydrogen.conf --writepid /run/openvpn/hydrogen.pid
# tail /var/log/openvpn.log
Sun Oct  9 11:25:28 2016 us=762617 /sbin/ip addr add dev tun-hyd2 10.43.43.3/24 broadcast 10.43.43.255
Sun Oct  9 11:25:28 2016 us=767131 /etc/openvpn/hydrogen_postup.sh tun-hyd2 1500 1542 10.43.43.3 255.255.255.0 init
I am: root
Moving interface into the netns
Listing
novpn (id: 1)
hydrogenvpn (id: 0)
test
<content of /tmp/foobar>
Sun Oct  9 11:25:28 2016 us=952737 Initialization Sequence Completed

Eu também tentei iniciar o openvpn com o systemd e depois rodar o script manualmente, ele também funciona.

Por que existe uma diferença entre as duas corridas? E como posso fazer o script funcionar quando executado pelo openvpn iniciado com o systemd?

Versões: Teste Debian, openvpn 2.3.11-2, systemd 231-9

    
por Valentin Lorentz 09.10.2016 / 11:33

1 resposta

4

Este é o arquivo de serviço para o OpenVPN ( /lib/systemd/system/[email protected] ):

[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
PrivateTmp=true
KillMode=mixed
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid
PIDFile=/run/openvpn/%i.pid
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
ProtectSystem=yes
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw

[Install]
WantedBy=multi-user.target

Existem três coisas que limitam o que pode ser feito:

  • CapabilityBoundingSet limita as coisas que esta unidade pode fazer. Existem provavelmente algumas funcionalidades necessárias para "ip netns" que não estão lá. Por exemplo, ip netns faz uma ligação mount --bind que requer CAP_SYS_ADMIN .

  • ProtectSystem impede que a unidade modifique o sistema de arquivos (não acho que isso impeça a montagem da ligação);

  • LimitNPROC limitam o número de processos na unidade. É provavelmente a fonte do seu problema, mas pode ser um problema para scripts complexos.

por 09.10.2016 / 12:30