MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

SSL MongoDB com certificados autoassinados em Node.js


O ScaleGrid é compatível com a configuração SSL para MongoDB e pode ser facilmente configurado conforme descrito em uma postagem anterior. Também discute a necessidade e os prós e contras do MongoDB com TLS/SSL.

Atualmente, o ScaleGrid usa certificados autoassinados para SSL ao criar nós para um novo cluster. Como os aplicativos Node.js sobre o driver MongoDB Node.js ou Mongoose são escolhas muito populares em nossa plataforma, criamos esta postagem para compartilhar um plano de solução passo a passo para os problemas mais comuns ao usar o SSL do MongoDB com autoassinado certificados em Node.js. Esta discussão pertence ao MongoDB Node.js versão 2.0 e Mongoose versão 4.0.3.

No ScaleGrid, também oferecemos a opção de comprar seus próprios certificados SSL e configurá-los no servidor MongoDB. Envie um e-mail para [email protected] para saber mais sobre esta oportunidade.


Adicionando arquivo de certificado de CA


Para melhorar a segurança de sua conexão SSL, você pode especificar a CA a ser usada para validar o certificado SSL do servidor MongoDB. O Node.js tem uma lista padrão de CAs “raiz” conhecidas que ele consulta se uma CA não for especificada durante o tempo de criação da conexão. No entanto, como estamos falando de certificados autoassinados, teremos que especificar um arquivo de certificado CA para verificação. Você pode copiar o arquivo de certificado CA que foi usado para auto-assinatura na máquina cliente (para ScaleGrid, isso está descrito em nossa postagem SSL mais antiga) e, em seguida, usar o sslCA opção para apontar para o caminho deste arquivo, permitindo assim a verificação do servidor também.

Mangusto

  • Para clusters autônomos:

    var fs = require('fs');
    var mongoose = require('mongoose');
    var certFileBuf = fs.readFileSync(<path to CA cert file>);
    var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true';
    var options = {
      server: { sslCA: certFileBuf }
    };
    mongoose.connect(mongoUrl, options);
    ...
    
  • Para clusters de conjunto de réplicas:

    var fs = require('fs');
    var mongoose = require('mongoose');
    var certFileBuf = fs.readFileSync(<path to CA cert file>);
    var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true';
    var options = {
      replset: { sslCA: certFileBuf }
    }
    mongoose.connect(mongoUrl, options);
    ...

MongoDB Native Driver (e wrappers em torno dele, como Mongoskin)

  • Para clusters autônomos:

    var certFileBuf = fs.readFileSync(<path to CA cert file>);
    var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true';
    var options = {
      server: { sslCA: certFileBuf}
    };
    var MongoClient = require('mongodb').MongoClient
      , assert = require('assert');
    
    MongoClient.connect(mongoUrl, options, function(err, db) {
       assert.equal(null, err);
       console.log("Connected correctly to server");
       db.close();
     });
    
    
  • Para clusters de conjunto de réplicas:


    O parâmetro de opção para conjuntos de réplicas é replSet :
    var options = {
      replSet: {
        sslCA: certFileBuf
      }
    };
    var MongoClient = require('mongodb').MongoClient
      , assert = require('assert');
    
    MongoClient.connect(mongoUrl, options, function(err, db) {
       assert.equal(null, err);
       console.log("Connected correctly to server");
       db.close();
     });
    
    

Desativando a verificação do certificado SSL


Você também pode desabilitar a verificação do certificado SSL completamente. Isso talvez seja mais fácil de fazer e certamente funcionará para você, no entanto, não é o caminho recomendado. O driver MongoDB fornece opções de SSL no nível do servidor e no nível do conjunto de réplicas (sslValidate , sslCA , sslCert , sslKey , sslPass ) para configurar conexões SSL. Todas as opções são descritas em detalhes na documentação.

No caso de certificados autoassinados, a opção mais útil é o sslValidate . Isso pode ser definido como false em caso de erros como: DEPTH_ZERO_SELF_SIGNED_CERT (certificado autoassinado). Isso desativa a verificação do certificado SSL, mas a conexão ainda permanece criptografada.

O Mongoose permite que você passe parâmetros para o driver em sua chamada de conexão. Por exemplo:
  • Clusters de conjunto de réplicas:


    sslValidate precisa ser definido como false na opção ReplicaSet para:
    var mongoose = require('mongoose');
    var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true';
    var options = {
      replset: {sslValidate: false}
    }
    mongoose.connect(mongoUrl, options);
    ...
    
  • Para driver nativo do MongoDB:

    var options = {
    replSet: {
        sslValidate: false
      }
    };
    var MongoClient = require('mongodb').MongoClient
      , assert = require('assert');
    
    MongoClient.connect(mongoUrl, options, function(err, db) {
       assert.equal(null, err);
       console.log("Connected correctly to server");
       db.close();
     });
    
    

Desativando a verificação de nome de host


Em vez de desabilitar completamente a validação SSL, se os nomes de host são um problema, pode-se simplesmente desabilitar a verificação do nome de host.

A verificação do nome do host, como parte da verificação do certificado CA, é atualmente configurável. É sempre recomendável que essa verificação esteja ativada. No entanto, isso pode levar a falhas de verificação, mesmo que haja a menor incompatibilidade no nome do host, como no certificado CA versus o cliente que tenta se conectar. Assim, a maioria dos servidores TLS/SSL fornece uma maneira de desativá-lo. Por exemplo. o driver Java MongoDB 3.0 permite uma maneira de desabilitar a verificação do nome do host através do sslInvalidHostNameAllowed propriedade. Para MongoDB Native Driver 2.0 e superior, um parâmetro de opção booleana checkServerIdentity (padrão true ) é fornecido para desabilitar a verificação do nome do host. Está disponível nos níveis de servidor individual e conjunto de réplicas.