MongoDBデータベースへの不正アクセスは、データリーク、データ削除、さらには恐喝を引き起こす可能性があります。
背景情報
ビジネスとアプリケーションのセキュリティを確保するために、Cloud FirewallはMongoDBデータベースへの不正アクセスの脆弱性を修正するソリューションを提供します。
MongoDBサービスがインストールされると、管理者データベースが作成されます。 管理者データベースはデフォルトで空です。 データベースにユーザー認証に関する情報を表示することはできません。
デフォルトでは、MongoDBはユーザー認証を必要としません。 MongoDBサービスの起動時にパラメーターを設定しない場合、MongoDBデータベースへのアクセスにユーザー認証は必要ありません。 ユーザーは、パスワードフリーモードでデフォルトポートを介してMongoDBデータベースで操作を実行できます。 操作には、データを挿入、削除、変更、またはクエリするために実行できる高リスク操作が含まれます。 ユーザーはデータベースにリモートでアクセスすることもできます。
問題に対処するには、admin.system.usユーザーコレクションにユーザーを追加する必要があります。 これにより、MongoDBデータベースのユーザー認証が有効になります。
解決策
Cloud Firewallでアクセス制御ポリシーを設定します。
内部ネットワークにデプロイされているサーバーからのみMongoDBサービスへのアクセスを許可するようにポリシーを構成します。
Cloud Firewallコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 [インターネット公開] ページで、 タブに移動します。 次に、MongoDBサービスのパブリックIPアドレスを表示します。 MongoDBサービスが内部ネットワークサーバーのみを対象としている場合は、MongoDBサービスがインターネットに公開されないように設定することを推奨します。
信頼できるソースからのみMongoDBサービスへのアクセスを許可するようにアクセス制御ポリシーを設定します。
信頼できるソースからのみMongoDBサービスへのアクセスを許可するように許可ポリシーを設定します。
Cloud Firewallコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 [インターネットボーダー] ページで、[インバウンド] タブをクリックし、MongoDBデータベースに依存するサーバーからのみMongoDBサービスへのアクセスを許可するポリシーを設定します。
[インバウンド] タブで、[アドレス帳] をクリックします。
タブでアドレス帳を作成し、MongoDBサービスの信頼できるすべてのソースをアドレス帳に追加します。[インバウンド] タブで、[ポリシーの作成] をクリックします。
タブで、アドレス帳を指定して許可ポリシーを作成します。ソース: MongoDBサービスの信頼できるソースを含むアドレスボックスを指定します。
宛先: MongoDBサービスのパブリックIPアドレスを指定します。
プロトコルタイプ: [TCP] を選択します。
ポート: 0/0を指定します。これは、信頼できるソースのすべてのポートを示します。
すべてのソースからMongoDBサービスへのアクセスを拒否する拒否ポリシーを設定します。
左側のナビゲーションウィンドウで、
を選択します。 表示されるページで、[インバウンド] タブをクリックし、すべてのソースからMongoDBサービスへのアクセスを拒否するポリシーを設定します。[インバウンド] タブで、[ポリシーの作成] をクリックします。
タブで、すべてのソースからMongoDBサービスへのアクセスを拒否するポリシーを作成します。ソース: すべてのソースを示す0.0.0.0/0を指定します。
宛先: MongoDBサービスのパブリックIPアドレスを指定します。
プロトコルタイプ: [TCP] を選択します。
ポート: ソースのすべてのポートを示す0/0を指定します。
ロールベースのユーザー認証を有効にします。
次のコマンドを実行して、ユーザー認証を有効にする前にデータベースにログインします。
./mongo 127.0.0.1:27028 (The default port is not used.)
次のコマンドを実行して、adminデータベースに切り替えます。
管理者を使用する
use admin db admin
に切り替え
説明管理者アカウントは、adminデータベースでのみ作成できます。
次のコマンドを実行して、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文字以上で、大文字、小文字、数字、および特殊文字を含むパスワードを指定します。
管理者アカウントが作成されていることを確認します。
次のコマンドを実行します。 1が返されると、管理者アカウントが作成されます。
db.auth("su****","supWDx****") 1
Mongodbプロセスを終了し、MongoDBサービスを再起動します。
db.auth("su****","supWDx****") exit bye
次のコマンドを実行して、ユーザー認証を有効にします。
ユーザー認証を有効にすると、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データベースにアクセスするかどうかを確認します。