3 votes

openvpn post-up script échoue avec "Operation not permitted" si et seulement si openvpn est exécuté par systemd

J'ai ce post-up script qui est exécuté par 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

Si je lance openvpn avec une de ces commandes : service openvpn start , /etc/init.d/openvpn start , systemctl start openvpn@hydrogen.service J'obtiens ceci dans mes journaux :

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

Cependant, si je lance openvpn avec exactement la même commande que celle utilisée par systemd, cela fonctionne :

# systemctl status openvpn@hydrogen.service | 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

J'ai également essayé de démarrer openvpn avec systemd puis d'exécuter le script manuellement, cela fonctionne aussi.

Pourquoi y a-t-il une différence entre les deux parcours ? Et comment faire pour que le script fonctionne lorsqu'il est exécuté par openvpn lancé avec systemd ?

Versions : Debian testing, openvpn 2.3.11-2, systemd 231-9

0 votes

Cet espace de nom de réseau existe-t-il déjà avant de lancer openvpn, ou l'avez-vous créé dans un script post-up ?

0 votes

Elle existe déjà.

5voto

Hugo Points 11

C'est le fichier de service pour OpenVPN ( /lib/systemd/system/openvpn@.service ) :

[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

Il y a trois choses qui limitent ce qui peut être fait :

  • CapabilityBoundingSet limite les choses que cette unité peut faire. Il y a probablement des aptitudes nécessaires à "ip netns" qui ne sont pas là. Par exemple ip netns fait une liaison mount --bind qui exige CAP_SYS_ADMIN .

  • ProtectSystem empêche l'unité de modifier le système de fichiers (je ne pense pas que cela empêche le bind mount) ;

  • LimitNPROC limiter le nombre de processus dans l'unité. C'est probablement la source de votre problème mais cela pourrait être un problème pour les scripts complexes.

0 votes

Mon fichier de service ( /lib/systemd/system/openvpn.service ) n'a aucune de ces limitations. Cependant, l'utilisation de strace sur /sbin/ip J'ai remarqué ceci juste avant que l'erreur soit signalée : open("/var/run/netns/hydrogenvpn", O_RDONLY|O_CLOEXEC) = 5 setns(5, CLONE_NEWNET) = -1 EPERM (Operation not permitted) donc il se pourrait que CapabilityBoundingSet a une valeur par défaut qui exclut CAP_SYS_ADMIN

0 votes

J'ai ajouté votre CapabilityBoundingSet à mon fichier de service, avec CAP_SYS_ADMIN à la fin ; aucun changement.

0 votes

@ValentinLorentz, regardez openvpn@.service. Ajout de CapabilityBoundingSet n'aidera probablement pas. L'enlever pourrait le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X