保存時の暗号化と転送中の TLS
クライアント接続用の TLS を有効にし、WiredTiger の保存時暗号化と Atlas に組み込まれた暗号化ストレージについて学びます。
「保存時の暗号化と転送中の TLS」はCoddyKit上の無料MongoDB Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMongoDB Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 MongoDB Academyコースには全4レッスンが含まれています。
データベース暗号化の 2 つの層
MongoDB のデータを保護するには、2 つの異なる時点で保護する必要があります。転送中の暗号化(クライアントと MongoDB の間、またはレプリカセットメンバー間を移動するデータ)と、保存時の暗号化(ディスクに保存されたデータ)です。認証によって接続者を制御できますが、認証済みユーザーであっても暗号化されていない接続を使用すると、認証情報やクエリがネットワーク盗聴にさらされます。TLS と保存時の暗号化を組み合わせることで、多層防御を実現できます。
TLS: 転送中のデータを暗号化する
TLS(Transport Layer Security)は、MongoDB クライアント、ドライバー、mongod/mongos インスタンス間のネットワークチャネルを暗号化します。TLS を有効にすると、通信中の盗聴や中間者攻撃を防止できます。MongoDB 4.2 以降は TLS 1.1 以上のみをサポートし、最新のプラットフォームでは TLS 1.3 を利用できます。ネットワークトラフィックが傍受される可能性のある環境では、必ず TLS を使用してください。VPC レベルで分離されたクラウド VPC もこれに含まれます。
mongod.conf で TLS を設定する
TLSはmongod.confのnet.tlsセクションで設定します。暗号化されていない接続をすべて拒否するには、mode: requireTLSを設定します。サーバーの証明書と秘密鍵を含むPEMファイルを指定する必要があります。必要に応じてCAFileを指定すると、CAによって署名された証明書をクライアントに提示させることができます(相互TLS)。
# mongod.conf — require TLS for all connections
net:
port: 27017
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb-server.pem
CAFile: /etc/ssl/ca.pem # optional: require client certs
disabledProtocols: TLS1_0,TLS1_1 # enforce TLS 1.2+Node.js DriverでTLSを使用した接続
公式のMongoDB Node.jsドライバーでは、接続URIにmongodb+srv://を使用した場合(Atlasでは常にTLSが使用されます)、またはtls: trueオプションを設定した場合にTLSが有効になります。セルフホスト型のデプロイでは、ドライバーがサーバー証明書を検証できるように、CAファイルのパスを指定する必要がある場合があります。証明書のパスには環境変数を使用し、ソースコードにハードコードしないようにしてください。
const { MongoClient } = require('mongodb')
// Self-hosted MongoDB with TLS
const client = new MongoClient('mongodb://myUser:myPass@dbhost:27017', {
tls: true,
tlsCAFile: process.env.MONGO_TLS_CA_FILE,
// For mutual TLS (client certificate):
// tlsCertificateKeyFile: process.env.MONGO_TLS_CERT_FILE
})
await client.connect()
// Atlas — TLS is enabled by default via SRV record
const atlasClient = new MongoClient(process.env.ATLAS_CONNECTION_STRING)TLSモード:disabled、allowTLS、preferTLS、requireTLS
MongoDBには、移行段階で使用できる4つのTLSモードがあります。disabledは平文接続のみを受け付けます(開発環境専用)。allowTLSはTLS接続と平文接続の両方を受け付けます(後方互換性のため)。preferTLSはTLSをデフォルトにしますが、暗号化されていない接続も受け付けます。requireTLSはTLS以外の接続をすべて拒否するため、本番環境で使用できる唯一のモードです。
# Migration path: gradually enforce TLS
# Step 1: allowTLS (accept both)
# Step 2: preferTLS (default TLS, allow plain)
# Step 3: requireTLS (reject plain) <- production target
net:
tls:
mode: requireTLS保存データの暗号化:WiredTiger
MongoDBのデフォルトのストレージエンジンであるWiredTigerは、Encrypted Storage Engine(MongoDB Enterpriseで利用可能)をサポートしています。ディスク上のデータファイルをAES-256-CBCまたはAES-256-GCMで暗号化します。攻撃者が物理ディスクやディスクスナップショットにアクセスできたとしても、暗号化キーなしではデータを読み取れません。これにより、保存データの保護を義務付けるGDPR、HIPAA、PCI-DSSなどのコンプライアンス要件に対応できます。
# mongod.conf — WiredTiger encryption at rest (Enterprise only)
security:
enableEncryption: true
encryptionKeyFile: /etc/mongodb/encryption-key # AES-256 key
# Or use KMIP key management:
security:
enableEncryption: true
kmip:
serverName: kmip.example.com
port: 5696
clientCertificateFile: /etc/ssl/kmip-client.pemAtlasの保存データ暗号化
MongoDB Atlasは、クラウドプロバイダーのキー管理を使用した保存データの暗号化を提供します。AWS KMS、Azure Key Vault、Google Cloud KMSに対応しています。お客様は独自のCustomer Master Key(CMK)を持ち込むことができ、完全な制御権を持てます。CMKを削除すると、Atlasはデータを復号できなくなります。Atlasの保存データ暗号化はSecurity設定でプロジェクトごとに有効化され、そのプロジェクト内のすべてのクラスターに適用されます。
キー管理のベストプラクティス
暗号化の強度は、キーのセキュリティと同程度にしかなりません。次のキー管理のベストプラクティスに従ってください。暗号化キーはデータベースと同じサーバーではなく、専用のKey Management Service(KMS)に保管する。暗号化キーを定期的にローテーションする(MongoDBでは、すべてのデータを再暗号化せずにキーをローテーションできます)。開発、ステージング、本番環境ではそれぞれ別のキーを使用する。KMSの監査ログを有効にして、すべてのキーアクセスイベントを追跡する。
ダウンタイムなしのTLS証明書ローテーション
TLS証明書には通常1~2年の有効期限があります。MongoDBはオンラインでの証明書ローテーションをサポートしています。新しいPEMファイルを配置してrotateCertificatesコマンドをmongodに送信すると、プロセスを再起動せずに、新しい接続に対して新しい証明書が使用されます。直前になって慌てたり本番環境が停止したりしないよう、証明書の有効期限が切れる少なくとも30日前に更新を計画してください。
// Trigger online certificate rotation (mongosh)
db.adminCommand({ rotateCertificates: 1 })
// MongoDB reloads the certificate file specified in mongod.conf
// without dropping existing connectionsネットワークレベルのセキュリティ:IP許可リストとVPC
TLSと保存データの暗号化は、通信中およびディスク上のデータを保護しますが、ネットワークレベルの制御を追加することで、さらに防御層を強化できます。MongoDB Atlasでは、IP Access Listのエントリを使用して、アプリケーションサーバーと開発者のIPアドレスだけを許可リストに登録します。本番環境では、VPC PeeringまたはAWS PrivateLinkを使用し、アプリケーションとAtlas間のトラフィックがパブリックインターネットを経由しないようにしてください。これにより、TLSを考慮する以前の段階でも、ネットワークベースの攻撃の大部分を排除できます。
暗号化された接続の監査
TLSを有効にしたら、connPoolStatsまたはMongoDBの接続ログを確認して、すべての接続が暗号化されていることを検証します。MongoDBはTLSハンドシェイクの失敗をログに記録するため、平文接続を試みている古いクライアントを特定できます。AtlasではMonitoringタブにアクティブな接続とそのTLSステータスが表示されるため、allowTLSモードを削除する前に、暗号化が完全に適用されていることを簡単に確認できます。
// Check current connections (mongosh)
db.adminCommand({ currentOp: true }).inprog
.filter(op => op.client)
.map(op => ({ client: op.client, tls: op.clientMetadata }))
// Server status — TLS stats
db.serverStatus().network.serviceExecutorTaskStats理解度チェック
このレッスンで学んだMongoDB & NoSQL Databasesの概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、次のことを学びました。requireTLSをmongod.confで設定すると、クライアント接続の暗号化を強制でき、本番環境ではこのモードだけを使用すべきです。WiredTiger Encrypted Storage Engineはディスク上のデータファイルを保護し(Enterprise)、AtlasはCMKベースのクラウド暗号化を提供します。また、IP許可リストやVPC Peeringなどのネットワークレベルの制御により、TLS以外の保護層も追加できます。次はClient-Side Field Level Encryptionについて学びます。
AI チューターと学ぶ JavaScript — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「保存時の暗号化と転送中の TLS」レッスンは無料ですか?
はい。「保存時の暗号化と転送中の TLS」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、MongoDB Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 MongoDB Academyコースには全4レッスンが含まれています。
「保存時の暗号化と転送中の TLS」で何を学びますか?
クライアント接続用の TLS を有効にし、WiredTiger の保存時暗号化と Atlas に組み込まれた暗号化ストレージについて学びます。 ブラウザで直接実行するハンズオンコードでMongoDB Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
MongoDB Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのMongoDB Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「保存時の暗号化と転送中の TLS」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このMongoDB Academyレッスンでコードを書いて実行できますか?
はい。すべてのMongoDB Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。