すべてのプロダクト
Search
ドキュメントセンター

:MongoDBデータベースへの不正アクセスを防ぐ

最終更新日:Aug 30, 2024

MongoDBデータベースへの不正アクセスは、データリーク、データ削除、さらには恐喝を引き起こす可能性があります。

背景情報

ビジネスとアプリケーションのセキュリティを確保するために、Cloud FirewallはMongoDBデータベースへの不正アクセスの脆弱性を修正するソリューションを提供します。

MongoDBサービスがインストールされると、管理者データベースが作成されます。 管理者データベースはデフォルトで空です。 データベースにユーザー認証に関する情報を表示することはできません。

デフォルトでは、MongoDBはユーザー認証を必要としません。 MongoDBサービスの起動時にパラメーターを設定しない場合、MongoDBデータベースへのアクセスにユーザー認証は必要ありません。 ユーザーは、パスワードフリーモードでデフォルトポートを介してMongoDBデータベースで操作を実行できます。 操作には、データを挿入、削除、変更、またはクエリするために実行できる高リスク操作が含まれます。 ユーザーはデータベースにリモートでアクセスすることもできます。

問題に対処するには、admin.system.usユーザーコレクションにユーザーを追加する必要があります。 これにより、MongoDBデータベースのユーザー認証が有効になります。

