Docker et Portainer part 4 – Docker, OpenVPN et Splunk

Docker et Portainer

Salut à tous, dans le dernier TP on s’est penché sur la définition de plusieurs conteneur dans un Stack pour mettre en place un client Guacamole. Aujourd’hui on va regarder comment monter un serveur openvpn au travers de docker et superviser celui-là avec Splunk en faisant communiquer plusieurs stacks entres-elles, et comme d’habitude dans Portainer.

Rappel des articles de la série « Docker et Portainer » :

OpenVPN ?

OpenVPN est une technologie opensource de VPN. C’est pas forcément la plus répandue (plutôt du IPsec avec L2TP or IKEv2) mais il lui reste quelques avantages par rapport à du L2TP/IPsec :

  • Elle peut fonctionner sur un port HTTPS en parallèle d’un site web sur le même serveur.
  • Au dernière nouvelles, le protocole n’est pas cassé par la NSA.
  • C’est une techno open-source.

Aujourd’hui la tendance est plutôt à WireGuard, mais OpenVPN reste un bon standard en production. Je passe sur pourquoi utiliser et mettre en place un VPN, il y a tout vos youtubeurs préférés qui ont du vous sensibiliser là-dessus normalement…^^

Mon objectif est assez simple, avoir un VPN pour mon smartphone et manière à pouvoir utiliser les wifi-public sans trop d’inquiétude en déplacement.

Docker et OpenVPN

Tout comme pour Guacamole et VSFTPD, la question d’utiliser une image toute prête ou d’en reconstruire une se pose. Pour ce TP, histoire de gagner du temps, j’ai utilisé celle-ci : kylemanna/openvpn, qui est bien documentée et construit une PKI proprement (et simplement) pour l’authentification. Donc c’est partie.

On doit d’abord créer un volume et placer nos configuration dedans. Vous noterez ci-dessous que je configure mon VPN en TCP et non en UDP comme c’est souvent le cas en VPN :

# docker volume create --name vpn_data
# docker run -v vpn_data:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_genconfig -u tcp://vpn.geekeries.org
# docker run -v vpn_data:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki

Et donc, à partir de la on peut déployer la Stack suivante :

version: '2'
services:
  geekeries_nginx:
    container_name: vpn
    hostname: vpn
    image: kylemanna/openvpn
    restart: unless-stopped
    volumes:
      - vpn_data:/etc/openvpn
    ports:
      - 8443:1194/tcp
    cap_add:
      - NET_ADMIN

Dès que votre service est running est votre VPN est accessible sur le port 8443 qui est redirigé sur le 1194 (dès que votre conf DNS sera propagé) si que votre firewall laisse entrer ce trafic. Sauf qu’aucun utilisateur n’est configuré. Il faut donc le créer et sortir de votre conteneur le fichier de configuration pour votre client :

# docker run -v vpn_data:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full Pixel3XL_Etienne
# docker run -v vpn_data:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient Pixel3XL_Etienne > Pixel3XL_Etienne.ovpn 

Sur votre téléphone, il vous faudra installer l’application OpenVPN Connect – Fast & Safe SSL VPN Client, le protocole, OpenVPN n’étant pas supporté par défaut dans Android. Ensuite on ouvre l’appli et il faut importer le fichier .ovpn que vous avez généré sur votre serveur, indiquer le mot de passe, et c’est plier. En image ça donne :

docker openvpn splunk

Puis :

docker openvpn splunk

et enfin :

docker openvpn splunk

Connectez-vous et c’est bon :

docker openvpn splunk

Et je vous laisse vérifier avec un coup d’œil sur icanhazip.com que votre IP publique est bien celle de votre serveur et plus celle de votre opérateur.

Docker, OpenVPN et Splunk

Bon c’est beau tout ça mais on aimerai bien le superviser notre VPN, non ? Et avec Splunk si possible. Il y a deux scenarios possible :

  1. Votre Splunk est un serveur « externe » à docker et vous pouvez passer directement au paragraphe log plus bas.
  2. Votre Splunk est aussi une image Docker dans votre portainer. Et il faut configurer le réseau.

