MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Connessione SSL autofirmata tramite PyMongo

Esistono altri modi per generare pem server/client con un'autorità di certificazione, ovvero senza coinvolgere file.srl , ma questa risposta serve per dare seguito alla domanda.

Vale la pena ricordare che la maggior parte delle distribuzioni MongoDB v3.0+ ora include il supporto per SSL, assicurati di scegliere un pacchetto che supporti SSL. L'esempio seguente è testato con MongoDB v3.2 su Ubuntu Linux 14.04 con PyMongo v3.2.1. Dove una singola macchina ha generato i file CA, server e client pem a scopo dimostrativo.

Generiamo ca.pem e privkey.pem . La struttura dell'oggetto è /C=<Country Name>/ST=<State>/L=<Locality Name>/O=<Organisation Name>/emailAddress=<email>/CN=<Common Name> .

mkdir ~/ssl
cd ~/ssl
openssl req -out ca.pem -new -x509 -days 3650 -subj "/C=AU/ST=NSW/O=Organisation/CN=root/[email protected]"

Genera server .pem file:

hostname  # note down the value
echo "00" > file.srl # two random digits number
openssl genrsa -out server.key 2048
openssl req -key server.key -new -out server.req -subj  "/C=AU/ST=NSW/O=Organisation/CN=server1/CN=<hostname value>/[email protected]"
openssl x509 -req -in server.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out server.crt -days 3650
cat server.key server.crt > server.pem
openssl verify -CAfile ca.pem server.pem

Sebbene tu possa usare l'indirizzo IP come CN valore pure, non è raccomandato. Vedere RFC-6125.

Ora generiamo client.pem file:

openssl genrsa -out client.key 2048
openssl req -key client.key -new -out client.req -subj "/C=AU/ST=NSW/O=Organisation/CN=client1/[email protected]"
openssl x509 -req -in client.req -CA ca.pem -CAkey privkey.pem -CAserial file.srl -out client.crt -days 3650
cat client.key client.crt > client.pem
openssl verify -CAfile ca.pem client.pem

Dopo aver generato il .pem file, ora puoi eseguire mongod. ad esempio:

mongod --sslMode requireSSL --sslPEMKeyFile ~/server.pem --sslCAFile ~/ca.pem

Puoi testare la connessione usando la mongo shell, ad esempio:

mongo --ssl --sslPEMKeyFile ~/client.pem --sslCAFile ~/ca.pem --host <server hostname>

Una volta che riesci a connetterti correttamente, puoi provare con PyMongo. Ad esempio:

import ssl 
from pymongo import MongoClient
client = MongoClient(
    '<server hostname>',
    27017,
    ssl=True,
    ssl_certfile='~/client.pem',
    ssl_cert_reqs=ssl.CERT_REQUIRED,
    ssl_ca_certs='~/ca.pem'
 )

In alternativa, puoi anche usare mongod flag --sslAllowInvalidHostnames per specificare localhost , ecc.

Per l'uso in produzione, la distribuzione di MongoDB deve utilizzare certificati validi generati e firmati da un'unica autorità di certificazione. Se utilizzi un certificato autofirmato, anche se il canale di comunicazione sarà crittografato, non ci sarà alcuna convalida dell'identità del server. L'utilizzo di un certificato firmato da un'autorità di certificazione affidabile consentirà ai driver MongoDB di verificare l'identità del server. In generale, evita di utilizzare certificati autofirmati a meno che la rete non sia attendibile.

Altri link correlati che potresti trovare utili:

  • MongoDB:configura SSL.
  • MongoDB:tutorial sulla sicurezza.
  • Elenco di controllo per la sicurezza di MongoDB.