DocumentDBクラスターの暗号化設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、Amazon DocumentDBクラスターの保存データが適切に暗号化されていない状態について、リスクと対策を解説します。

ポリシーの説明

Amazon DocumentDB の Security Hub コントロール – AWS Security Hub

このコントロールは、Amazon DocumentDB クラスターが保管中に暗号化されているかどうかをチェックします。Amazon DocumentDB クラスターが保管中に暗号化されていない場合、コントロールは失敗します。

リスク

Amazon DocumentDB (MongoDB 互換) は、高性能かつスケーラブルなドキュメントデータベースサービスです。DocumentDBクラスターに保存されているデータが適切な暗号化レベルで暗号化されていない場合、機密情報が漏洩するリスクが高まり、以下のような重大なセキュリティおよびコンプライアンス上の問題が発生する可能性があります。

  • データ漏洩のリスク: 暗号化されていないデータがデータベースのストレージ層に保存されていると、不正アクセスや内部犯行によってデータが直接読み取られる可能性があります。これにより、顧客情報、企業秘密、個人情報などの機密データが外部に漏洩する恐れがあります。
  • コンプライアンス違反: 多くの業界規制やデータプライバシー法(例: GDPR, HIPAA, PCI DSS)では、保存データの暗号化が義務付けられています。暗号化が行われていない場合、これらの規制に違反し、多額の罰金、法的措置、企業の評判失墜につながる可能性があります。
  • フォレンジック分析の困難化: セキュリティインシデントが発生した場合、暗号化されていないデータは攻撃者にとって容易に利用され、被害状況の把握やフォレンジック分析が困難になることがあります。
  • 信頼性の低下: データ侵害のニュースは、顧客やパートナーからの信頼を著しく低下させ、ビジネスに長期的な悪影響を及ぼす可能性があります。

対策

Amazon DocumentDBクラスターに保存されているデータを暗号化することは、機密性の高い情報を保護し、セキュリティとコンプライアンスの要件を満たすために不可欠です。

  • ストレージレベルの暗号化の有効化: DocumentDBは、AWS Key Management Service (AWS KMS) を使用したストレージレベルの暗号化をサポートしています。クラスターの作成時にこの暗号化を有効にすることで、保存されているデータ(ストレージ、スナップショット、リードレプリカ、自動バックアップ)が自動的に暗号化されます。
  • AWS KMSキーの選択: 暗号化には、AWS マネージドキー (デフォルト) またはカスタマーマネージドキー (CMK) を選択できます。
    • AWS マネージドキー: AWSが管理するキーで、手軽に利用できます。
    • カスタマーマネージドキー (CMK): 暗号化キーの作成、管理、アクセス許可をより細かく制御したい場合に選択します。セキュリティ要件が高い場合に推奨されます。
  • キーポリシーの管理: CMKを使用する場合、そのキーポリシーを適切に設定し、DocumentDBがデータにアクセスして暗号化・復号化できる権限を持つことを確認します。また、不要なアクセスを制限することも重要です。
  • 既存クラスターの移行検討: 既に暗号化されていないDocumentDBクラスターがある場合、直接暗号化を有効にすることはできません。暗号化された新しいクラスターにデータを移行する必要があります。これには、スナップショットからの復元、またはデータ移行ツールを使用する方法があります。

修復方法

AWSコンソールでの修復手順

AWSコンソールを使用して、Amazon DocumentDBクラスターの保存データを暗号化します。

注: 既存の暗号化されていないDocumentDBクラスターをその場で暗号化することはできません。データを保護するには、暗号化を有効にした新しいクラスターを作成し、既存のデータをそこに移行する必要があります

新しい暗号化されたDocumentDBクラスターの作成手順:

  1. DocumentDBサービスへ移動:
    • AWSコンソールにログインし、DocumentDBサービスを開きます。
  2. クラスターの作成を開始:
    • 左側のナビゲーションペインで「クラスター」を選択します。
    • 「作成」ボタンをクリックします。
  3. 暗号化の有効化:
    • 「保管時の暗号化」セクションを展開します。
    • 暗号化の有効化」にチェックを入れます。
    • 「マスターキー」で、以下のいずれかを選択します。
      • (default) aws/rds: AWSが管理するデフォルトのKMSキーを使用します。別のキーを選択: 独自のカスタマーマネージドキー (CMK) を使用する場合に選択し、そのキーのARNを指定します。
  4. クラスターの作成を完了:
    • VPC、サブネットグループ、セキュリティグループなどのネットワーク設定を行います。
    • その他のオプション(バックアップ、ログなど)を設定し、「クラスターの作成」をクリックします。
  5. データ移行:
    • 新しい暗号化されたクラスターが作成されたら、既存の暗号化されていないクラスターからこの新しいクラスターにデータを移行します。これには、mongodumpmongorestore のようなMongoDBユーティリティを使用するか、AWS Database Migration Service (DMS) を利用できます。

Terraformでの修復手順

TerraformでAmazon DocumentDBクラスターの保存データ暗号化を有効にするには、aws_docdb_cluster リソースの storage_encrypted パラメータを true に設定します。カスタマーマネージドキーを使用する場合は、kms_key_id パラメータも指定します。

# AWS KMS キーの定義 (カスタマーマネージドキーを使用する場合)
resource "aws_kms_key" "docdb_kms_key" {
  description             = "KMS key for DocumentDB cluster encryption"
  deletion_window_in_days = 10
  enable_key_rotation     = true # キーの自動ローテーションを有効にする
  tags = {
    Name = "DocDBEncryptionKey"
  }
}

# KMS キーポリシーの定義 (DocumentDBサービスにアクセス許可を与える)
resource "aws_kms_key_policy" "docdb_kms_key_policy" {
  key_id = aws_kms_key.docdb_kms_key.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "Enable IAM User Permissions"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
        }
        Action   = "kms:*"
        Resource = "*"
      },
      {
        Sid       = "Allow DocumentDB to use the key"
        Effect    = "Allow"
        Principal = { Service = "rds.amazonaws.com" } # DocumentDBはRDSサービスプリンシパルを使用
        Action = [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey",
        ]
        Resource = "*"
        Condition = {
          StringEquals = {
            "kms:EncryptionContext:aws:rds:db-id" = "arn:aws:docdb:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:db:${aws_docdb_cluster.main_docdb_cluster.cluster_identifier}"
          }
        }
      },
    ]
  })
}

# DocumentDBクラスターの定義
resource "aws_docdb_cluster" "main_docdb_cluster" {
  cluster_identifier      = "my-encrypted-docdb-cluster"
  engine                  = "docdb"
  engine_version          = "4.0.0" # 使用するエンジンバージョンに合わせて変更
  master_username         = "your_username"
  master_password         = "your_password" # 適切なシークレット管理ツールを使用してください
  skip_final_snapshot     = true # 本番環境では false に設定し、最終スナップショットを取得することを推奨
  db_subnet_group_name    = aws_docdb_subnet_group.main_docdb_subnet_group.name
  vpc_security_group_ids  = [aws_security_group.docdb_sg.id]

  # 保存時の暗号化を有効化
  storage_encrypted = true

  # (オプション) カスタマーマネージドキーを使用する場合
  kms_key_id = aws_kms_key.docdb_kms_key.arn 

  # その他の設定 (バックアップ保持期間など)
  backup_retention_period = 7 # 1から35までの整数
  port                    = 27017
  preferred_backup_window = "07:00-09:00" # UTC時間でバックアップウィンドウを指定 (オプション)
  preferred_maintenance_window = "mon:03:00-mon:04:00" # メンテナンスウィンドウを指定 (オプション)
  tags = {
    Name        = "MyEncryptedDocumentDBCluster"
    Environment = "Development"
  }
}

# DocumentDBインスタンスの定義 (クラスターに紐づくインスタンス)
resource "aws_docdb_cluster_instance" "cluster_instances" {
  count              = 1 # 必要なインスタンス数に調整
  identifier         = "my-encrypted-docdb-instance-${count.index}"
  cluster_identifier = aws_docdb_cluster.main_docdb_cluster.id
  instance_class     = "db.r5.large" # インスタンスクラスを適切なものに調整
  engine             = "docdb"
}

# DBサブネットグループの定義
resource "aws_docdb_subnet_group" "main_docdb_subnet_group" {
  name       = "main-docdb-subnet-group"
  subnet_ids = [aws_subnet.private_a.id, aws_subnet.private_c.id] # あなたのプライベートサブネットIDに置き換え
  tags = {
    Name = "MainDocDBSubnetGroup"
  }
}

# セキュリティグループの定義
resource "aws_security_group" "docdb_sg" {
  name        = "docdb-security-group-encrypted"
  description = "Allow inbound traffic to DocumentDB"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 27017 # DocumentDBのデフォルトポート
    to_port     = 27017
    protocol    = "tcp"
    # ここにDocumentDBにアクセスするEC2インスタンスやLambdaのセキュリティグループIDなどを設定
    # 例: security_groups = [aws_security_group.app_sg.id]
    # または、より限定されたCIDRブロックを設定
    cidr_blocks = ["10.0.0.0/16"] # 適切なIP範囲に制限してください
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "DocDBSecurityGroup"
  }
}

# VPCおよびサブネットの定義例 (必要に応じて)
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "main-vpc"
  }
}

resource "aws_subnet" "private_a" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.10.0/24"
  availability_zone = "ap-northeast-1a" # あなたのリージョンに合わせて変更
  tags = {
    Name = "private-subnet-a"
  }
}

resource "aws_subnet" "private_c" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.11.0/24"
  availability_zone = "ap-northeast-1c" # あなたのリージョンに合わせて変更
  tags = {
    Name = "private-subnet-c"
  }
}

# 現在のAWSアカウントIDとリージョンを取得するためのデータソース
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

上記の例では、aws_docdb_cluster リソース内で storage_encrypted = true を設定することで、保存データの暗号化を有効にしています。

カスタマーマネージドキー (CMK) を使用する場合は、aws_kms_keyaws_kms_key_policy を定義し、aws_docdb_clusterkms_key_id にそのARNを指定します。CMKを使用しない場合は、kms_key_id の行を削除してください。

your_usernameyour_passwordmy-encrypted-docdb-cluster などのプレースホルダーは、実際の環境に合わせて修正してください。特にパスワードはHashiCorp VaultやAWS Secrets Managerなどの安全な方法で管理してください。

最後に

この記事では、Amazon DocumentDBクラスターの保存データが適切に暗号化されていない状態について、リスクと対策を解説しました。DocumentDBの保存データの暗号化を有効にすることは、機密情報の保護、コンプライアンス要件の遵守、および全体的なセキュリティ体制の強化に不可欠です。適切な暗号化戦略を実装することで、データ漏洩のリスクを大幅に低減し、お客様の信頼を維持することができます。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る