0Pricing
AWS Solutions Architect · レッスン

RDS のセキュリティ:暗号化とパラメータグループ

KMS で RDS の保存時データを暗号化し、パラメータグループで接続レベルの暗号化を制御して、IAM 認証で保護します。

「RDS のセキュリティ:暗号化とパラメータグループ」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。

保管時の RDS 暗号化

RDS は AWS Key Management Service(KMS)を使用した保管時の暗号化をサポートしています。DB インスタンスの作成時に暗号化を有効にすると、基盤となる EBS ボリューム上のすべてのデータ、自動バックアップ、スナップショット、Read Replicas が、指定した KMS キーを使用して暗号化されます。

暗号化は作成時に有効にする必要があり、既存の暗号化されていないインスタンスをその場で暗号化することはできません。回避策は、暗号化されていないスナップショットを取得し、暗号化を有効にしてコピーした後、その暗号化されたスナップショットから復元することです。KMS キーには AWS 管理キーを使用できるほか、より細かい制御と監査が必要な場合はカスタマーマネージドキー(CMK)を使用できます。

# Create an encrypted RDS instance
aws rds create-db-instance \
  --db-instance-identifier mydb-encrypted \
  --engine mysql \
  --db-instance-class db.t3.micro \
  --master-username admin \
  --master-user-password MyPass123! \
  --allocated-storage 20 \
  --storage-encrypted \
  --kms-key-id arn:aws:kms:us-east-1:123456789:key/my-key-id

既存の暗号化されていない RDS インスタンスを暗号化する

既存のインスタンスでは暗号化を有効にできないため、次の移行手順に従ってください。

  1. 暗号化されていないインスタンスの手動スナップショットを作成します
  2. スナップショットをコピーし、コピー中に KMS キーを指定して暗号化を有効にします
  3. 暗号化されたスナップショットから新しい DB インスタンスを復元します
  4. アプリケーションのエンドポイントを新しいインスタンスに更新します
  5. 古い暗号化されていないインスタンスを削除します

切り替え前に DMS を使用して新しい暗号化済みインスタンスを同期しない限り、この方法ではある程度のダウンタイムが発生します。

# Copy snapshot with encryption enabled
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier mydb-unencrypted-snap \
  --target-db-snapshot-identifier mydb-encrypted-snap \
  --kms-key-id alias/aws/rds

SSL/TLS による転送中の暗号化

RDS は SSL/TLS を使用して転送中のデータを暗号化します。各エンジンにはダウンロード可能な CA 証明書が用意されており、クライアントドライバーはこれを使用してサーバーの身元を検証します。SSL 接続を強制するには、暗号化されていない接続を拒否するようにデータベースエンジンを設定してください。

MySQL では、パラメータグループで require_secure_transport = ON パラメータを設定します。PostgreSQL では、ssl = 1 を設定し、必要に応じて rds.force_ssl = 1 を設定すると、SSL 以外の接続を完全に拒否できます。多くの Java および Python のデータベースドライバーでは、接続文字列パラメータ sslmode=require も使用できます。

# Connect to RDS MySQL over SSL
mysql -h mydb.abcd1234.us-east-1.rds.amazonaws.com \
  -u admin -p \
  --ssl-ca=rds-ca-2019-root.pem \
  --ssl-verify-server-cert

パラメータグループとは

パラメータグループは、RDS インスタンスにアタッチする、名前付きのエンジン設定の集合です。MySQL の my.cnf や PostgreSQL の postgresql.conf を編集する場合に相当しますが、AWS によって管理され、エンジンファミリーごとにバージョン管理されます。

AWS は各エンジンバージョンに対してデフォルトパラメータグループを提供しますが、その設定は編集できません。パラメータをカスタマイズするには、カスタムパラメータグループを作成して目的のパラメータを変更し、DB インスタンスに関連付けてください。静的パラメータを変更した場合は再起動が必要ですが、動的パラメータは直ちに反映されます。

# Create a custom parameter group
aws rds create-db-parameter-group \
  --db-parameter-group-name my-mysql8-params \
  --db-parameter-group-family mysql8.0 \
  --description 'Custom MySQL 8.0 parameters'

パラメータグループの設定を変更する

カスタムパラメータグループを作成したら、modify-db-parameter-group CLI コマンドまたはコンソールを使用して個々のパラメータを変更します。パラメータには適用方法があり、immediate(再起動なしで反映)または pending-reboot(次回のインスタンス再起動後にのみ反映)を指定できます。

試験で知っておくべき重要なパラメータは、max_connections(同時接続数の上限)、innodb_buffer_pool_size(MySQL のインメモリキャッシュサイズ)、log_bin_trust_function_creators(バイナリログに書き込むストアドファンクションを許可)、rds.force_ssl(PostgreSQL で SSL を強制)です。

# Force SSL in a PostgreSQL parameter group
aws rds modify-db-parameter-group \
  --db-parameter-group-name my-postgres-params \
  --parameters 'ParameterName=rds.force_ssl,ParameterValue=1,ApplyMethod=immediate'

追加機能向けのオプショングループ

オプショングループはパラメータグループに似ていますが、設定のチューニングではなく、データベースエンジンのアドオン機能を制御します。主に Oracle や SQL Server で使用され、Oracle Application Express (APEX)、SQL Server Transparent Data Encryption (TDE)、SQL Server Active Directory 認証などの機能を有効にします。

オプショングループ内の各オプションには、独自の設定を指定できる場合があります。オプショングループはエンジンファミリーごとにバージョン管理され、DB インスタンスに関連付ける必要があります。ほとんどのオープンソースエンジン(MySQL、PostgreSQL、MariaDB)では、カスタムオプショングループが必要になることはほとんどありません。

