Buscar..


Introducción

¿Cómo configurar un ReplicaSet para soportar TLS / SSL?

Implementaremos un ReplicaSet de 3 nodos en su entorno local y utilizaremos un certificado autofirmado. No utilice un certificado autofirmado en PRODUCCIÓN.

¿Cómo conectar su cliente a este ReplicaSet?

Conectaremos una Mongo Shell.

Una descripción de los certificados TLS / SSL, PKI (Infraestructura de clave pública) y Autoridad de certificación está más allá del alcance de esta documentación.

¿Cómo configurar un ReplicaSet para soportar TLS / SSL?

Crear el certificado raíz

El certificado raíz (también conocido como archivo CA) se usará para firmar e identificar su certificado. Para generarlo, ejecute el siguiente comando.

openssl req -nodes -out ca.pem -new -x509 -keyout ca.key

Mantenga el certificado raíz y su clave con cuidado, ambos se utilizarán para firmar sus certificados. El certificado raíz también puede ser utilizado por su cliente.


Generar las solicitudes de certificado y las claves privadas

Al generar la Solicitud de firma de certificado (también conocida como CSR), ingrese el nombre de host (o IP) exacto de su nodo en el campo Nombre común (también conocido como CN). Los otros campos deben tener exactamente el mismo valor. Es posible que necesite modificar su archivo / etc / hosts .

Los siguientes comandos generarán los archivos CSR y las claves privadas 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

Debe generar un CSR para cada nodo de su ReplicaSet. Recuerde que el nombre común no es el mismo de un nodo a otro. No base múltiples CSR en la misma clave privada.

Ahora debe tener 3 CSR y 3 claves privadas.

mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr

Firme sus solicitudes de certificado

Utilice el archivo CA (ca.pem) y su clave privada (ca.key) generada anteriormente para firmar cada solicitud de certificado ejecutando los siguientes comandos.

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

Debes firmar cada CSR.

Ahora debe tener 3 CSR, 3 claves privadas y 3 certificados autofirmados. MongoDB solo utilizará las Claves privadas y los Certificados.

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

Cada certificado corresponde a un nodo. Recuerde cuidadosamente qué CN / nombre de host le dio a cada CSR.


Concat cada certificado de nodo con su clave.

Ejecute los comandos a continuación para calcular cada Certificado de nodo con su clave en un archivo (requisito de 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

Ahora debe tener 3 archivos PEM.

mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem

Implementar su ReplicaSet

Asumiremos que sus archivos pem se encuentran en su carpeta actual, así como también data / data1, data / data2 y data / data3.

Ejecute los comandos a continuación para implementar su escucha de 3 Nodos ReplicaSet en los puertos 27017, 27018 y 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

Ahora tiene un ReplicaSet de 3 nodos implementado en su entorno local y todas sus transacciones están encriptadas. No puede conectarse a este ReplicaSet sin usar TLS.

Implemente su ReplicaSet para SSL mutuo / confianza mutua

Para forzar a su cliente a proporcionar un certificado de cliente (SSL mutuo), debe agregar el archivo de CA al ejecutar sus instancias.

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

Ahora tiene un ReplicaSet de 3 nodos implementado en su entorno local y todas sus transacciones están encriptadas. No puede conectarse a este ReplicaSet sin usar TLS o sin proporcionar un Certificado de Cliente en el que confíe su CA.

¿Cómo conectar su cliente (Mongo Shell) a un ReplicaSet?

Sin SSL mutuo

En este ejemplo, podríamos usar el archivo CA (ca.pem) que generó durante la sección " ¿Cómo configurar un ReplicaSet para que admita TLS / SSL? ". Asumiremos que el archivo CA se encuentra en su carpeta actual.

Asumiremos que sus 3 nodos se ejecutan en mongo1: 27017, mongo2: 27018 y mongo3: 27019. (Es posible que necesite modificar su archivo / etc / hosts ).

Desde MongoDB 3.2.6, si su archivo de CA está registrado en su almacén de confianza del sistema operativo, puede conectarse a su ReplicaSet sin proporcionar el archivo de CA.

mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

De lo contrario, debe proporcionar el archivo CA.

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

Ahora está conectado a su ReplicaSet y todas las transacciones entre su Shell Mongo y su ReplicaSet están cifradas.

Con SSL mutuo

Si su ReplicaSet solicita un certificado de cliente, debe proporcionar uno firmado por la CA que usa ReploySet Deployment. Los pasos para generar el Certificado de Cliente son casi los mismos que para generar el Certificado de Servidor.

De hecho, solo necesita modificar el campo de nombre común durante la creación de CSR. En lugar de proporcionar 1 nombre de host de nodo en el campo de nombre común, debe proporcionar todos los nombres de host de ReplicaSet separados por una coma .

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

Es posible que enfrente la limitación de tamaño del nombre común si el campo Nombre común es demasiado largo (más de 64 bytes de longitud). Para omitir esta limitación, debe usar el SubjectAltName al generar el 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
)

Luego firma el CSR utilizando el certificado y la clave de CA.

openssl x509 -req -in mongodb_client.csr  -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt

Finalmente, concat la clave y el certificado firmado.

cat mongodb_client.key mongodb_client.crt > mongodb_client.pem

Para conectarse a su ReplicaSet, ahora puede proporcionar el Certificado de Cliente recién generado.

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem

Ahora está conectado a su ReplicaSet y todas las transacciones entre su Shell Mongo y su ReplicaSet están cifradas.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow