DMSエンドポイントに対してのSSL接続の設定について

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

今回は、AWS DMS (Database Migration Service) エンドポイントで SSL/TLS接続 が使用されていない状態について、そのリスクと対策を解説します。

ポリシーの説明

Security Hub コントロール AWS DMS – AWS Security Hub

[DMS.9] DMS エンドポイントは SSL を使用する必要があります。

このコントロールは、 AWS DMS エンドポイントが SSL 接続を使用しているかどうかをチェックします。エンドポイントが SSL を使用していない場合、コントロールは失敗します。

リスク

AWS DMSは、データベースをAWSに移行したり、異なるデータベース間でデータをレプリケートしたりするためのサービスです。DMSレプリケーションインスタンスとソース/ターゲットデータベース間の接続にSSL/TLSが使用されていない場合、以下のようなセキュリティ上のリスクが発生します。

  • データ傍受 (盗聴) のリスク: SSL/TLS暗号化が有効になっていない場合、DMSレプリケーションインスタンスとデータベース間のネットワーク通信は暗号化されません。これにより、転送中の機密データ(例: 個人情報、認証情報、ビジネスデータ)が、悪意のあるアクターによって傍受(盗聴)されるリスクが生じます。これは、データ漏洩の直接的な原因となりえます。
  • 中間者攻撃 (Man-in-the-Middle Attack) の可能性: SSL/TLSは、通信相手の身元を証明する役割も果たします。証明書検証が行われない場合、攻撃者がDMSとデータベースの間に割り込み、正規の通信相手になりすましてデータを操作したり、誤った情報をDMSに送信させたりする中間者攻撃のリスクが高まります。
  • データの整合性の欠如: 暗号化されていない通信は、データの改ざんに対する保護も弱くなります。攻撃者が転送中のデータを変更しても、DMSやデータベース側でその改ざんを検知することが困難になります。
  • コンプライアンス違反: 多くの業界規制やコンプライアンス基準(例: GDPR、HIPAA、PCI DSS、ISO 27001)では、機密データの転送中に暗号化を義務付けています。DMSエンドポイントでSSL/TLSが使用されていない場合、これらの要件を満たせず、監査での指摘、法的リスク、罰金につながる可能性があります。
  • 信頼性の低下: セキュアでない接続は、システムの全体的な信頼性を低下させ、予期せぬデータ破損やセキュリティインシデントを引き起こす可能性があります。

対策

DMSエンドポイントでSSL/TLS接続を有効にすることは、移行中またはレプリケーション中のデータの機密性、整合性、および可用性を保護するための基本的なセキュリティ対策です。

  • SSLモードの選択: DMSエンドポイントの設定において、適切なSSLモードを選択します。
    • require: DMSレプリケーションインスタンスとデータベース間の接続にSSL/TLS暗号化を強制します。証明書の検証は行いません。
    • verify-ca: SSL/TLS暗号化を強制し、さらにDMSがデータベースサーバーの証明書を信頼されたCA(認証局)によって発行されたものとして検証します。
    • verify-full: SSL/TLS暗号化を強制し、verify-ca の検証に加えて、DMSがデータベースサーバーの証明書のホスト名がエンドポイント設定で指定されたホスト名と一致することも検証します。最も推奨されるセキュリティレベルです。
  • CA証明書のインポート: verify-ca または verify-full モードを使用する場合、DMSレプリケーションインスタンスがデータベースサーバーの証明書を検証できるように、データベースサーバーのCA証明書をAWS DMSにインポートする必要があります。
  • データベース側の設定: ソースおよびターゲットのデータベースがSSL/TLS接続を受け入れるように設定されていることを確認します。これには、データベースサーバーでのSSL/TLSの有効化、適切な証明書の設定、および必要なポート(通常はSSL/TLS用のポート)の開放が含まれます。
  • セキュリティグループ/ネットワークACLの確認: DMSレプリケーションインスタンスとデータベース間の通信を許可するセキュリティグループおよびネットワークACLが、SSL/TLSポート(例: PostgreSQLの5432、MySQLの3306など)で適切に設定されていることを確認します。
  • 定期的な証明書のローテーション: 使用するSSL/TLS証明書(特に自己署名証明書の場合)の有効期限を管理し、定期的にローテーションしてセキュリティを維持します。

