MongoDB
MongoDB - Configura un ReplicaSet per supportare TLS / SSL
Ricerca…
introduzione
Come configurare un ReplicaSet per supportare TLS / SSL?
Distribuiremo un ReplicaSet di 3 nodi nell'ambiente locale e useremo un certificato autofirmato. Non utilizzare un certificato autofirmato in PRODUCTION.
Come connettere il tuo client a questo ReplicaSet?
Connetteremo una Mongo Shell.
Una descrizione dei certificati TLS / SSL, PKI (Public Key Infrastructure) e Certificate Authority va oltre lo scopo di questa documentazione.
Come configurare un ReplicaSet per supportare TLS / SSL?
Crea il certificato di root
Il certificato di root (ovvero il file CA) verrà utilizzato per firmare e identificare il certificato. Per generarlo, esegui il comando seguente.
openssl req -nodes -out ca.pem -new -x509 -keyout ca.key
Mantenere il certificato di root e la sua chiave con attenzione, entrambi saranno utilizzati per firmare i certificati. Il certificato di root potrebbe essere usato anche dal tuo cliente.
Genera le richieste di certificato e le chiavi private
Quando si genera la richiesta di firma del certificato (ovvero CSR), immettere il nome host esatto (o IP) del nodo nel campo Nome comune (aka CN). Gli altri campi devono avere esattamente lo stesso valore. Potrebbe essere necessario modificare il file / etc / hosts .
I comandi seguenti genereranno i file CSR e le Private Keys RSA (4096 bit).
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
È necessario generare un CSR per ciascun nodo di ReplicaSet. Ricorda che il nome comune non è lo stesso da un nodo all'altro. Non basare più CSR sulla stessa chiave privata.
Ora devi avere 3 CSR e 3 Private Keys.
mongodb_node_1.key - mongodb_node_2.key - mongodb_node_3.key
mongodb_node_1.csr - mongodb_node_2.csr - mongodb_node_3.csr
Firma le richieste di certificato
Utilizzare il file CA (ca.pem) e la sua chiave privata (ca.key) generati in precedenza per firmare ogni richiesta di certificato eseguendo i comandi di seguito.
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
Devi firmare ogni CSR.
Ora devi avere 3 CSR, 3 Private Keys e 3 certificati autofirmati. MongoDB utilizzerà solo le chiavi private e i certificati.
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
Ogni certificato corrisponde a un nodo. Ricordare attentamente quale CN / nome host è stato assegnato a ciascun CSR.
Concat ogni certificato di nodo con la sua chiave
Eseguire i comandi seguenti per concatenare ciascun certificato di nodo con la sua chiave in un file (requisito 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
Ora è necessario disporre di 3 file PEM.
mongodb_node_1.pem - mongodb_node_2.pem - mongodb_node_3.pem
Distribuisci il tuo ReplicaSet
Assumeremo che i file PEM si trovino nella cartella corrente, nonché dati / dati1, dati / dati2 e dati / dati3.
Eseguire i comandi seguenti per distribuire i 3 Nodi ReplicaSet in ascolto sulla porta 27017, 27018 e 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
Ora si dispone di un ReplicaSet di 3 nodi distribuito nell'ambiente locale e tutte le loro transazioni sono crittografate. Non è possibile connettersi a questo ReplicaSet senza utilizzare TLS.
Distribuisci il tuo ReplicaSet per mutuo SSL / fiducia reciproca
Per forzare il client a fornire un certificato client (SSL reciproco), è necessario aggiungere il file CA durante l'esecuzione delle istanze.
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
Ora si dispone di un ReplicaSet di 3 nodi distribuito nell'ambiente locale e tutte le loro transazioni sono crittografate. Non è possibile connettersi a questo ReplicaSet senza utilizzare TLS o senza fornire un certificato client attendibile dalla CA.
Come connettere il Cliente (Mongo Shell) a un ReplicaSet?
Nessun mutuo SSL
In questo esempio, potremmo utilizzare il file CA (ca.pem) generato durante la sezione " Come configurare un server di replica per supportare TLS / SSL? ". Assumeremo che il file CA si trovi nella cartella corrente.
Assumeremo che i tuoi 3 nodi siano in esecuzione su mongo1: 27017, mongo2: 27018 e mongo3: 27019. (Potrebbe essere necessario modificare il file / etc / hosts .)
Da MongoDB 3.2.6, se il file CA è registrato nel Trust Store del sistema operativo, è possibile connettersi a ReplicaSet senza fornire il file CA.
mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
Altrimenti è necessario fornire il file CA.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019
Ora sei connesso al tuo ReplicaSet e tutte le transazioni tra la tua Mongo Shell e il tuo ReplicaSet sono criptate.
Con mutuo SSL
Se ReplicaSet richiede un certificato client, è necessario fornire un certificato firmato dalla CA utilizzata da ReplicaSet Deployment. I passaggi per generare il certificato client sono quasi gli stessi di quelli per generare il certificato del server.
In effetti, è sufficiente modificare il campo Nome comune durante la creazione CSR. Invece di fornire 1 Node nome host nel campo Nome comune, è necessario fornire tutti i nomi host ReplicaSet separati da una virgola .
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
Potresti dover affrontare la limitazione della dimensione Nome comune se il campo Nome comune è troppo lungo (più di 64 byte). Per ignorare questa limitazione, è necessario utilizzare SubjectAltName durante la generazione della 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
)
Quindi firmare il CSR utilizzando il certificato e la chiave CA.
openssl x509 -req -in mongodb_client.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt
Infine, si concatena la chiave e il certificato firmato.
cat mongodb_client.key mongodb_client.crt > mongodb_client.pem
Per connettersi a ReplicaSet, è ora possibile fornire il certificato client appena generato.
mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem
Ora sei connesso al tuo ReplicaSet e tutte le transazioni tra la tua Mongo Shell e il tuo ReplicaSet sono criptate.