Keystone avec SSL

Par default toutes les communications entre utilisateurs et le service d’identité et entre ce dernier et les différentes API se font en clair, sans aucun chiffrement : un utilitaire de capture de paquets permettra de récupérer les login et les mots de passes et même les tokens.
Keystone propose d’utiliser le protocole http over SSL (https), pour toute demande d’authentification et/ou de vérification.

1. Activer SSL

Comme son nom l’indique, Keystone utilisera le mode SSL ou TLS pour communiquer avec toutes les entités d’Openstack, ce qui nécessitera l’utilisation de certificat X509.
Les certificats x509 utilisés par Keystone doivent être obtenus auprès d’une CA externe et configurés pour une utilisation avec Keystone tel que décrit dans cette section. Keystone ne génèrera aucun certificat pour SSL.
Cependant des exemples de certificats son fournit avec keystone, se trouvent dans /etc/keystone/ ssl.

Pour activer le mode SSL dans keystone, il faut éditer le fichier de configuration keystone.conf est dans la section [ssl], définir les paramètres suivants :

[ssl]
enable = True
certfile = <path to keystone.pem>
keyfile = <path to keystonekey.pem>
ca_certs = <path to ca.pem>
cert_required = True

enabled : activer ou désactiver le mode SSL
certfile : le chemin vers le certificat SSL
keyfile : le chemis vers la clé privé.
cacert : le certificat de l’autorité de certification qui a générée le Certificat SSL.
cert_required : Boolean qui définit si les clients doivent aussi fournir un certificat (par défaut à False).

Tous les certificats et clés doivent être au format PEM (Privacy Enhanced Mail).

2. Génération de l’autorité de certification

Pour générer nos différents certificats nous allons utiliser un fichier de réponse comme :

dir            = /home/root/keystonessl/certs
[ ca ]
default_ca        = CA_KEYSTONE

[ CA_KEYSTONE ]
new_certs_dir     = $dir
serial            = $dir/serial
database          = $dir/index.txt
certificate       = /home/root/keystonessl/cacert.pem
private_key       = /home/root/keystonessl/cakey.pem
default_days      = 730
default_md        = md5
preserve          = no
email_in_dn       = no
nameopt           = default_ca
certopt           = default_ca
copy_extensions   = copy
authorityKeyIdentifier = keyid,issuer
policy            = policy_match
x509_extensions   = local_ca_extensions

[ policy_match ]
countryName             = supplied
stateOrProvinceName     = supplied
organizationName        = supplied
organizationalUnitName  = supplied
commonName              = supplied
emailAddress            = optional

[ local_ca_extensions ]
subjectAltName          = IP:10.1.1.10
basicConstraints        = CA:True
nsCertType              = server

[ req ]
default_bits            = 2048 # Size of keys
default_keyfile         = key.pem # name of generated keys
default_md              = md5 # message digest algorithm
string_mask             = nombstr # permitted characters
distinguished_name      = req_distinguished_name
x509_extensions         = v3_ca
req_extensions          = v3_req

[ req_distinguished_name ]
0.organizationName    = Organization Name (company)
organizationalUnitName    = Organizational Unit Name (department, division)
emailAddress        = Email Address
emailAddress_max    = 40
localityName        = Locality Name (city, district)
stateOrProvinceName    = State or Province Name (full name)
countryName        = Country Name (2 letter code)
countryName_min        = 2
countryName_max        = 2
commonName        = Common Name (hostname, IP)
commonName_max        = 64
# Default values for the above, for consistency and less typing.
0.organizationName_default = ORGANIZATION
localityName_default = IDF
stateOrProvinceName_default = PARIS
countryName_default = FR
commonName_default = Your IP

[ v3_ca ]
basicConstraints = CA:TRUE, pathlen:0
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

Ce fichier sera exporté dans la variable d’enivrement « OPENSSL_CONF » pour qu’il soit utilisé par OpenSSL pendant la génération des certificats.

export OPENSSL_CONF=/home/administrateur/keystonessl/openssl.cnf

Notons que certaines informations doivent être modifiées manuellement dans ce fichier selon le type de certificat que nous sommes en train de générer.

Pour générer un certificat auto-signé, il faut mentionner dans la section: 

[ local_ca_extensions ]
basicConstraints=CA:TRUE
subjectAltName=l’adresse IP ou le nom DNS de la CA

D’autres informations tel que (OU,CN,C,O) seront demandées à l’utilisateur pendant la génération du certificat.

Pour générer un certificat auto-signé la commande suivante est exécutée :

openssl req -x509 -newkey rsa:2048 -out cacert.pem -keyout cakey.pem -days 1825

Celle-ci permet de générer en même temps la clé privée « cakey.pem », et un certificat auto-signé « cacert.pem ». Entre temps un CSR temporaire a été généré puis signé par la clé privée.
Nous disposons maintenant d’une autorité de certification prête à recevoir les demandes certifications.

3. Générer un certificat SSL

Pour générer un certificat SSL, il faut s’assurer que dans la section :

[ v3_req ]
basicConstraints=CA:FALSE

La commande suivante permet de générer un CSR, qui transportera la clé publique et certaines informations sur le demandeur de certificat :

openssl req -newkey rsa:2048 -keyout server-key.pem -out server-req.pem

Pendant l’exécution de la commande OpenSSL, les valeurs des attributs : OU,O,Mail,C et CN doivent être saisiés.

L’attribut SubjectAltName ou Subject est utilisé par les différents clients (quantum CLI, keystone CLI, nova CLI …) d’Openstack pour faire une première vérification du certificat, si sa valeur est différente de l’adresse IP du serveur Keystone (en SSL), la phase HandShake de SSL échouera et aucune connexion ne sera établie.
Cependant certains clients proposent d’utiliser le mode « insecure », ce qui permet d’établir une connexion SSL sans aucune vérification préalable de certificat par le client.

La dernière étape est la signature de l’autorité de certification du CSR généré.

openssl ca -in server-req.pem -days 365 -out servercert.pem -cert cacert.pem -keyfile cakey.pem

Voilà nous disposons dès à présent des différents fichiers (cacert.pem, server-key.pem, servercert.pem)  nécessaire à la mise en place d’une connexion SSL.

Laisser un commentaire

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


9 + = 17

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>