修復方法

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

AWSコンソールを使用して、DMSエンドポイントでSSL接続を有効にします。

前提:

  • ソースまたはターゲットデータベースがSSL/TLS接続を受け入れるように設定されていること。
  • verify-ca または verify-full モードを使用する場合は、データベースサーバーのCA証明書が手元にあること。
  1. DMSサービスへ移動: AWSコンソールにログインし、AWS Database Migration Service (DMS) サービスを開きます。
  2. 証明書のインポート (verify-ca/verify-fullの場合):
    • 左側のナビゲーションペインで「証明書」を選択します。
    • 証明書のインポート」をクリックします。
    • 証明書の識別子(例: my-db-ca-cert)と、PEM形式の証明書本文(CA証明書のテキスト)を入力します。
    • インポート」をクリックします。
  3. エンドポイントの選択または作成:
    • 左側のナビゲーションペインで「エンドポイント」を選択します。
    • 既存のエンドポイントを修正する場合は、対象のエンドポイントを選択し、「アクション」から「変更」をクリックします。
    • 新しいエンドポイントを作成する場合は、「エンドポイントの作成」をクリックします。
  4. SSLモードの設定: エンドポイントの設定画面で、「SSL モード」セクションを見つけます。
    • ドロップダウンメニューから、以下のいずれかを選択します。
      • require: 暗号化を強制しますが、証明書の検証は行いません。
      • verify-ca: 暗号化を強制し、CA証明書を検証します。
      • verify-full (推奨): 暗号化を強制し、CA証明書とホスト名の両方を検証します。
    • verify-ca または verify-full を選択した場合は、「CA 証明書」ドロップダウンメニューから、ステップ2でインポートしたCA証明書を選択します。
  5. エンドポイントの保存: 設定を確認し、「エンドポイントの作成」または「変更の保存」をクリックします。 DMSレプリケーションタスクがこのエンドポイントを使用している場合、変更を適用するためにタスクを再開する必要がある場合があります。

Terraformでの修復手順

TerraformでDMSエンドポイントにSSL接続を設定するには、aws_dms_endpoint リソースの ssl_mode パラメータを設定します。verify-ca または verify-full を使用する場合は、aws_dms_certificate リソースでCA証明書をインポートし、そのARNをエンドポイントに指定します。

# (オプション) CA証明書をDMSにインポート (verify-ca/verify-fullモードの場合)
resource "aws_dms_certificate" "db_ca_certificate" {
  certificate_id  = "my-db-ca-cert" # 任意の識別子
  certificate_pem = file("path/to/your/ca-certificate.pem") # CA証明書ファイルのパスを指定
  # または、証明書本文を直接指定することも可能
  # certificate_pem = "-----BEGIN CERTIFICATE-----\\n...\\n-----END CERTIFICATE-----"
}

# DMSエンドポイントの定義
resource "aws_dms_endpoint" "source_endpoint" {
  endpoint_id   = "my-source-db-endpoint"
  endpoint_type = "source"
  engine_name   = "mysql" # または postgres, oracle など
  database_name = "mydb"
  username      = "admin"
  password      = "mysecurepassword" # 実際にはSecrets Managerなどを使用推奨
  server_name   = "my-source-db.example.com" # データベースのホスト名
  port          = 3306

  # SSLモードの設定
  ssl_mode = "verify-full" # "none", "require", "verify-ca", "verify-full" から選択

  # verify-ca または verify-full モードの場合、CA証明書のARNを指定
  # aws_dms_certificate リソースでインポートした証明書を参照
  certificate_arn = aws_dms_certificate.db_ca_certificate.arn 

  tags = {
    Name = "MyDMSSourceEndpoint"
  }
}