IAM データベース認証

RDS は MySQL および PostgreSQL エンジンでIAM データベース認証をサポートしています。固定のユーザー名とパスワードを使用する代わりに、アプリケーションは IAM ロールを引き受け、generate-db-auth-token AWS CLI コマンドまたは SDK 呼び出しを使用して、一時的な認証トークン(有効期間 15 分)を生成します。

メリットとして、長期間有効なデータベースパスワードが不要になること、IAM ポリシーによって認証情報を自動的にローテーションできること、アクセス制御を一元管理できることが挙げられます。この機能を使用するには、インスタンスで --enable-iam-database-authentication を有効にし、IAM ロールにマッピングされたデータベースユーザーを作成する必要があります。

# Generate an RDS IAM auth token
aws rds generate-db-auth-token \
  --hostname mydb.abcd1234.us-east-1.rds.amazonaws.com \
  --port 3306 \
  --username mydbuser \
  --region us-east-1

Secrets Manager と RDS の統合

AWS Secrets Manager は、RDS のマスターパスワードやアプリケーションの認証情報を保存し、自動的にローテーションできます。ローテーションを有効にすると、Secrets Manager は Lambda 関数を呼び出してデータベースのパスワードを更新し、新しい値をシークレットに保存します。アプリケーションは Secrets Manager API を介して最新のシークレット値を取得するため、常に有効な認証情報を使用できます。

コンソールで RDS インスタンスを作成するときに、マスター認証情報の管理を Secrets Manager に任せることを選択できます。これにより、コードや環境変数にパスワードをハードコードする必要がなくなります。

# Retrieve RDS credentials from Secrets Manager
aws secretsmanager get-secret-value \
  --secret-id rds!db-1234abcd-5678-efgh-ijkl-mnopqrstuvwx \
  --query SecretString \
  --output text | python3 -m json.tool

VPC とセキュリティグループによる制御

RDS インスタンスは VPC 内で実行され、DB サブネットグループを使用して、インスタンスを配置できるサブネット(複数の AZ にまたがる)を定義します。ベストプラクティスは、RDS を直接インターネットにアクセスできないプライベートサブネットに配置することです。

セキュリティグループは、DB ポート(例:MySQL の TCP 3306)に接続できる IP アドレスやその他のセキュリティグループを制御します。ネットワークレベルで最小権限を適用するため、RDS のセキュリティグループで許可する送信元はアプリケーション層のセキュリティグループだけにしてください。RDS のセキュリティグループのインバウンドルールで、0.0.0.0/0(すべてのトラフィック)を設定しないでください。

拡張モニタリングと監査ログ

拡張モニタリングは、OS レベルのメトリクス(CPU、メモリ、ファイルシステム、ディスク I/O)を 1~60 秒間隔で CloudWatch Logs に発行します。デフォルトの 60 秒間隔の CloudWatch メトリクスよりも細かい粒度で監視できます。DB ホスト上で実行されるエージェントを使用し、SQL Server のミラーリングモードを除くすべてのエンジンで利用できます。

データベース監査ログ(MySQL の一般クエリログ、スロークエリログ、PostgreSQL の pgaudit)は、コンプライアンス分析のために CloudWatch Logs に発行できます。これらをパラメータグループで有効にした後、RDS コンソールの ログのエクスポートでログのエクスポートを設定してください。

# Enable PostgreSQL logs export to CloudWatch
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --cloudwatch-logs-export-configuration 'EnableLogTypes=[postgresql,upgrade]' \
  --apply-immediately

セキュリティのベストプラクティスのまとめ

SAA-C03 試験で重要な RDS のセキュリティベストプラクティスは次のとおりです。

  • インスタンスの作成時に、KMS CMK を使用した保存時の暗号化を有効にします
  • パラメータグループの設定で転送中の SSL/TLSを強制します
  • インスタンスを、制限の厳しいセキュリティグループを設定したプライベートサブネットに配置します
  • 固定パスワードを避けるため、IAM データベース認証または Secrets Manager を使用します
  • RDS API 呼び出しのログ記録にはCloudTrailを、データベース監査ログにはCloudWatch Logsを有効にします
  • AWS Config ルール(例:rds-instance-public-access-check)を使用して、設定ミスを検出します

クイックチェック

このレッスンで学んだ AWS Solutions Architect (SAA-C03) の概念について理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、RDS の保存時の暗号化には KMS を使用し、作成時に有効にする必要があること、パラメータグループが SSL/TLS による転送中の暗号化の強制を含むエンジン設定を制御すること、そしてIAM データベース認証と Secrets Manager によって固定のデータベースパスワードをなくせることを学びました。次は DynamoDB のテーブル、アイテム、プライマリキーの設計について学びます。

よくある質問

「RDS のセキュリティ:暗号化とパラメータグループ」レッスンは無料ですか?

はい。「RDS のセキュリティ:暗号化とパラメータグループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。

「RDS のセキュリティ:暗号化とパラメータグループ」で何を学びますか?

KMS で RDS の保存時データを暗号化し、パラメータグループで接続レベルの暗号化を制御して、IAM 認証で保護します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AWS Solutions Architectを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「RDS のセキュリティ:暗号化とパラメータグループ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAWS Solutions Architectレッスンでコードを書いて実行できますか?

はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RDS エンジンとインスタンスクラス
  2. マルチ AZ と自動バックアップ
  3. 読み取りスケーリングのためのリードレプリカ
  4. RDS のセキュリティ:暗号化とパラメータグループ
← AWS Solutions Architectに戻る