解決策

  1. Cloud Firewallでアクセス制御ポリシーを設定します。

    1. 内部ネットワークにデプロイされているサーバーからのみMongoDBサービスへのアクセスを許可するようにポリシーを構成します。

      Cloud Firewallコンソールにログインします。 左側のナビゲーションウィンドウで、[トラフィック分析] > [インターネット公開] を選択します。 [インターネット公開] ページで、[公開の詳細] > [アプリケーションを開く] タブに移動します。 次に、MongoDBサービスのパブリックIPアドレスを表示します。 MongoDBサービスが内部ネットワークサーバーのみを対象としている場合は、MongoDBサービスがインターネットに公開されないように設定することを推奨します。

      次のコマンドを実行して、MongoDBサービスをIPアドレスにバインドし、内部ネットワークサーバーからのみサービスにアクセスできるようにします。 この例では、プライベートIPアドレス192.168.XX.XXはMongoDBサービスにバインドされており、サービスはIPアドレスからの要求のみを監視します。

      mongod -- bind_ip 192.168.XX.XX
    2. 信頼できるソースからのみMongoDBサービスへのアクセスを許可するようにアクセス制御ポリシーを設定します。

    1. 信頼できるソースからのみMongoDBサービスへのアクセスを許可するように許可ポリシーを設定します。

      Cloud Firewallコンソールにログインします。 左側のナビゲーションウィンドウで、[アクセス制御] > [インターネットボーダー] を選択します。 [インターネットボーダー] ページで、[インバウンド] タブをクリックし、MongoDBデータベースに依存するサーバーからのみMongoDBサービスへのアクセスを許可するポリシーを設定します。

      1. [インバウンド] タブで、[アドレス帳] をクリックします。 [カスタムアドレス帳] > [IPv4アドレス帳] タブでアドレス帳を作成し、MongoDBサービスの信頼できるすべてのソースをアドレス帳に追加します。

      2. [インバウンド] タブで、[ポリシーの作成] をクリックします。 [受信ポリシーの作成] > [ポリシーの作成] タブで、アドレス帳を指定して許可ポリシーを作成します。

        • ソース: MongoDBサービスの信頼できるソースを含むアドレスボックスを指定します。

        • 宛先: MongoDBサービスのパブリックIPアドレスを指定します。

        • プロトコルタイプ: [TCP] を選択します。

        • ポート: 0/0を指定します。これは、信頼できるソースのすべてのポートを示します。

    2. すべてのソースからMongoDBサービスへのアクセスを拒否する拒否ポリシーを設定します。

      左側のナビゲーションウィンドウで、[アクセス制御] > [インターネットボーダー] を選択します。 表示されるページで、[インバウンド] タブをクリックし、すべてのソースからMongoDBサービスへのアクセスを拒否するポリシーを設定します。

      [インバウンド] タブで、[ポリシーの作成] をクリックします。 [受信ポリシーの作成] > [ポリシーの作成] タブで、すべてのソースからMongoDBサービスへのアクセスを拒否するポリシーを作成します。

      • ソース: すべてのソースを示す0.0.0.0/0を指定します。

      • 宛先: MongoDBサービスのパブリックIPアドレスを指定します。

      • プロトコルタイプ: [TCP] を選択します。

      • ポート: ソースのすべてのポートを示す0/0を指定します。

  2. ロールベースのユーザー認証を有効にします。

    1. 次のコマンドを実行して、ユーザー認証を有効にする前にデータベースにログインします。

      ./mongo 127.0.0.1:27028 (The default port is not used.)
    2. 次のコマンドを実行して、adminデータベースに切り替えます。

      管理者を使用する

      use admin
      db admin

      に切り替え

      説明

      管理者アカウントは、adminデータベースでのみ作成できます。

    3. 次のコマンドを実行して、adminデータベースに管理者アカウントを作成します。 この例では、ユーザー名はsu **** 、パスワードはsupWDx **** です。

      説明

      MongoDB V3以降では、addUserメソッドはサポートされなくなりました。 db.createUserコマンドを実行して、ユーザーを作成できます。

      db.addUser("su****", "supWDx****") or
      { "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }
      db.createUser({user:"****",pwd:"***********",roles:["root"]})
      {
      "user" : "****",
      "readOnly" : false,
      "pwd" : "**************","_id"
      ObjectId("4f2bc0d357a309043c6947a4")
      }
      # Store the administrator account in the system.users collection. 
      db.getCollectionNames()
      [ "system.indexes", "system.users", "system.version" ]

      作成された管理者アカウントは、system.us者のコレクションに保存されます。

      説明

      共通のユーザー名を指定しないでください。 生年月日、名前、IDカード番号などの共通のパスワードは指定しないでください。 パスワードの長さが8文字以上で、大文字、小文字、数字、および特殊文字を含むパスワードを指定します。

    4. 管理者アカウントが作成されていることを確認します。

      次のコマンドを実行します。 1が返されると、管理者アカウントが作成されます。

      db.auth("su****","supWDx****")
      1
                                      
    5. Mongodbプロセスを終了し、MongoDBサービスを再起動します。

      db.auth("su****","supWDx****")
      exit
      bye
    6. 次のコマンドを実行して、ユーザー認証を有効にします。

      ユーザー認証を有効にすると、MongoDBデータベースにログインしていないユーザーはデータベースに対して操作を実行できません。

      mongod --dbpath=/path/mongodb --bind_ip=10.0.0.1 --port=27028 --fork=true logpath=/path/mongod.log --auth&
    説明
    • e admin.system.usコレクションに格納されているユーザーにはスーパーユーザー権限がありますが、他のデータベースに作成されたユーザーには権限がありません。 adminデータベースに作成されたユーザーは、現在のMongoDBシステム内の他のデータベースのデータに対して操作を実行できます。

    • MongoDBシステムでは、スーパーユーザーによってデータベースが作成されます。 データベースは複数のユーザーを保存できますが、ユーザーは1つのデータベースにしか保存できません。 異なるデータベースのユーザーは同じ名前を共有できます。

    • たとえば、DB1に格納されているUser1はDB2にアクセスできませんが、DB1に格納されている他のユーザーによって作成されたデータにアクセスできます。

    • 異なるデータベースで同じ名前を共有するユーザーは、1つのデータベースにのみログインできます。 たとえば、User1がDB1とDB2の両方に存在し、DB1にログオンした場合、User1はDB2にログオンできません。

    • adminデータベースに作成されたユーザーにはスーパーユーザー権限があり、現在のMongoDBシステム内のすべてのデータベースのデータに対して操作を実行できます。

    • db.auth() メソッドを使用して、データベース内のユーザーを認証できます。 認証が成功した場合、値1が返されます。 そうでなければ、0の値が返される。 db.auth() メソッドは、現在のログオンユーザーが属するデータベース内のユーザーのみを認証できます。 このメソッドは、他のデータベースのユーザーを認証できません。

侵入をチェックする

MongoDBデータベースの管理者である場合は、次の対策を講じて侵入を確認できます。

  • MongoDBログが完了しているかどうかを確認します。 次に、データベースを削除したユーザーのIPアドレスと、データベースが削除された時刻を確認します。

  • db.system.us. find() コマンドを実行して、MongoDBアカウントごとにパスワードが設定されているかどうかを確認します。

  • db.fs.files.find() コマンドを実行し、他のユーザーがGridFSを使用してファイルを保存しているかどうかを確認します。

  • show log globalコマンドを実行して、ログファイルを表示します。 次に、他のユーザーがMongoDBデータベースにアクセスするかどうかを確認します。