resource "aws_dms_endpoint" "target_endpoint" {
  endpoint_id   = "my-target-db-endpoint"
  endpoint_type = "target"
  engine_name   = "postgresql" # または mysql, oracle など
  database_name = "targetdb"
  username      = "targetadmin"
  password      = "mysecuretargetpassword" # 実際にはSecrets Managerなどを使用推奨
  server_name   = "my-target-db.example.com" # データベースのホスト名
  port          = 5432

  # SSLモードの設定
  ssl_mode = "verify-full" # "none", "require", "verify-ca", "verify-full" から選択

  # verify-ca または verify-full モードの場合、CA証明書のARNを指定
  certificate_arn = aws_dms_certificate.db_ca_certificate.arn # 同一の証明書を使用する場合

  tags = {
    Name = "MyDMSTargetEndpoint"
  }
}

# (例) DMSレプリケーションインスタンス
resource "aws_dms_replication_instance" "my_replication_instance" {
  replication_instance_id = "my-dms-instance"
  replication_instance_class = "dms.t3.medium"
  allocated_storage          = 50
  publicly_accessible        = false # セキュリティのためfalse推奨
  vpc_security_group_ids     = ["sg-0abcdef1234567890"] # 適切なセキュリティグループIDに置き換え
  replication_subnet_group_id = aws_dms_replication_subnet_group.my_replication_subnet_group.id
}

# (例) DMSレプリケーションサブネットグループ
resource "aws_dms_replication_subnet_group" "my_replication_subnet_group" {
  replication_subnet_group_id = "my-dms-subnet-group"
  replication_subnet_group_description = "Subnet group for DMS replication instance"
  subnet_ids = ["subnet-0abcdef1234567890", "subnet-0fedcba9876543210"] # 適切なサブネットIDに置き換え
}

# (例) DMSレプリケーションタスク
resource "aws_dms_replication_task" "my_replication_task" {
  replication_task_id          = "my-dms-task"
  replication_instance_arn     = aws_dms_replication_instance.my_replication_instance.replication_instance_arn
  source_endpoint_arn          = aws_dms_endpoint.source_endpoint.endpoint_arn
  target_endpoint_arn          = aws_dms_endpoint.target_endpoint.endpoint_arn
  migration_type               = "full-load-and-cdc" # または "full-load", "cdc"
  table_mappings               = jsonencode({
    "rules": [
      {
        "rule-type": "selection",
        "rule-id": "1",
        "object-locator": {
          "schema-name": "test",
          "table-name": "%"
        },
        "data-capture-sequence": "true"
      }
    ]
  })
  cdc_start_position           = "latest"
}

上記のTerraformコードでは、aws_dms_endpoint リソースの ssl_mode パラメータを設定することで、DMSエンドポイントのSSL接続を有効にしています。

  • ssl_mode = "verify-full": 最も推奨されるセキュリティレベルです。
  • certificate_arn = aws_dms_certificate.db_ca_certificate.arn: verify-ca または verify-full モードの場合、aws_dms_certificate リソースでインポートしたCA証明書のARNを指定します。path/to/your/ca-certificate.pem は、実際のCA証明書ファイルへのパスに置き換えてください。

your-backend-endpoint.com/hellomy-cloudfront-origin-bucket-unique-12345 などのプレースホルダーは、実際の環境に合わせて修正してください。

最後に

この記事では、DMSエンドポイントでSSL/TLS接続を有効にすることの重要性について解説しました。DMSレプリケーションインスタンスとデータベース間の通信をSSL/TLSで暗号化することは、移行中またはレプリケーション中の機密データを保護し、中間者攻撃やデータ傍受のリスクを軽減するために不可欠です。

貴社のDMSエンドポイントでは、SSL接続が適切に設定されていますか?この機会にぜひ設定を確認・強化してみてください。

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

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

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

この記事をシェアする

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

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

料金プランを詳しく見る