Moi, je suis dans le second cas, donc c’est parti…

Network et docker

Dans le cas où votre Splunk est dans docker, il faut savoir que par défaut, les conteneurs sont placés dans un sous-réseau privée « interne » à docker de type bridge qui est différent pour chaque Stack. Voici, par exemple, celui qui a été créé quand on a lancé notre stack VPN :

Alors au sein d’une même stack on peut définir des alias DNS entre les conteneurs pour leur permettre de se parler sans avoir la connaissance de l’IP, via l’option links, exemple :

  web:
    [...]
    links:
      - "php-fpm:php"    
      - "db:database"
  php-fpm:
    image: php-fpm
  db:
    image: mariadb

Ce système fonctionne très bien au sein d’une seule stack, mais lorsqu’on veut connecter plusieurs stacks entre elles, ça devient un peu galère. Et on a pas envi d’intégrer une instance Splunk Free dans chacune de nos Stacks…

Comme je l’ai dit, celles ci sont créées dans des réseaux « interne docker » différents qui ne peuvent pas communiquer entre eux. La première option pour contourner ça consiste à utiliser l’option external_link en complément de la spécification du réseau commun avec l’autre machine dans votre Stack :

version: '2'
services:
  vpn:
    image: kylemanna/openvpn
    external_links:
      - splunk
    networks:
      - bridge
      - backend_network
networks:
  backend_network
    external: true

Et vous pouvez définir votre network comme ça dans Portainer.

Pour cela nos conteneurs doivent « parler » entre eux.
Et du coup vos conteneurs se retrouvent avec 2 IP sur les 2 réseaux différents : bridge pour leur accès au net et backend_network pour communiquer entre elles.

L’autre option consiste à remplacer le réseau par défaut (bridge), par un autre, du même type, et mettre tout vos conteneurs dans celui ci, et dans mon cas j’en ai profité pour appliquer un adressage IP statique dans ce sous-réseau pour simplifier la supervision. Et donc dans vos stacks définir ainsi la partie réseau :

    networks:
      Proxy_net:
        ipv4_address: 172.18.1.4
networks:
  Proxy_net:
    external:
      name: Proxy_net

Et il faudra évidement faire la même chose pour votre conteneur Splunk.

Logs

Maintenant que nos conteneurs sont configurés pour être dans le même sous-réseau et qu’il peuvent communiquer entre eux. On peut utiliser le module logging de docker pour alimenter directement notre splunk.

La bonne nouvelle c’est que docker embarque un format « Splunk natif » de log prévu pour les HTTP_collector de Splunk. Pour ça rendez vous dans paramètres, entrée de données puis Ajouter un nouveau Collecteur d’événements HTTP. Remplissez les informations comme vous le souhaitez pour votre Splunk.

Pour obtenir un jeton dédié.

A partir de là votre serveur Splunk écoute par défaut sur le port 8088, et indexera les sources de logs qui s’identifient avec le token généré.

Ensuite rendez vous dans votre Stack et configurez-là ainsi pour le logging.

    logging:
      driver: splunk
      options:
        splunk-token: "21812b4f-f96d-4414-8706-be2ac02998b8"
        splunk-url: "https://172.18.3.1:8088"
        splunk-insecureskipverify: "true"
        splunk-verify-connection: "false"
        tag: "{{.ImageName}}/{{.Name}}/{{.ID}}"
        labels: "VPN"
    networks:
      Proxy_net:
        ipv4_address: 172.18.6.1
networks:
  Proxy_net:
    external:
      name: Proxy_net

Redémarrez votre conteneur et (modulo d’éventuels problèmes de firewalls) vous devriez avoir des logs qui remontent dans votre Splunk :

kylemanna/openvpn/vpn/655bf8588a9f Fri Apr 24 11:23:34 2020 123.145.156.178:1337 TLS: Initial packet from [AF_INET]123.145.156.178:1337, sid=25f66787 6d6c659a

