今すぐ導入すべきMongoDBの5つの重要なセキュリティ設定
認証、最小権限ロール、ネットワークバインディング、TLS、監査ログの確認によりMongoDBをセキュアにします。
今すぐ実装すべきMongoDBの重要なセキュリティ設定5つ
MongoDBのセキュリティ問題は、通常、単純なミスから始まります。データベースが本来あるべきでない場所で待ち受け、受け入れるべきでないユーザーを受け入れ、暗号化されていないトラフィックを送信するといったことです。MongoDBの設定には、明示的な認証、限定されたロール、プライベートネットワークへの露出、TLS、そして有用な監査記録が必要です。
このガイドでは、不正アクセスの可能性を減らし、不審なアクティビティの調査を容易にする5つの本番環境チェックを紹介します。
1. 必須のアクセス制御と強力な認証を有効にする
まず、認可が有効になっていることを確認します。これがないと、サーバーに到達できるクライアントは、デプロイの開始方法と設定方法に応じて、データを読み取ったり変更したりできる可能性があります。
認証を有効にする方法
認証は通常、起動時に設定ファイル(mongod.conf)またはコマンドラインフラグを介して有効にします。
設定ファイル(/etc/mongod.conf):
# /etc/mongod.conf の抜粋
security:
authorization: enabled
コマンドライン:
mongod --auth --dbpath /var/lib/mongodb
管理者ユーザーの作成
認証を有効にする前に最初の管理ユーザーを作成するか、初期セットアップ中にMongoDBのlocalhost例外を使用します。最初のユーザーが存在したら、認証を有効にして再起動し、すべてのアクセスに名前付きアカウントを使用します。
例:mongosh を介したルートユーザーの作成
まず、データベースに接続します(認証なしで既に実行されている場合、またはlocalhost例外を使用する場合):
use admin
db.createUser(
{
user: "mongoAdmin",
pwd: passwordPrompt(), // パスワードを安全に入力するプロンプト
roles: [ { role: "root", db: "admin" } ]
}
)
警告: 常にシークレットマネージャーに保存された強力なパスワードを使用してください。機密性の高い認証情報をスクリプトや設定ファイルにハードコードしないでください。
2. きめ細かいロールベースのアクセス制御(RBAC)を実装する
認証を有効にした後、次のステップは**最小権限の原則(PoLP)**を確立することです。これは、すべてのユーザー、アプリケーション、およびサービスアカウントが、そのタスクを実行するために必要な最小限の権限のみを持つべきであることを意味します。
アプリケーション接続に root や readWriteAnyDatabase ロールを使用しないでください。代わりに、特定のデータベースやコレクションに対して特定の権限を付与するカスタムロールを定義します。
実用的なRBACの手順
- カスタムロールを定義する: 組み込みロール(
read、readWrite)で不十分な場合は、きめ細かいアクション(例:特定のコレクションに対するinsertとfindのみ)を持つロールを作成します。 - アプリケーションユーザーを分離する: 異なるアプリケーション層専用のユーザーを作成します(例:バックエンド用の
app_rw、分析用のreporting_ro)。 - 外部ツールのアクセスを制限する: 管理ツールは、どうしても必要な場合にのみ特権アカウントを使用して接続するようにします。
例:特定のデータベースに対する読み取り専用ユーザーの作成
use users_db
db.createUser(
{
user: "reporting_svc",
pwd: passwordPrompt(),
roles: [ { role: "read", db: "users_db" } ] // users_db への読み取りアクセスのみ
}
)
3. 厳格なネットワークバインディングとファイアウォールを構成する
ネットワーク構成は、データベースの境界防御です。多くのパッケージ化されたMongoDBインストールはデフォルトでlocalhostにバインドしますが、コンテナイメージ、カスタムコマンドライン、コピーされた設定ファイルは 0.0.0.0 を公開する可能性があります。デフォルトが安全であると想定するのではなく、常に有効な bindIp を確認してください。
bindIp を制限する
主要なセキュリティ対策は、設定ファイルで bindIp 設定を定義することです。これにより、MongoDBがリッスンするIPアドレスまたはホスト名が明示的に指定されます。
設定ファイル(/etc/mongod.conf):
# バインドするIPまたはホスト名のリスト
# ローカルアクセスのみの場合は 127.0.0.1 を使用
# アプリケーションサーバーからのアクセスのみの場合は内部IPを使用
net:
port: 27017
bindIp: 127.0.0.1, 10.0.1.5, localhost
外部ファイアウォール(セキュリティグループ)を実装する
bindIp(MongoDBプロセスを制限する)に加えて、外部ファイアウォール(iptables、AWSセキュリティグループ、Azureネットワークセキュリティグループなど)を使用して、サーバーに到達する前にトラフィックをフィルタリングする必要があります。
ベストプラクティス: MongoDBポート(デフォルトは27017)のインバウンドトラフィックを、アプリケーションサーバー、ロードバランサー、管理ジャンプボックスからのみ許可します。
4. 転送中のデータの暗号化(TLS)を強制する
クライアント、シェル、ドライバー、MongoDB間で送信されるデータは、トランスポート層セキュリティ(TLS)で暗号化する必要があります。暗号化されていない接続を介して認証情報、クエリ、結果を送信すると、データが盗聴や中間者攻撃にさらされます。
MongoDBは、暗号化トラフィックとオプションのクライアント証明書検証の両方に対してネイティブのTLS構成をサポートしています。
TLSを有効にする
暗号化を有効にするには、有効なTLS証明書を生成または取得し、設定ファイルでその場所を指定する必要があります。
設定ファイル(/etc/mongod.conf):
net:
tls:
mode: requireTLS
# 結合された証明書とキーファイルへのパス
certificateKeyFile: /etc/ssl/mongodb.pem
# 認証局ファイルへのパス(クライアント検証用)
CAFile: /etc/ssl/ca.pem
TLSを使用したクライアント接続
サーバーがTLSを要求すると、すべてのクライアントは適切なセキュアフラグを使用して接続する必要があります:
mongosh "mongodb://[email protected]/admin?authSource=admin" --tls --tlsCAFile /path/to/ca.pem
ヒント: 本番環境では
mode: requireTLSを使用して、すべての接続が確実に保護されるようにします。preferTLSモードは通常、移行中またはテスト中にのみ使用されます。
5. 監査を有効にし、アクティビティログを監視する
強力なアクセス制御と暗号化があっても、内部アカウントの侵害や権限昇格からセキュリティ上の脅威が発生する可能性があります。包括的な監査を有効にすると、アクションの履歴記録が提供され、コンプライアンス、フォレンジック分析、不審な動作の検出に不可欠です。
MongoDBの監査機能は、管理アクション、認証試行、認可の失敗、選択されたデータ操作をログに記録できます。可用性はMongoDBのエディションまたはプラットフォームによって異なります。たとえば、監査はMongoDB EnterpriseとMongoDB Atlasで利用可能ですが、セルフマネージドのCommunityデプロイメントでは、他のログ記録と監視のアプローチが必要です。
監査の構成
監査は、設定ファイルの auditLog セクションを介して構成されます。出力先(ファイル、syslog、コンソール)とフィルター条件を指定できます。
設定ファイル(/etc/mongod.conf):
auditLog:
destination: file
path: /var/log/mongodb/audit.log
format: JSON
# 認証や管理変更などの主要なセキュリティイベントに焦点を当てる
filter: '{ atype: { $in: [ "authenticate", "authCheck", "createCollection", "createUser", "dropDatabase" ] } }'
重要な監視対象領域
- 失敗した認証試行: 急激な増加は、ブルートフォース攻撃の可能性を示します。
- ユーザー/ロールの作成/削除: すべての権限変更はログに記録され、レビューされる必要があります。
- データベースまたはコレクションの削除: 破壊的な操作には即時アラートが必要です。
MongoDB監査ログを、Splunk、Elastic Stack、Datadogなどの集中ログ管理システムと統合して、アラートと保持を行います。
まとめ
すべてのMongoDBデプロイメントで、これらの5つのコントロールを確認してください。認証が有効であること、アプリケーションユーザーが限定されたロールを持っていること、bindIp とファイアウォールがネットワークアクセスを制限していること、クライアントがTLSを必要としていること、セキュリティイベントが監視システムに流れていることです。これらのチェックは、バックアップ、パッチ適用、またはシークレットローテーションに代わるものではありませんが、最初に最も一般的な設定のギャップを埋めます。