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

Opretter forbindelse til MongoDB over SSL med Node.js

Trin 1:Få MongoDB 3.0

Den første ting du skal vide er, at SSL kun understøttes out-of-the-box af MongoDB 3.0 og nyere. Ubuntu har ikke 3.0 i standardlagrene, så her er hvordan du får det:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org=3.0.7 mongodb-org-server=3.0.7 mongodb-org-shell=3.0.7 mongodb-org-mongos=3.0.7 mongodb-org-tools=3.0.7

3.0.7 er den seneste stabile version lige nu, men erstat gerne 3.0.7 med din yndlingsudgivelse.

Trin 2:Få privat nøgle, certifikat og PEM-filer

PEM'en indeholder et offentligt nøglecertifikat og det tilhørende private nøgle. Disse filer kan enten fås med IRL-dollars fra en certifikatautoritet eller genereres med OpenSSL som sådan:

openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

mongodb.pem vil blive brugt som PEM-filen, mongodb-cert.key er Private Key-filen, og mongodb-cert.crt er Certificate-fil, som også kan bruges som CA-fil. DU SKAL BRUGE ALLE TRE AF DISSE.

Trin 3:Konfigurer MongoD

Vi vil antage, at du kopierede disse filer til din /etc/ssl/-mappe, hvor de hører hjemme. Nu åbner vi vores MongoDB-konfigurationsfil:

sudo vi /etc/mongod.conf

og modificer afsnittet "# netværksgrænseflader" sådan:

# network interfaces
net:
  port: 27017
  #bindIp: 127.0.0.1
  ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    #CAFile: /etc/ssl/mongodb-cert.crt

BEMÆRK VENLIGST :vi kommenterer bindIp . DETTE TILLADER EKSTERNE FORBINDELSER for at få adgang til din Mongo-database. Vi antager, at dette er dit slutmål (Hvorfor ville din kryptere trafik på localhost? ), men du bør kun gøre dette EFTER OPSÆTNING AF GODKENDELSESREGLER for din MongoDB-server.

CAFilen er også kommenteret ud, da den er valgfri. Jeg vil forklare, hvordan du opretter Certificate Authority-tillid i slutningen af ​​dette indlæg.

Som altid skal du genstarte MongoDB, før ændringer af konfigurationsfilen træder i kraft:

sudo service mongod restart

BLEV DIN SERVER IKKE AT STARTE? Du er alene, men der er sandsynligvis et problem med dine certifikatfiler. Du kan tjekke opstartsfejl ved at køre mongod manuelt:

sudo mongod --config /etc/mongod.conf

Trin 4:Test dine serverindstillinger

Inden vi går og roder med Node-konfigurationer, lad os sikre os, at din serveropsætning fungerer korrekt ved at oprette forbindelse til mongo kommandolinjeklient:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

Medmindre domænenavnet på dit certifikat er 127.0.0.1 eller localhost , --sslAllowInvalidHostnames flag er nødvendigt. Uden det vil du sandsynligvis få denne fejlmeddelelse:

E NETWORK  The server certificate does not match the host name 127.0.0.1
E QUERY    Error: socket exception [CONNECT_ERROR] for 
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

Trin 5:Konfigurer Node.JS / Mongoose

Hvis du bruger node-mongodb-native pakke i din Node-applikation, stop med det samme og begynd at bruge Mongoose. Det er ikke så svært. Når det er sagt, mongoose.connect() har stort set samme API som mongodb.connect() , så udskift passende.

    var fs = require('fs')
      , mongoose = require('mongoose')
      , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
      , mongoOpt = {
          "sslValidate": false,
          "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
          "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt')
        }
      ;

mongoose.connect(mongoUri, mongoOpt);

Trin 6:[Valgfrit] bekræfter dine certifikater via en certifikatmyndighed

For at validere dine SSL-certifikater skal du have et CA (eller bundle ) fil fra din certifikatmyndighed. Dette vil ligne din certifikatfil meget, men vil ofte indeholde flere certifikater (som danner en tillidskæde for at bekræfte, at et certifikat er gyldigt ). Hvis du bruger et selvsigneret certifikat, kan du bruge dit mongodb-cert.crt som en CA-fil.

Du skal også sikre dig, at din MongoDB-servers værtsnavn stemmer overens med det, der blev brugt til at oprette certifikatet.

Trin 6.3:Opdater din mongod konfiguration

sudo vi /etc/mongod.conf

og modificer afsnittet "# netværksgrænseflader" sådan:

# network interfaces net:   port: 27017   #bindIp: 127.0.0.1   ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/mongodb-ca.crt

sudo service mongod restart

Trin 6.4:Test dine serverindstillinger

mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

Mongo-klienter kan også sende CA-filen ind for at bekræfte, at de taler til den korrekte server. Dette gøres med --sslCAFile parameter

Mongo-servere konfigureret med en CAFile kræver, at klienter har et gyldigt certifikat OG den private nøgle til serveren. I mongo shell-klienten gøres dette ved at indsætte --sslPEMKeyFile parameter.

Uden en PEM-fil (som indeholder serverens certifikat ), kan du se denne fejl:

I NETWORK  DBClientCursor::init call() failed
E QUERY    Error: DBClientBase::findN: transport error: 127.0.0.1:27017 ns: admin.$cmd query: { whatsmyuri: 1 }
    at connect (src/mongo/shell/mongo.js:179:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed

Serveren kan konfigureres til at acceptere anmodninger fra klienter uden en PEM-fil ved at aktivere net.ssl.weakCertificateValidation , men du vil svække din sikkerhed uden nogen reel gevinst.

Trin 6.5:Konfigurer Node.JS / Mongoose

Der er et par gotchas her, så bær over med mig.

Først SKAL du have node-mongodb-native 2.0 eller senere. Hvis du bruger Mongoose, SKAL du BRUGE Mongoose 4.0 eller senere. Tidligere Mongoose-versioner bruger node-mongodb-native 1.* som ikke understøtter certifikatvalidering på nogen måde.

For det andet er der ingen sslAllowInvalidHostnames eller lignende mulighed tilgængelig i node-mongodb-native. Dette er ikke noget, der er node-mongodb-native udviklere kan rette (det ville jeg have nu ), fordi det oprindelige TLS-bibliotek, der er tilgængeligt i Node 0.10.*, ikke tilbyder nogen mulighed for dette. I Node 4.* og 5.* er der en checkServerIdentity mulighed, som giver håb, men at skifte fra den originale Node-gren til grenen efter io.js-fusionen kan forårsage en smule hovedpine på nuværende tidspunkt.

Så lad os prøve dette:

var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": { 
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

Hvis du får hostnavn/IP mismatch-fejl, skal du enten rette dit certifikat eller afvise alt dette hårde arbejde ved at deaktivere sslValidate :

var fs = require('fs')
  , mongoose = require('mongoose')
  , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
  , mongoOpt = {
      "server": {
        "sslValidate": false,
        "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
        "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
        "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
      }
    }
  ;

Kilde



  1. Redis scanning overspringsnøgler

  2. python-rq worker lukker automatisk

  3. MongoDB som køtjeneste?

  4. MongoDB $filter