Pour terminer, concernant l’extraction des logs de VPN dans Splunk, il n’existe pas de TA pour ça aujourd’hui. Il y a bien la TA-pfsense sauf que les logs sont modifiés pour commencer par « openvpn: » pour la suite pfsense, pas top.

docker openvpn splunk

Du coup, j’ai proposé un TA chez splunk pour extraire ces logs, elle est toujours en « waiting approval », on verra si elle est conservées comme mes 3 précédentes.

Conclusion

Voilà, c’est pas mal pour aujourd’hui avec Docker, OpenVPN et Splunk, non? En ces temps de confinement ou les VPN sont devenu l’outil de base pour le boulot, j’espère que ça vous donnera quelques idées pour que tout le monde puisse bosser de chez soit… on commence se rapprocher de la fin de ces TP docker, mais la prochaine fois, je vous expliquerai comment personnalisé un image docker pour l’adapter à vos besoins.

@+

4 commentaires on “Docker et Portainer part 4 – Docker, OpenVPN et Splunk

  1. salut,

    j’ai installé openvpn depuis un certain temps. il se trouve dans tant que image-docker sur OMV/Docker-Portainer.

    OMV est en 192.168.1.240 sur mon LAN et j’y ai quelques dossier partagés.

    l’idée d’installer in tel vpn est de pouvoir accéder à mes dossiers LAN depuis « l’extérieur » en toute quiétude en me connectant à ce vpn.

    or le réseau d’openvpn est sur un bridge (172.17.0.0/16), je pense que je ne t’apprends rien c’est le même que celui que tu cites plus haut, et je n’arrive pas à voir comment faire un lien vers le LAN. Là ç’est un peu au dessus de mes compétences…

    difficile de trouver un tuto tout fait alors j’essaye de trouver de l’aide…

    merci d’avance,
    ph

    Franchement, je n’ai pas le niveau pour

    • Hello ph,
      Effectivement la partie réseau de Docker peut être un peu prise de tête parfois. De ce que je comprend, au niveau de ta serveur OMV (OpenMediaVault?), et lors du déploiement de ton conteneur tu doit spécifier les ports du serveur hôte à forwarder vers le conteneur. Dans les stacks que j’utilise c’est la ligne suivante qui redirige les connexions TCP/8843 sur l’hote vers TCP/1194 sur le conteneur :
      ports:
      - 8443:1194/tcp

      Si tu instancie directement des conteneurs sans passer par des stacks, il faut utiliser l’option -p 8443:1194 dans la ligne de commande docker pour faire cette redirection.
      Pour contrôler, un coup de netstat -tunlp sur le serveur devrait te montrera que le port est bien ouvert et la configuration du firewall (Iptables -L) que la redirection est en place et que le port est ouvert).
      Note enfin que j’utilise ici des networks spécifiques et pas le bridge par défaut de docker (cf. § Network et docker de ce billet).
      Dernier point, vue ta description tu as l’air de travailler derrière une box ADSL dans un LAN, n’oublie pas les redirections du NAT de la box vers ton serveur interne OVM et le port à rediriger vers ton conteneur docker du coup.
      J’espère que ça t’aidera ! @+

  2. Bonjour,
    franchement bravo!
    moi qui ne jurait que par proxmox/lxc, vous (tu) m’avez (m’a) donné envie d’utiliser docker!
    Les explications sur les volumes, les stacks sont claires et on voit bien l’utilité. J’aime bien l’utilisation de portainer aussi.
    Je me posais également des questions sur la gestion des logs, là j’ai de quoi maintenant.
    J’ai pu très facilement mettre en place docker+portainer+bitwarden_rs dans une vm proxmox du coup!

    Bref que du bonheur monsieur…

    • Salut Dominique,
      « Tu » c’est bon, on est entre gens bien ici…^^
      Content d’avoir pu t’aider, merci pour ton commentaire ça fait toujours plaisir d’avoir un retour.
      J’utilise bitwarden mais je connaissais pas bitwarden_rs du coup, merci pour l’astuce. J’irai jeter un œil.
      @+

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.