MongoDBセキュリティの管理方法

ハッカーはますます洗練されており、脆弱性を悪用する方法を知っています。MongoDBデータベースに機密データがある場合、セキュリティに真剣に取り組むことが重要です。しかし、心配しないでください!このチュートリアルがあなたのお手伝いをします!

このチュートリアルでは、セキュリティ対策を設定することで、MongoDBデータベースを保護し、ハッカーを撃退する方法を学びます。

続けて読んで、MongoDBのセキュリティを自分で管理しましょう!

前提条件

  • このチュートリアルは実践的なデモンストレーションです。一緒に進めるためには、以下のものが必要です:
  • A non-root user with sudo privileges.

専用の管理ユーザーの作成

MongoDBには組み込みの認証システムはありません。デフォルトでは、データベースへのアクセス権を持つ誰でも完全な管理権限を持ってしまいます。これは非常に危険です!データベースを安全にするために、管理権限を持つユーザーを作成し、データベースをそのユーザーに制限します。

このセットアップにより、各ユーザーがデータベース内で行える操作を制限しながら、管理特権を持つ単一のユーザーアクセスポイントを提供することができます。例えば、開発者はデータベースへの読み取り専用アクセスを持ち、管理者はデータの作成や編集ができます。

1. ターミナルを開き、以下のコマンドmongoを引数なしで実行します。このコマンドにより、デフォルトの管理者ユーザーとしてMongoDBシェルに接続することができます。

この管理者ユーザーは、サーバー上のすべてのデータベースに対して完全な読み書きアクセス権限を持っているため、日常の作業にはこのユーザーを使用しないようにするのがベストです。

mongo

以下に示すように、Access control is not enabled(アクセス制御が有効化されていません)という警告が表示されます。

この警告は、MongoDBサーバーにアクセスできる人は誰でも、データベース内で自由に操作を行うことができることを示しています。これらの操作には、データベースの削除、ドロップ、更新などが含まれます。

この警告が表示されるのは、まだアクセス制御が有効化されていないためです。今のところ心配しないでください。次のセクションでアクセス制御の有効化方法を学びます。

Connecting to your MongoDB shell

2. 次に、show dbsコマンドを実行して、adminデータベースを含むサーバー上のすべてのデータベースを表示します。通常のユーザーが見ることができないデータベースも表示されます。

show dbs
Showing all databases on the server

3. 以下のuse adminコマンドを実行して、adminデータベースに切り替えます。これにより、専用の管理ユーザーを作成することに焦点を当てます。このコマンドは、現在のデータベースコンテキストをadminデータベースを使用するように変更します。

MongoDBは、adminデータベースを使用してアクセス制御ルールを保存し、ユーザーとその役割のための組み込み認証、ユーザー名、パスワードを提供します。データベースの機能にとって重要なため、adminデータベースを削除または名前を変更することはできません。

use admin
Switching to the admin database

4. 以下のコードをコピーして貼り付けて、Enterキーを押してmongoシェルで実行します。このコードは、ユーザー名がAdminATA、パスワードがLDWbPf6Fy9Ezs3Mvのユーザーを作成しますが、好みの資格情報を使用することもできます。

この新しいユーザーは、すべてのデータベースに対する読み取り/書き込み(readWriteAnyDatabase)アクセス権と、すべてのコレクションに対する管理アクセス権を持っています。しかし、このユーザーはデータベースの削除権限がなく、他のユーザーの権限を削除または変更することはできません。

コマンドを実行してエラーが発生した場合は、コードを再確認して再試行してください。

