暗号化鍵を使用した Heroku Postgres の暗号化
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年05月03日(水)
Table of Contents
この記事では、Private および Shield Space 内の Heroku Postgres を暗号化するために AWS Key Management Service (KMS) を使用してカスタマーマスターキー (CMK) を作成する方法について説明します。このプロセスは、大きく分けて 3 つの手順で構成されます。
- AWS KMS でカスタマーマスターキー (CMK) を作成する
- その CMK に IAM ポリシーを適用して、Heroku Data がユーザーの代わりにそのキーを使用できるようにする
- 暗号化鍵を使用して Postgres データベースを作成する
AWS の前提条件
このセクションの手順は Amazon KMS ダッシュボードから実行します。あるいは、以下に示すように、AWS CLI を使用することもできます。
CMK は Heroku Postgres データベースと同じリージョンに存在する必要があります。サポートされるリージョンの一覧は、こちらにあります。
手順 1: カスタマーマスターキーを作成する
AWS Web コンソールにログインしたら、Key Management Service に移動し、「Create Key」 (キーの作成) をクリックします。
手順 2: 対称キーを選択する
対称キーを選択し、「Next」(次へ) をクリックします。
バックアップを保存するために S3 を使用しますが、これは対称 CMK のみをサポートしています。
手順 3: 詳細を追加し、アクセス許可を設定する
エイリアス (heroku-data
など) を追加し、「Next」 (次へ) を押します。キーの管理アクセス許可をさらに設定する必要はありません。「Next」 (次へ) をクリックします。
キーの使用のアクセス許可を定義する場合は、一番下にスクロールして、別の AWS アカウントを追加します。ボックスに Heroku Data の AWS アカウント ID (021876802972
) を入力し、"「Next」 (次へ) を押します。
手順 4: 確認して完了する
キーポリシーを確認し、作成を完了します。CMK の Amazon Resource Name (ARN) をメモしておきます。
手順 5: 自動キーローテーションを有効にする
キーの情報ページを開くことによって、自動キーローテーションを有効にすることができます。ページの一番下で、「Key Rotation」 (キーのローテーション) タブを選択し、ボックスをチェックして 「Save」 (保存) を押します。
AWS は人手を介さず毎年自動的にキーのローテーションを処理します。AWS KMS 内に生成される対称キーのこのローテーションでは、データの再暗号化は必要ありません。AWS KMS は、古いバージョンのキーで暗号化されたデータの暗号化解除に使用される以前のバージョンのキーを管理します。すべての新しい暗号化リクエストでは、新しいバージョンのキーが使用されます。キーのローテーション時に、Heroku Postgres データベースでダウンタイムが発生することはありません。
代替手段: AWS CLI を使用する
AWS CLI を使用して、適切なキーポリシーが設定されたカスタマーマスターキー (CMK) を作成できます。
$ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --output text --query 'Account'`
$ export HEROKU_DATA_ACCOUNT_ID=021876802972
$ curl -s -o key-policy.json https://gist.githubusercontent.com/jdowning/8d146cd238de828141e81b458dc546f0/raw/fc2a69603dc1364f1bc2fd2b5beb0af210150444/key-policy.json
$ aws kms create-key --description 'heroku-data' --policy $(envsubst < key-policy.json)
create-key
コマンドの出力には、プロビジョニング中に必要なキーの ARN が含まれています。これは、後の手順で CMK_ARN
として参照されます。
CMK に対して自動キーローテーションを有効にすることをお勧めします。
$ aws enable-key-rotation --key-id CMK_ARN
暗号化鍵を使用して Heroku Postgres データベースを作成する
これで、適切なアクセス許可が設定されたカスタマーマスターキーが用意できたので、そのキーを使用して、Heroku Data によって管理されるデータを暗号化できます。CMK の完全な Amazon Resource Name (ARN) が必要です。データベースを作成する場合は --encryption-key
プロビジョニングフラグを使用できます。
$ heroku addons:create heroku-postgresql:private-7 --encryption-key CMK_ARN --app your-app-name
暗号化鍵を使用して Heroku Postgres データベースを別のデータベースに移行する
既存の Heroku Postgres データベースがある場合は、暗号化鍵を使用してデータを移行することによってフォロワーデータベースを作成できます。
$ heroku addons:create heroku-postgresql:private-7 \
--follow HEROKU_POSTGRES_LEADER_COLOR \
--encryption-key CMK_ARN \
--app your-app-name
フォロワーが作成され、リーダーに追いついたら、そのフォロワーをプロモートできます。
$ heroku maintenance:on
$ heroku pg:promote HEROKU_POSTGRESQL_FOLLOWER_COLOR
# WARNING! unfollowing is not reversible and will allow writes to FOLLOWER_COLOR
$ heroku pg:unfollow HEROKU_POSTGRESQL_FOLLOWER_COLOR
$ heroku maintenance:off
データベースのプロモーションに関するより詳細な情報は、「Upgrading Heroku Postgres」(Heroku Postgres のアップグレード) の記事で参照できます。
暗号化鍵の無効化
暗号化鍵のライフサイクルの一部として、この鍵を無効にすることが必要になる場合があります。このアクションを実行しているときは、その鍵で暗号化されたすべてのデータがアクセス不可能になります。
暗号化鍵を無効にすると、その鍵を使用しているすべてのサービスとサーバーのシャットダウンがトリガーされます。このアクションを実行する場合は、細心の注意を払ってください。このアクションを実行するときは、Heroku サポートに通知して調整することをお勧めします。
暗号化鍵は、AWS Web コンソールまたは AWS CLI を使用して無効にすることができます。
$ aws kms disable-key --key-id CMK_ARN
当社で鍵の無効化の通知を受信した後、アクションが実行されるまでに 10 分の待機期間が発生します。これは、鍵の状態の誤った変更によって、その鍵に依存しているリソースが不必要に変更されることがないようにするためです。
10 分の待機期間が経過したら、その暗号化鍵を使用しているすべてのサービスをシャットダウンします。次に、それらのサービスを実行しているすべてのサーバーを停止します。最後に、無効にしたアクションを通知するメール通知をアプリケーション管理者に送信します。
鍵の無効化からサービスのシャットダウンまでに約 20 分かかることを見込んでおいてください。
暗号化鍵の有効化
暗号化鍵を使用して暗号化されたデータへのアクセスを回復する必要がある場合は、その鍵を有効にして復元することができます。暗号化鍵は、AWS Web コンソールまたは AWS CLI を使用して有効にすることができます。
$ aws kms enable-key --key-id CMK_ARN
当社で鍵の有効化の通知を受信したら、以前に停止されたサーバーを起動します。サーバーが動作を開始したら、影響を受けるサービスを起動します。最後に、有効にしたアクションを通知するメール通知をアプリケーション管理者に送信します。
鍵の有効化からサービスの再起動までに約 5 分かかることを見込んでおいてください。
制限
顧客の暗号化鍵を使用して暗号化されたデータベースに適用される制限があります。
- データベースは Private または Shield Space 内に存在する必要があります。
- フォロワーとフォークは、そのリーダーと同じ暗号化鍵を使用する必要があります。
- PGBackups は機能しません。これには、
heroku pg:backups
またはheroku pg:copy
CLI コマンドの使用が含まれます。 - マルチリージョンキーはサポートされません。
セキュリティのために、顧客が指定する鍵の使用から Heroku で管理される鍵のライフサイクルに自動的に移行する方法は存在しません。1 つ以上のデータサービスでこの機能の使用を停止したい場合は、Heroku サポートに連絡してください。