sql >> Databáze >  >> NoSQL >> MongoDB

Připojení k MongoDB přes SSL s Node.js

Krok 1:Získejte MongoDB 3.0

První věc, kterou potřebujete vědět, je, že SSL je podporováno pouze předinstalovaným MongoDB 3.0 a novějším. Ubuntu nemá ve výchozích úložištích 3.0, takže to získáte takto:

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 je zatím nejnovější stabilní verze, ale klidně nahraďte 3.0.7 svým oblíbeným vydáním.

Krok 2:Získejte soukromý klíč, certifikát a soubory PEM

PEM obsahuje certifikát veřejného klíče a jeho přidružený soukromý klíč. Tyto soubory lze získat buď za IRL dolary od certifikační autority, nebo vygenerovat pomocí OpenSSL takto:

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 bude použit jako soubor PEM, mongodb-cert.key je soubor soukromého klíče a mongodb-cert.crt je soubor certifikátu, který lze také použít jako soubor CA. BUDETE POTŘEBOVAT VŠECHNY TŘI.

Krok 3:Konfigurace MongoD

Budeme předpokládat, že jste tyto soubory zkopírovali do složky /etc/ssl/, kam patří. Nyní otevřeme náš konfigurační soubor MongoDB:

sudo vi /etc/mongod.conf

a upravte sekci "# síťových rozhraní" takto:

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

POZNÁMKA :komentujeme bindIp . TOTO UMOŽŇUJE EXTERNÍM PŘIPOJENÍ přístup k vaší databázi Mongo. Předpokládáme, že toto je váš konečný cíl (Proč byste šifrovali provoz na localhost? ), ale měli byste to udělat až PO NASTAVENÍ PRAVIDEL AUTORIZACE pro váš server MongoDB.

Soubor CAF je také zakomentován, protože je volitelný. Na konci tohoto příspěvku vysvětlím, jak nastavit důvěryhodnost certifikační autority.

Jako vždy musíte restartovat MongoDB, než se změny v konfiguračním souboru projeví:

sudo service mongod restart

NESPĚLO SE VÁŠ SERVER SPUSTIT? Jste na to sami, ale pravděpodobně došlo k problému se soubory certifikátů. Chyby při spouštění můžete zkontrolovat spuštěním mongod ručně:

sudo mongod --config /etc/mongod.conf

Krok 4:Otestujte nastavení serveru

Než se pustíme do konfigurací uzlů, ujistíme se, že nastavení vašeho serveru funguje správně připojením k mongo klient příkazového řádku:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

Pokud název domény na vašem certifikátu není 127.0.0.1 nebo localhost , --sslAllowInvalidHostnames vlajka je nutná. Bez něj pravděpodobně dostanete tuto chybu:

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

Krok 5:Konfigurace Node.JS / Mongoose

Pokud používáte node-mongodb-native balíček ve vaší aplikaci Node, okamžitě zastavte a začněte používat Mongoose. Není to tak těžké. Tedy mongoose.connect() má prakticky stejné API jako mongodb.connect() , takže je vhodně nahraďte.

    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);

Krok 6:[Volitelně] ověřte své certifikáty prostřednictvím certifikační autority

Abyste mohli ověřit své certifikáty SSL, musíte získat CA (nebo balíček ) od vaší certifikační autority. Bude to vypadat hodně jako váš soubor certifikátu, ale často bude obsahovat více certifikátů (které tvoří řetězec důvěry k ověření platnosti certifikátu ). Pokud používáte certifikát s vlastním podpisem, můžete použít svůj mongodb-cert.crt jako soubor CA.

Budete také muset zajistit, aby se název hostitele vašeho serveru MongoDB shodoval s názvem použitým k vytvoření certifikátu.

Krok 6.3:Aktualizujte svůj mongod konfigurace

sudo vi /etc/mongod.conf

a upravte sekci "# síťových rozhraní" takto:

# 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

Krok 6.4:Otestujte nastavení serveru

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

Klienti Mongo mohou také předat soubor CA, aby ověřili, že mluví se správným serverem. To se provádí pomocí --sslCAFile parametr

Servery Mongo nakonfigurované pomocí souboru CAFile vyžadují, aby klienti vlastnili platný certifikát A soukromý klíč pro server. V mongo shell klientovi se to provede předáním --sslPEMKeyFile parametr.

Bez souboru PEM (který obsahuje certifikát serveru ), může se zobrazit tato chyba:

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

Server lze nakonfigurovat tak, aby přijímal požadavky od klientů bez souboru PEM povolením net.ssl.weakCertificateValidation , ale bez skutečného zisku oslabíte svou bezpečnost.

Krok 6.5:Konfigurace Node.JS / Mongoose

Je tu pár šmejdů, tak mějte strpení.

Nejprve POTŘEBUJETE mít node-mongodb-native 2.0 nebo později. Pokud používáte Mongoose, pak POTŘEBUJETE Mongoose 4.0 nebo později. Předchozí verze Mongoose používají node-mongodb-native 1.* který v žádném případě nepodporuje ověřování certifikátů.

Za druhé, neexistují žádné sslAllowInvalidHostnames nebo podobná možnost dostupná v node-mongodb-native. Toto není něco, co node-mongodb-native vývojáři mohou opravit (už bych měl ), protože nativní knihovna TLS dostupná v Node 0.10.* pro to nenabízí žádnou možnost. V Node 4.* a 5.* je checkServerIdentity možnost, která nabízí naději, ale přepnutí z původní větve Node do větve po sloučení io.js může v současné době způsobit trochu bolesti hlavy.

Takže zkusíme toto:

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')
      }
    }
  ;

Pokud se vám zobrazují chyby nesouladu názvu hostitele/IP, buď opravte svůj certifikát, nebo zrušte veškerou tuto tvrdou práci vypnutím 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')
      }
    }
  ;

Zdroj



  1. Jak vrátit pouze vnořené dokumenty pole ze všech dokumentů

  2. Docker-compose, přesto určit soubor redis.conf?

  3. Co je automatické převzetí služeb při selhání NameNode v Hadoop HDFS?

  4. Zkrátit sbírku