OpenStack 2025.1 : Le Guide Ultime pour OVN IPsec avec Kayobe et FreeIPA

La sécurité “Zero Trust” n’est plus une option pour les clouds privés modernes. Si vous déployez OpenStack après 2025.1, vous utilisez sûrement OVN (Open Virtual Network) pour le SDN (Software Defined Network). Mais par défaut, le trafic entre vos hyperviseurs circule en clair.

Dans ce guide, nous allons implémenter le chiffrement IPsec pour les tunnels Geneve (Generic Network Virtualization Encapsulation). Nous allons construire une chaîne automatisée robuste :

  1. FreeIPA fournit et renouvelle les certificats automatiquement.
  2. Certmonger surveille ces certificats sur l’OS de l’hôte.
  3. Kayobe orchestre la configuration en injectant les clés dans les conteneurs Kolla.

L’Architecture : Le défi du Conteneur

C’est là que réside la complexité. Dans un déploiement Kolla/Kayobe :

  • La PKI (Certificats) doit être gérée par l’OS hôte (pour que Certmonger fonctionne).
  • Le service OVS tourne dans un conteneur isolé (openvswitch_vswitchd).
  • Le chiffrement IPsec est effectué par le Kernel Linux de l’hôte.

Nous devons donc générer les clés sur l’hôte, les monter dans le conteneur, et piloter la configuration depuis l’extérieur.

1. Prérequis Réseau : la MTU

C’est non-négociable. L’encapsulation (Geneve) + le chiffrement (ESP) ajoutent environ 100 à 130 octets d’overhead. Pour que vos VMs aient une vie normale (MTU 1500), le réseau physique (“Underlay”) doit être en Jumbo Frames.

Dans kayobe/inventory/group_vars/all/network :

network_interfaces:
  - device: eth1
    mtu: 9000
    description: "Tunnel Interface"

Dans kayobe/kolla/globals.yml :

network_mtu: 9000
kolla_enable_neutron_mtu: "yes"
neutron_tenant_network_mtu: 1500

2. Préparation Kolla : Monter les Volumes

Puisque OVS est enfermé dans un conteneur, il ne voit pas vos certificats par défaut. Il faut “monter” le dossier des clés.

Créez le fichier kayobe/kolla/config/openvswitch.yml :

# On monte le dossier des clés de l'hôte vers le conteneur en lecture seule
openvswitch_vswitchd_extra_volumes:
  - "/etc/openvswitch/keys:/etc/openvswitch/keys:ro"

3. Le Hook Ansible : Automatisation PKI & Firewall

Ce playbook va transformer chaque nœud en client FreeIPA, ouvrir le pare-feu et préparer les certificats.

Fichier : etc/kayobe/ansible/hooks/setup-host-pki.yml

---
- name: Configure Host PKI and Firewall for OVN IPsec
  hosts: overcloud
  become: true
  vars:
    ovs_keys_dir: /etc/openvswitch/keys
    ipa_domain: "internal.corp.net"
    # Astuce: utilisez kayobe-vault pour ce mot de passe
    ipa_join_password: ""

  tasks:
    # --- Étape A : Firewall (Crucial !) ---
    - name: Allow IPsec protocols (IKE, NAT-T, ESP)
      firewalld:
        service: ipsec
        permanent: yes
        state: enabled
        immediate: yes
      when: ansible_os_family == 'RedHat'

    # --- Étape B : Installation FreeIPA ---
    - name: Install IPA client and tools
      package:
        name:
          - ipa-client
          - firewalld
        state: present

    - name: Register node to FreeIPA
      command: >
        ipa-client-install --unattended
        --domain=
        --realm=
        --principal=admin
        --password=
        --mkhomedir
      args:
        creates: /etc/ipa/default.conf

    # --- Étape C : Certificats via Certmonger ---
    - name: Ensure keys directory exists
      file:
        path: ""
        state: directory
        owner: root # Sur l'hôte, root gère ça. Dans le conteneur, ce sera monté.
        mode: '0755'

    - name: Request Certificates using Certmonger
      # Cette commande génère les clés et configure le renouvellement auto
      # Le -C redémarre le conteneur si le certif change
      command: >
        ipa-getcert request
        -f /system.pem
        -k /system-privkey.pem
        -N CN=
        -D 
        -K host/@
        -C "docker restart openvswitch_vswitchd"
      args:
        creates: "/system.pem"

    - name: Copy IPA CA cert to OVS keys dir
      copy:
        src: /etc/ipa/ca.crt
        dest: "/ca-cert.pem"
        remote_src: yes

4. Le Hook de Configuration OVS (Post-Deploy)

Une fois que Kolla a déployé les conteneurs, nous devons dire à OVS d’utiliser ces clés. Ce hook intervient après le démarrage des services.

Fichier : etc/kayobe/ansible/hooks/configure-ovs-container.yml

---
- name: Configure OVS Container for IPsec
  hosts: overcloud
  become: true
  tasks:
    - name: Wait for Open vSwitch container
      command: docker inspect -f '' openvswitch_vswitchd
      register: ovs_status
      until: ovs_status.stdout == "true"
      retries: 20
      delay: 5
      ignore_errors: true

    - name: Set OVS SSL config inside container
      # On utilise docker exec car ovs-vsctl n'est pas sur l'hôte
      command: >
        docker exec openvswitch_vswitchd ovs-vsctl set Open_vSwitch .
        other_config:certificate=/etc/openvswitch/keys/system.pem
        other_config:private_key=/etc/openvswitch/keys/system-privkey.pem
        other_config:ca_cert=/etc/openvswitch/keys/ca-cert.pem
      when: ovs_status.stdout == "true"

(Note : Si vous utilisez podman, remplacez docker par podman)

5. Intégration dans Kayobe

Modifiez etc/kayobe/hooks.yml pour insérer ces étapes au bon moment du cycle de vie.

# 1. Préparer l'hôte et les certs AVANT que Kolla ne touche à tout
pre_overcloud_host_configure:
  - ansible/hooks/setup-host-pki.yml

# 2. Configurer OVS une fois que les conteneurs sont lancés
post_overcloud_service_deploy:
  - ansible/hooks/configure-ovs-container.yml

6. L’Interrupteur Général

Tout est prêt, les certificats sont là, OVS les connaît. Il ne reste plus qu’à activer le chiffrement globalement dans la base OVN Northbound.

Fichier : etc/kayobe/ansible/hooks/enable-ovn-global.yml (à lancer manuellement ou en post-deploy final)

- name: Enable IPsec Globally in OVN NB
  hosts: controllers[0]
  become: true
  tasks:
    - name: Enable IPsec
      command: docker exec ovn_nb_db ovn-nbctl set NB_Global . ipsec=true
      ignore_errors: yes # Ignore si déjà activé

Le Test de Vérité

Une fois le déploiement terminé :

  1. Connectez-vous sur un Compute Node.
  2. Interrogez le démon OVS (dans le conteneur) :
    docker exec openvswitch_vswitchd ovs-appctl -t ovs-monitor-ipsec tunnels/show
    
  3. Vérifiez le kernel de l’hôte :
    ip xfrm state
    

Si vous voyez des clés rfc4106(gcm(aes)), félicitations. Votre cloud OpenStack est chiffré, “Zero Trust”, et vos certificats se renouvelleront tout seuls sans casser la prod.