SJ blog
database
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

RDS暗号化 — 有効化のタイミング・スナップショット・クロスリージョンコピーの制約

RDSの暗号化(保存時)の設定方法、作成後の暗号化有効化の手順、暗号化スナップショットのクロスリージョンコピー、KMSキーの変更方法、転送時暗号化の設定を解説。

一言結論

RDSの暗号化はインスタンス作成時にしか設定できないため、既存の非暗号化インスタンスを暗号化するにはスナップショット経由のコピー・復元という計画的な移行が必須であり、後からのオン/オフは一切不可という制約を設計段階で織り込む必要がある。

RDSの保存時暗号化(Encryption at Rest)

RDSの暗号化はインスタンス作成時のみ有効化できる。作成後に既存インスタンスの暗号化をオン/オフすることはできない。

暗号化対象(有効化すると自動で適用):
  DBインスタンスのストレージ(データファイル)
  自動バックアップ
  リードレプリカ
  スナップショット
  ログ
# 暗号化を有効にしてRDSを作成
aws rds create-db-instance \
  --db-instance-identifier my-encrypted-db \
  --db-instance-class db.r6g.large \
  --engine mysql \
  --storage-encrypted \
  --kms-key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx

既存の非暗号化インスタンスを暗号化する手順

作成後に暗号化を有効化できないが、以下の手順で暗号化インスタンスを作成できる。

手順:
1. 既存インスタンスのスナップショットを作成
2. スナップショットをコピー(暗号化オプション指定)
3. 暗号化スナップショットからインスタンスを復元
4. アプリケーションの接続先を切り替え
5. 旧インスタンスを削除

注意: 手順3-4の間はダウンタイムが発生する
# ステップ1: スナップショット作成
aws rds create-db-snapshot \
  --db-instance-identifier my-unencrypted-db \
  --db-snapshot-identifier my-unencrypted-snapshot

# ステップ2: スナップショットを暗号化してコピー
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier my-unencrypted-snapshot \
  --target-db-snapshot-identifier my-encrypted-snapshot \
  --kms-key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx

# ステップ3: 暗号化スナップショットからDB復元
aws rds restore-db-instance-from-db-snapshot \
  --db-instance-identifier my-encrypted-db \
  --db-snapshot-identifier my-encrypted-snapshot

暗号化スナップショットのクロスリージョンコピー

暗号化スナップショットを別リージョンにコピーする場合、コピー先リージョンのKMSキーで再暗号化が必要だ。

# 暗号化スナップショットを別リージョンにコピー
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier arn:aws:rds:ap-northeast-1:123456789012:snapshot:my-snapshot \
  --target-db-snapshot-identifier my-snapshot-us-east-1 \
  --kms-key-id arn:aws:kms:us-east-1:123456789012:key/yyy \
  --region us-east-1

マルチリージョンKMSキーを使えば、コピー先で異なるキーを管理する手間を省ける。

RDSの転送時暗号化(Encryption in Transit)

保存時暗号化とは別に、クライアントとDBインスタンス間の通信を暗号化する。

MySQLの場合:
  REQUIRE SSL: 接続にSSL/TLSを必須化
  
PostgreSQLの場合:
  ssl=true パラメータをAWS RDS Parameter Groupで設定
  
SQL Serverの場合:
  Force Encryption オプションを有効化
-- MySQL: 特定ユーザーにSSLを強制
ALTER USER 'appuser'@'%' REQUIRE SSL;

-- MySQL: 接続状態の確認
SHOW STATUS LIKE 'Ssl_cipher';
# Pythonアプリケーションでの接続例(SSL証明書検証付き)
import mysql.connector

conn = mysql.connector.connect(
    host='mydb.cluster-xxx.ap-northeast-1.rds.amazonaws.com',
    user='admin',
    password='secret',
    database='mydb',
    ssl_ca='/path/to/rds-ca-2019-root.pem',  # AWSのCA証明書
    ssl_verify_cert=True
)

リードレプリカと暗号化の関係

暗号化インスタンスのリードレプリカ:
  → 自動的に暗号化される(同じKMSキー)

非暗号化インスタンスのリードレプリカ:
  → 暗号化インスタンスを作れない
  
クロスリージョンリードレプリカ(暗号化インスタンスから):
  → 必ず暗号化が必要
  → コピー先リージョンのKMSキーを指定
# 暗号化インスタンスからクロスリージョンリードレプリカを作成
aws rds create-db-instance-read-replica \
  --db-instance-identifier my-dr-replica \
  --source-db-instance-identifier arn:aws:rds:ap-northeast-1:123456789012:db:my-encrypted-db \
  --kms-key-id arn:aws:kms:ap-northeast-3:123456789012:key/zzz \
  --region ap-northeast-3

KMSキーの変更

既存の暗号化インスタンスのKMSキーを変更する場合も、スナップショット経由での復元が必要だ。

# 異なるKMSキーで暗号化したスナップショットを作成
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier old-snapshot \
  --target-db-snapshot-identifier new-key-snapshot \
  --kms-key-id new-kms-key-arn
# → この新スナップショットから復元したインスタンスは新しいKMSキーで暗号化される

試験頻出ポイント

シナリオ回答
作成後に暗号化を有効化したい不可。スナップショット→コピー→復元の手順
暗号化インスタンスのスナップショットは暗号化されるか自動的に暗号化される
非暗号化スナップショットから暗号化DBを作るコピー時にKMSキーを指定
クロスリージョンスナップショットコピーコピー先のKMSキーが必要
非暗号化DBのリードレプリカを暗号化できるか不可

まとめ

RDSの暗号化はインスタンス作成時に設定するのが基本だ。既存の非暗号化インスタンスを暗号化するにはスナップショット経由の移行が必要で計画的な実施が求められる。クロスリージョンコピーでは常にコピー先のKMSキーが必要なことを把握しておく。