# db.createUser()メソッドは、現在のデータベースに指定されたロールで新しいユーザーを作成します。
db.createUser(
{
# ユーザー名をAdminATAと指定しますが、任意のユーザー名を入力できます。
user: "AdminATA",
# passwordPrompt()メソッドは、MongoDBシェルにパスワードを入力するように指示するユーティリティ関数です。
# AdminATAユーザーのパスワードを入力するようにMongoDBシェルに指示します。
pwd: passwordPrompt(),
# AdminATAユーザーに割り当てるロールを指定します。
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)

5. プロンプトが表示されたら、安全なパスワードを入力し、Enter キーを押します。

Providing a secure password

下記のようなSuccessfully added userメッセージが表示されます。この出力により、管理者権限を持つユーザーが作成され、必要な最小限の権限に制限されたことが確認できます。

この時点で、データベース上で必要な操作を行うために、他のユーザーにアクセス権を与えずに、AdminATAという管理者ユーザーが既に作成されています。

Verifying Successful Admin User Creation in MongoDB

6. 最後に、exit コマンドを実行して、mongoシェルを終了します。

exit
Leaving the mongo shell

認証を有効にすることにより、セキュリティを強化します。

管理者ユーザーを作成したので、認証を有効にすることでさらなるセキュリティを追加します。これにより、正しい資格情報を持つユーザーのみがデータベースにアクセスできるようになります。

認証は、通常、ユーザー名とパスワードを提供するか、認証トークンを使用することによって、接続の妥当性を検証するプロセスを指します。認証は、あなたが自分自身であることを確認し、リソースにアクセスしようとするなりすまし者でないことを保証します。

1. 次の設定で認証を有効にするには、MongoDBの設定ファイルを編集し、変更を保存します:

  • お気に入りのテキストエディタで /etc/mongod.conf ファイルを開きます。 /etc/mongod.conf ファイルには、MongoDBクラスターの設定が含まれています。
  • #security ディレクティブの前にある # 記号を削除して、コメントアウトを解除します。このディレクティブは、MongoDBに設定ファイルでセキュリティの設定を見つけるよう指示します。
  • security ディレクティブの下に authorization: enabled という新しい行を追加します。なお、 authorization: enabled 行はインデントされていることに注意してください(先頭に2つのスペースがあります)。
Adding the authorization parameter

2. 次に、以下の systemctl コマンドを実行して、変更が反映されるようにMongoDBサーバーを再起動します。

sudo systemctl restart mongod

3. 最後に、以下のコマンドを実行してMongoDBサービスのステータスを表示します。

sudo systemctl status mongod

以下は、アクティブ:アクティブ(実行中)という緑色のテキストが表示されています。これは、MongoDBサーバーが実行され、接続を受け付ける準備ができていることを示しています。

Viewing MongoDB Service Status

認証が機能するかどうかをテストする

認証を有効にしたばかりですが、それが機能するかどうかをどうやって確認しますか?データベースを表示して認証が機能することを確認するために、管理ユーザーにログインします。

1. 次のコマンドを実行して、mongoシェルにアクセスします(「専用の管理ユーザーの作成」セクションのステップ1と同様に)。

mongo

以下のように、認証を有効にする警告メッセージが表示されなくなります。その代わりに、MongoDBサーバーとMongoDBシェルのバージョンが表示されます。

Connecting to the MongoDB Shell

2. 次に、show dbsコマンドを再実行して、データベースにアクセスできるかどうかを確認します。

show dbs

このコマンドでは、管理ユーザーのみがデータベースの一覧を表示できます。しかし、以下のように何も表示されません。なぜでしょうか?データベースの一覧を表示する権限は、管理ユーザーにのみ予約されています。

mongoシェルにAdminロールを認証していないため、データベースの一覧を表示する権限がありません。

Listing All Databases (empty)

認証を有効にすると、正しい資格情報を含まない接続文字列を使用してデータベースにアクセスしようとすると、接続が失敗します。

MongoDBセキュリティの重要な部分として、接続文字列の認証があります。アプリケーションのすべてのレイヤーで認証を実装する必要があります。MongoDBへのすべての接続は、正しいユーザー名とパスワードを含む認証文字列を使用する必要があります。

3. exitコマンドを実行してMongoDBシェルから終了します。

exit

4. 以下のコマンドを実行して、新しく作成した管理ユーザーのユーザー名(-u)とパスワード(-p)でMongoDBシェルにログインします。 AdminATAを、「専用管理ユーザーの作成」セクション(ステップ4)で作成したユーザー名に置き換えてください。

--authenticationDatabaseパラメーターはMongoDBシェルがadminデータベースに対して認証を行うことを示します。

mongo -u AdminATA -p --authenticationDatabase admin

5. 管理ユーザーのパスワードを要求された場合は、パスワードを入力します。

Providing administrative password
logging into the MongoDB shell as an administrator

6. 最後に、show dbsコマンドを再実行して、すべてのデータベースを表示できるかどうか確認します。

show dbs

今回は、管理者ユーザーであるため、以下のようにデータベースの一覧が表示されます。

Listing all databases as admin user

結論

このチュートリアルでは、管理ユーザーの作成と認証の有効化方法について学びました。MongoDBのセキュリティを制御し、サーバー上のデータベースにアクセスできるユーザーに制限をかける方法を学びました。

ここまで来たら、アクセス権限を誰にどのように与えるかを決める番です。次は、安全にMongoDBコンテナを使用する方法を学んでみるのはいかがでしょうか?

Source:
https://adamtheautomator.com/mongodb-security/