Contexte
openvpn
version récente (>2.4.0, j’utilise une 2.4.4)- configuration
openvpn
en « unpriviledged user » (i.e. votre logiciel ne tourne pas enroot
) - vous avez suivi la doc à la lettre et vous avez bien modifié les paramètres :
user
(votre utilisateur non privilégié)group
(votre groupe non privilégié)iproute
(un script shell qui wrappe la commandeip
avec unsudo
)
Un peu comme ceci, par exemple :
root@svr:~# egrep '^(user|group|iproute)' /etc/openvpn/servers.conf iproute /usr/local/openvpn/manage-interface user openvpn group openvpn root@svr:~# cat /usr/local/openvpn/manage-interface #!/bin/sh /usr/bin/sudo /sbin/ip $* root@svr:~# cat /etc/sudoers.d/openvpn openvpn ALL=(ALL) NOPASSWD:/sbin/ip
Traces dans les logs d'erreur
Votre fichier /var/log/syslog
(ou équivalent, selon votre distribution Linux) affiche les lignes suivantes :
Sep 9 11:08:30 svr systemd[1]: Starting OpenVPN connection to servers... Sep 9 11:08:30 svr ovpn-servers[25063]: OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Dec 30 2017 Sep 9 11:08:30 svr ovpn-servers[25063]: library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08 Sep 9 11:08:30 svr systemd[1]: Started OpenVPN connection to servers. Sep 9 11:08:30 svr ovpn-servers[25063]: TUN/TAP device tunServers opened Sep 9 11:08:30 svr ovpn-servers[25063]: do_ifconfig, tt->did_ifconfig_ipv6_setup=0 Sep 9 11:08:30 svr ovpn-servers[25063]: /usr/local/openvpn/manage-interface link set dev tunServers up mtu 1500 Sep 9 11:08:30 svr root: {/usr/bin/sudo /sbin/ip link set dev tunServers up mtu 1500} Sep 9 11:08:30 svr openvpn[25063]: sudo: unable to send audit message Sep 9 11:08:30 svr openvpn[25063]: sudo: pam_open_session: System error Sep 9 11:08:30 svr openvpn[25063]: sudo: policy plugin failed session initialization Sep 9 11:08:30 svr ovpn-servers[25063]: Linux ip link set failed: external program exited with error status: 1 Sep 9 11:08:30 svr ovpn-servers[25063]: Exiting due to fatal error Sep 9 11:08:30 svr systemd[1]: openvpn@servers.service: Main process exited, code=exited, status=1/FAILURE Sep 9 11:08:30 svr systemd[1]: openvpn@servers.service: Unit entered failed state. Sep 9 11:08:30 svr systemd[1]: openvpn@servers.service: Failed with result 'exit-code'.
La cause d’erreur à bien repérer est là : impossible d’envoyer un message de type « audit » :
sudo: unable to send audit message
Méthode de résolution de l'incident
Méthode automatisée
Il faut taper la commande (en utilisateur root
) :
root@svr:~# systemctl edit openvpn@.service
(le « .service » n’est pas obligatoire ; attention à l’arobase)
Et, une fois en mode édition, il faut écrire les 2 lignes suivantes et enregistrer :
[Service] CapabilityBoundingSet=CAP_AUDIT_WRITE
Puis redémarrer le service openvpn
.
Méthode manuelle
Il faut créer un fichier texte, puis recharger la configuration systemd
:
root@svr:~# cat > /etc/systemd/system/openvpn@.service.d/override.conf << EOF [Service] CapabilityBoundingSet=CAP_AUDIT_WRITE EOF root@svr:~# systemctl daemon-reload
Puis redémarrer le service openvpn
.
Cause de l'incident
Le système de démarrage de openvpn
, par défaut, restreint les capacités du lanceur du programme à certaines fonctionnalités. Et il en manque une. Comment voir la restriction ?
root@svr:~# grep Capa /lib/systemd/system/openvpn@.service CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
Il est évidemment hors de question de modifier ce fichier, car il est géré par le système de déploiement du logiciel openvpn
(fichier DEB ou RPM), et il va donc se faire écraser lors de chaque mise à jour du système.
Plus globalement, c’est mal d’éditer les fichiers par défaut car les modifications vont être écrasées lors des prochains déploiements, il faut utiliser à tout prix les systèmes d’override quand ils existent. 🙂