MongoDB
MongoDB - Configurer un ReplicaSet pour prendre en charge TLS / SSL
Recherche…
Introduction
Comment configurer un ReplicaSet pour prendre en charge TLS / SSL?
Nous déploierons un ReplicaSet à 3 nœuds dans votre environnement local et nous utiliserons un certificat auto-signé. N'utilisez pas de certificat auto-signé dans PRODUCTION.
Comment connecter votre client à ce ReplicaSet?
Nous allons connecter un Mongo Shell.
Une description des certificats TLS / SSL, PKI (infrastructure à clé publique) et de l'autorité de certification dépasse le cadre de cette documentation.
Comment configurer un ReplicaSet pour prendre en charge TLS / SSL?
Créer le certificat racine
Le certificat racine (fichier CA) sera utilisé pour signer et identifier votre certificat. Pour le générer, exécutez la commande ci-dessous.
openssl req -nodes -out ca.pem -new -x509 -keyout ca.key
Conservez le certificat racine et sa clé avec soin, les deux seront utilisés pour signer vos certificats. Le certificat racine peut également être utilisé par votre client.
Générer les demandes de certificat et les clés privées
Lors de la génération de la demande de signature de certificat (aka CSR), saisissez le nom d'hôte (ou IP) exact de votre noeud dans le champ Nom commun (CN). Les autres champs doivent avoir exactement la même valeur. Vous devrez peut-être modifier votre fichier / etc / hosts .
Les commandes ci-dessous génèrent les fichiers CSR et les clés privées RSA (4096 bits).
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_1.key -out mongodb_node_1.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_2.key -out mongodb_node_2.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_3.key -out mongodb_node_3.csr
Vous devez générer un CSR pour chaque nœud de votre ReplicaSet. N'oubliez pas que le nom commun n'est pas le même d'un nœud à un autre. Ne basez pas plusieurs CSR sur la même clé privée.
Vous devez maintenant avoir 3 CSR et 3 clés privées.
mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
Signer vos demandes de certificat
Utilisez le fichier CA (ca.pem) et sa clé privée (ca.key) générés précédemment pour signer chaque demande de certificat en exécutant les commandes ci-dessous.
openssl x509 -req -in mongodb_node_1.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_1.crt
openssl x509 -req -in mongodb_node_2.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_2.crt
openssl x509 -req -in mongodb_node_3.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_3.crt
Vous devez signer chaque CSR.
Vous devez maintenant avoir 3 CSR, 3 clés privées et 3 certificats auto-signés. Seules les clés privées et les certificats seront utilisés par MongoDB.
mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
mongodb_node_1.crt - mongodb_node_2.crt - mongodb_node_3.crt
Chaque certificat correspond à un nœud. Rappelez-vous soigneusement quel CN / nom d'hôte vous avez donné à chaque CSR.
Concattez chaque certificat de noeud avec sa clé
Exécutez les commandes ci-dessous pour concaténer chaque certificat de nœud avec sa clé dans un fichier (exigence MongoDB).
cat mongodb_node_1.key mongodb_node_1.crt > mongodb_node_1.pem
cat mongodb_node_2.key mongodb_node_2.crt > mongodb_node_2.pem
cat mongodb_node_3.key mongodb_node_3.crt > mongodb_node_3.pem
Vous devez maintenant avoir 3 fichiers PEM.
mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem
Déployer votre ReplicaSet
Nous supposerons que vos fichiers pem se trouvent dans votre dossier actuel, ainsi que des données / données1, des données / données2 et des données / données3.
Exécutez les commandes ci-dessous pour déployer votre ReplicaSet à 3 nœuds en écoutant les ports 27017, 27018 et 27019.
mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem
Vous avez maintenant un ReplicaSet à 3 nœuds déployé sur votre environnement local et toutes leurs transactions sont chiffrées. Vous ne pouvez pas vous connecter à ce ReplicaSet sans utiliser TLS.
Déployer votre ReplicaSet for Mutual SSL / Mutual Trust
Pour forcer votre client à fournir un certificat client (SSL mutuel), vous devez ajouter le fichier CA lors de l'exécution de vos instances.
mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --sslCAFile ca.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem --sslCAFile ca.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem --sslCAFile ca.pem
Vous avez maintenant un ReplicaSet à 3 nœuds déployé sur votre environnement local et toutes leurs transactions sont chiffrées. Vous ne pouvez pas vous connecter à ce ReplicaSet sans utiliser TLS ou sans fournir un certificat client approuvé par votre autorité de certification.
Comment connecter votre client (Mongo Shell) à un ReplicaSet?
Aucun SSL mutuel
Dans cet exemple, nous pourrions utiliser le fichier CA (ca.pem) que vous avez généré lors de la section " Comment configurer un ReplicaSet pour prendre en charge TLS / SSL? ". Nous supposerons que le fichier CA est situé dans votre dossier actuel.
Nous supposerons que vos 3 nœuds s'exécutent sur mongo1: 27017, mongo2: 27018 et mongo3: 27019. (Vous devrez peut-être modifier votre fichier / etc / hosts .)
À partir de MongoDB 3.2.6, si votre fichier CA est enregistré dans le Trust Store de votre système d'exploitation, vous pouvez vous connecter à votre ReplicaSet sans fournir le fichier CA.
mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
Sinon, vous devez fournir le fichier CA.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
Vous êtes maintenant connecté à votre ReplicaSet et toutes les transactions entre votre Mongo Shell et votre ReplicaSet sont cryptées.
Avec SSL mutuel
Si votre ReplicaSet vous demande un certificat client, vous devez en fournir un signé par l'autorité de certification utilisée par le déploiement ReplicaSet. Les étapes pour générer le certificat client sont presque les mêmes que pour générer le certificat de serveur.
En effet, il vous suffit de modifier le champ Nom commun lors de la création de la CSR. Au lieu de fournir 1 nom d'hôte de noeud dans le champ de nom commun, vous devez fournir tous les noms d'hôte ReplicaSet séparés par une virgule .
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr
...
Common Name (e.g. server FQDN or YOUR name) []: mongo1,mongo2,mongo3
Vous pouvez être confronté à la limitation de la taille du nom commun si le champ Nom commun est trop long (plus de 64 octets de long). Pour contourner cette limitation, vous devez utiliser SubjectAltName lors de la génération de la CSR.
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr -config <(
cat <<-EOF
[req]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = .
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = mongo1
DNS.2 = mongo2
DNS.3 = mongo3
EOF
)
Ensuite, vous signez le CSR à l'aide du certificat et de la clé de l'autorité de certification.
openssl x509 -req -in mongodb_client.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt
Enfin, vous concatrez la clé et le certificat signé.
cat mongodb_client.key mongodb_client.crt > mongodb_client.pem
Pour vous connecter à votre ReplicaSet, vous pouvez maintenant fournir le nouveau certificat client généré.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem
Vous êtes maintenant connecté à votre ReplicaSet et toutes les transactions entre votre Mongo Shell et votre ReplicaSet sont cryptées.