Ajouter SSL à une plateforme OpenStack existante: RabbitMq

L'importance de chiffrer les communications entres les nœuds d'une plateforme afin de masquer les informations d'authentification n'est plus à démontrer. Ce post est le premier d'une série visant à remplacer les échanges en clair par des échanges chiffrés au sein d'une plateforme OpenStack existante.

Rappel de la plateforme visée

La plateforme de test est composée de 3 ctrls hébergeant l'ensemble des services requis pour une utilisation d'OpenStack. Voir Plateformes expérimentales pour plus de détails.

Création des certificats

La majorité des communications étant interne à la plateforme OpenStack, le choix d'un autorité locale de certification paraît naturelle. Par conséquent, nous générons:

  • une autorité racine: CA
  • une autorité intermédiaire pour les systèmes: iCA
  • un certificat partagé entre les ctrls

Il existe de nombreuse manière pour générer ces certificats. Dans la suite de cette section, nous allons utiliser l'outil easy-rsa (diverses documentations existent, par exemple la page d'OpenVPN que nous reprenons ici):

# apt-get install easy-rsa

Autorité racine

  • initialisation de l'environnement: L'environnement nécessaire à easy-rsa est généré dans un répertoire cloud-ca. Cet environnement contient un fichier de configuration vars qui peut être adapté (en particulier, les variables d'environnement KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL et KEY_OU).

    $ cd <basedir>
    $ make-cadir cloud-ca
    $ cd cloud-ca
    $ source ./vars
    $ ./clean-all
    
  • création de l'autorité de certification (cloud-ca/keys/ca.crt et cloud-ca/keys/ca.key):

    $ ./build-ca
    

Autorité de certification intermédiaire

  • À partir de cloud-ca, création des clé et certificat de l'autorité intermédiaire (cloud-ca/keys/inter.crt et cloud-ca/keys/inter.key):

    $ ./build-inter
    
  • Création de l'environnement de l'autorité intermédiaire:

    $ cd <basedir>
    $ make-cadir cloud-ica
    $ cd cloud-ica
    $ source ./vars
    $ ./clean-all
    
  • Création de l'autorité de certification intermédiaire (cloud-ica/keys/ca.crt, cloud-ica/keys/ca.key et cloud-ica/keys/export-ca.crt):

    $ ./inherit-inter <basedir>/cloud-ca/keys/ ica
    

Certificat des ctrls

  • À partir de l'autorité intermédiaire, création du certificat des ctrls (cloud-ica/keys/ctrl.crt et cloud-ica/keys/ctrl.key):

    $ cd <basedir>/cloud-ica
    $ source ./vars
    $ ./build-key-server ctrl
    

Installation des certificats

Seul les fichiers relatifs au certificat des ctrls sont déployés:

  • export-ca.crt: la chaine d'autorité de certification
  • ctrl.crt: le certificat publique des ctrls
  • ctrl.key: la clé privée des ctrls

Ces fichiers sont mis en place dans le répertoire /etc/pki (à créer si nécessaire) de chaque ctrl. Penser à vérifier les droits du fichier ctrl.key: 0440.

Configuration de RabbitMQ

L'activation du mode SSL se fait simplement par la définition ou l'ajout dans le fichier de configuration (/etc/rabbitmq/rabbitmq.config):

# cat <<EOF > /etc/rabbitmq/rabbitmq.config
[
    {ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
    {rabbit, [
        {tcp_listeners, []},
        {ssl_listeners, [5671]},
        {ssl_options, [{cacertfile,"/etc/pki/export-ca.pem"},
                       {certfile,  "/etc/pki/ctrl.cert"},
                       {keyfile,   "/etc/pki/ctrl.key"},
                       {versions, ['tlsv1.2', 'tlsv1.1']}
                      ]
        }]
    }
].
EOF

Dans cette configuration, seule les protocoles TLSv1.1 et TLSv1.2 sont autorisés. De plus, l'écoute pour des communications en claires est désactivée (aucun port affecté à tcp_listeners).

L'ensemble est redémarré, et le tour est joué!

# /etc/init.d/rabbitmq-server restart

Une première vérification (hormis les fichiers de log) consiste à vérifier que seul le port 5671 est utilisé (au lieu du port 5672).

# netstat -anvp

Mise à jour de la configuration des services d'OpenStack

Du coté des services d'OpenStack, la prise en compte du SSL se fait simplement par modification de la section [oslo_messaging_rabbit] présente dans les fichiers de configuration (service par service: /etc/keystone/keystone.conf, /etc/nova/nova.conf, etc.). Il s'agit d'ajouter une ligne:

[oslo_messaging_rabbit]
...
rabbit_use_ssl = True
...