sql >> データベース >  >> NoSQL >> MongoDB

Node.jsを使用してSSL経由でMongoDBに接続する

    ステップ1:MongoDB3.0を入手する

    最初に知っておく必要があるのは、SSLはMongoDB3.0以降ですぐにサポートされるだけであるということです。 Ubuntuのデフォルトのリポジトリには3.0がないため、入手方法は次のとおりです。

    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は現在のところ最新の安定バージョンですが、3.0.7をお気に入りのリリースに置き換えてください。

    ステップ2:秘密鍵、証明書、およびPEMファイルを取得する

    PEMには、公開鍵証明書とそれに関連する秘密鍵が含まれています。これらのファイルは、Certificate AuthroityからIRLドルで取得するか、次のようにOpenSSLで生成できます。

    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はPEMファイルとして使用され、mongodb-cert.keyは秘密鍵ファイルであり、mongodb-cert.crtはCAファイルとしても使用できる証明書ファイルです。これらの3つすべてが必要になります。

    ステップ3:MongoDを構成する

    これらのファイルを、それらが属する/ etc /ssl/フォルダーにコピーしたと想定します。次に、MongoDB構成ファイルを開きます。

    sudo vi /etc/mongod.conf
    

    「#ネットワークインターフェース」セクションを次のように変更します:

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

    ご注意くださいbindIpをコメントアウトしています 。これにより、外部接続でMongoデータベースにアクセスできます。これが最終目標であると想定しています(ローカルホストでトラフィックを暗号化するのはなぜですか? )。ただし、これは、MongoDBサーバーの承認ルールを設定した後でのみ行う必要があります。

    CAFileもオプションであるため、コメント化されています。この投稿の最後で、認証局の信頼を設定する方法について説明します。

    いつものように、構成ファイルの変更を有効にする前に、MongoDBを再起動する必要があります:

    sudo service mongod restart
    

    サーバーの起動に失敗しましたか?あなたはあなた自身ですが、おそらくあなたの証明書ファイルに問題があります。 mongodを実行すると、起動エラーを確認できます 手動:

    sudo mongod --config /etc/mongod.conf
    

    ステップ4:サーバー設定をテストする

    ノード構成をいじる前に、mongoに接続して、サーバーのセットアップが正しく機能していることを確認しましょう。 コマンドラインクライアント:

    mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
    

    証明書のドメイン名が127.0.0.1でない限り またはlocalhost--sslAllowInvalidHostnames フラグが必要です。これがないと、おそらく次のエラーが発生します:

    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
    

    ステップ5:Node.JS/Mongooseを構成する

    node-mongodb-nativeを使用している場合 Nodeアプリケーションにパッケージ化したら、すぐに停止してMongooseの使用を開始します。それほど難しいことではありません。そうは言っても、mongoose.connect() mongodb.connect()と実質的に同じAPIを使用します 、適切に置き換えてください。

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

    ステップ6:[オプションで]認証局を介して証明書を確認します

    SSL証明書を検証するには、CA(またはバンドル)を取得する必要があります )認証局からのファイル。これは証明書ファイルによく似ていますが、多くの場合、複数の証明書が含まれています(証明書が有効であることを確認するための信頼の鎖を形成します )。自己署名証明書を使用している場合は、mongodb-cert.crtを使用できます。 CAファイルとして。

    また、MongoDBサーバーのホスト名が証明書の作成に使用されたものと一致していることを確認する必要があります。

    ステップ6.3:mongodを更新します 構成

    sudo vi /etc/mongod.conf
    

    「#ネットワークインターフェース」セクションを次のように変更します:

    # 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
    

    ステップ6.4:サーバー設定をテストする

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

    Mongoクライアントは、CAファイルを渡して、正しいサーバーと通信していることを確認することもできます。これは、--sslCAFileを使用して行われます。 パラメータ

    CAFileで構成されたMongoサーバーでは、クライアントが有効な証明書を所有している必要があります AND サーバーの秘密鍵。 mongoシェルクライアントでは、これは--sslPEMKeyFileを渡すことによって行われます。 パラメータ。

    PEMファイルなし(サーバーの証明書を含む )、次のエラーが表示される場合があります:

    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
    

    net.ssl.weakCertificateValidationを有効にすることで、PEMファイルなしでクライアントからの要求を受け入れるようにサーバーを構成できます。 、しかし、あなたは本当の利益のためにあなたのセキュリティを弱めるでしょう。

    ステップ6.5:Node.JS/Mongooseを構成する

    ここにはいくつかの落とし穴があるので、我慢してください。

    まず、node-mongodb-nativeが必要です 2.0 またはそれ以降。マングースを使用している場合は、マングース4.0が必要です。 またはそれ以降。以前のMongooseバージョンはnode-mongodb-nativeを使用します 1.* これは、いかなる立場においても証明書の検証をサポートしていません。

    次に、sslAllowInvalidHostnamesはありません。 またはnode-mongodb-nativeで利用可能な同様のオプション。これはnode-mongodb-nativeではありません 開発者は修正できます(私は今までに持っていたでしょう )ノード0.10。*で使用可能なネイティブTLSライブラリには、このためのオプションがないためです。ノード4.*および5.*には、checkServerIdentityがあります。 希望を与えるオプションですが、io.jsのマージ後に元のノードブランチからブランチに切り替えると、現時点で少し頭痛の種になる可能性があります。

    では、これを試してみましょう:

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

    ホスト名/IPの不一致エラーが発生した場合は、証明書を修正するか、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')
          }
        }
      ;
    

    ソース



    1. numpy配列をmongodbに保存する

    2. MongoError:ECONNREFUSED127.0.0.1:27017に接続します

    3. Mongooseを使用してObjectIdで検索しているドキュメントが見つかりません

    4. Express / Connectとセッションストアを使用している場合、どうすればセッションIDを見つけることができますか?