暗号化された AWS Secrets Manager シークレットへのアクセス時に発生する問題を解決するにはどうすればよいですか?
最終更新日: 2022 年 9 月 23 日
AWS Secrets Manager シークレットを取得またはアクセスしようとしたときに、次のいずれかのようなエラーが表示されました。
- 「デフォルトの KMS サービスキーでシークレットを暗号化すると、別の AWS アカウントからシークレットにアクセスすることはできません。」
- 「KMS へのアクセスは許可されていません」、 「InternalFailure」、または「不明なエラーが発生しました」
- 「KMS へのアクセスは許可されていません」このバージョンのシークレットは、現在の KMS キーでは暗号化されません。
解決方法
注意: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
別のアカウントのシークレットにアクセスするときに、AWS KMS マネージドキーでシークレットが暗号化されていないことを確認します。
AWS マネージドキーポリシーは、読み取り専用のため編集できません。ただし、AWS Key Management Service (AWS KMS) マネージドキーポリシーとカスタマーマネージドキーポリシーを表示することはできます。AWS KMS マネージドキーポリシーは編集できないため、これらのキーポリシーにクロスアカウントアクセス許可を付与できません。AWS KMS マネージドキーを使用して暗号化された Secrets Manager シークレットに、他の AWS アカウントからはアクセスできません。
クロスアカウントの場合、ID ベースのポリシーとリソースベースのポリシーで、プリンシパルに AWS KMS キーへのアクセスが許可されていることを確認します。
ID ポリシーでは、次のように AWS KMS キーへのアクセスをプリンシパルに許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:Region:AccountID:key/EncryptionKey"
}
]
}
リソースベースのポリシーでは、次のように AWS KMS キーへのアクセスをプリンシパルに許可します。
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::AccountID:user/UserName",
"arn:aws:iam::AccountID:role/RoleName"
]
},
"Action": [
"kms:Decrypt",
"kms:DescribeKey"
],
"Resource": "*"
}
AWS KMS キーを更新したら、シークレットが新しい AWS KMS キーで暗号化されていることを確認します。
AWS CLI を使用して Secrets Manager シークレットに関連付けられた AWS KMS キーを更新しても、現在または以前のバージョンのシークレットは新しい KMS キーで再暗号化されません。つまり、外部アカウント (クロスアカウントとも呼ばれます) は、シークレットが新しい AWS KMS キーで再暗号化されていないので、シークレットにアクセスできません。クロスアカウントからシークレット値を取得するには、新しい AWS KMS キーを使用してシークレットを再暗号化する必要があります。
注意: Secrets Manager コンソールを使用してデフォルトでシークレットに関連付けられた AWS KMS キーを変更すると、シークレットの新しいバージョンが作成され、新しい AWS KMS キーで暗号化されます。詳細については、「シークレット暗号化と復号」を参照してください。
新しい AWS KMS キーでシークレットを再暗号化します。
AWS マネジメントコンソールまたは AWS CLI を使用して、新しい AWS KMS キーでシークレットを再暗号化するには、次の手順に従います。
AWS マネジメントコンソール
1. Secrets Manager コンソールを開きます。
2. [Secret name] で、シークレットを選択します。
3. [Actions] (アクション) を選択し、ドロップダウンリストを選択して AWS KMS キーを選択し、[Create new version of secret with new encryption key] (新しい暗号化キーを使用してシークレットの新しいバージョンを作成する) チェックボックスを選択し、[Save] (保存) を選択します。
AWS CLI
シークレットが存在するソースアカウントから以下の手順を実行します。
1. 以下のような AWS CLI コマンド get-secret-value を実行します。
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --query SecretString --output text
{"CrossAccount":"DefaultEncryption"}
2. creds.txt という名前のファイルを作成します。
$ cat creds.txt
{"CrossAccount":"DefaultEncryption"}
3. AWS CLI の update-secret コマンドを実行して、次のような暗号化キーを再暗号化します。
. 注: カスタマーマネージドキーを使用する場合は、キーに対する kms: GenerateDataKey と kms: Decrypt アクセス許可も必要です。
$ aws secretsmanager update-secret --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --secret-string file://creds.txt
{
"ARN": "arn:aws:secretsmanager:us-east-1:123456789012:cross-account",
"Name": "cross-account",
"VersionId": "f68246e8-1cfb-4c3b-952b-17c9298d3462"
}
4. クロスアカウントから AWS CLI コマンド get-secret-value を次のように実行します。
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --version-stage AWSCURRENT --profile
{"CrossAccount":"DefaultEncryption"}