Ajouter SSL à une plateforme OpenStack existante: RabbitMq
Sommaire
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
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 ...