暗号化された AWS Secrets Manager シークレットの取得またはアクセスを試みたところ、AWS Key Management Service (AWS KMS) キーアクセスエラーが発生しました。
解決策
AWS KMS キーでのアクセス許可の問題が原因で、Secrets Manager シークレットを取得できないかアクセスできない場合、次のいずれかのエラーが発生する場合があります。
- 「シークレットをデフォルトの KMS サービスキーで暗号化すると、別の AWS アカウントからシークレットにアクセスすることはできません」
- 「KMS へのアクセスは許可されていません」
- 「InternalFailure」
- 「不明なエラーが発生しました」
- 「KMS へのアクセスは許可されていません。このバージョンのシークレットは、現在の KMS キーで暗号化されていません」
この問題を解決するには、暗号化されたシークレットを取得するための適切なアクセス許可で AWS KMS キーポリシーを更新します。次に、更新された AWS KMS キーを使用してシークレットを再度暗号化します。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS KMS マネージドキー
別のアカウントのシークレットにアクセスするために、シークレットが AWS KMS マネージドキーで暗号化されていないことを確認します。AWS KMS マネージドキーで暗号化されたシークレットに別のアカウントからアクセスすることはできません。
これらは読み取り専用であるため、AWS マネージドキーのポリシーを編集することはできません。したがって、AWS マネージドキーポリシーにクロスアカウントアクセス許可を付与することはできません。
クロスアカウントアクセス
クロスアカウントの場合は、ID ベースのポリシーとリソースベースのポリシーで、プリンシパルに AWS KMS キーへのアクセスが明示的に許可されていることを確認します。
プリンシパルに AWS KMS キーへのアクセスを許可する ID ポリシーの例を次に示します。
{ "Version": "2012-10-17", "Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:Region:AccountID:key/EncryptionKey"
}
]
}
プリンシパルに AWS KMS キーへのアクセスを許可する 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 キーでシークレットを再暗号化する
Secrets Manager コンソールまたは AWS CLI を使用して、更新された AWS KMS キーでシークレットを再度暗号化します。
Secrets Manager コンソール
注: Secrets Manager コンソールを使用する場合、Secrets Manager がシークレットの新しいバージョンを作成し、更新されたキーで暗号化します。シークレットを使用するアプリケーションには、更新されたキーでシークレットを復号化するためのアクセス許可が必要です。詳細については、「Secrets Manager でシークレットを暗号化および復号する」を参照してください。
- Secrets Manager コンソールを開きます。
- [シークレットの名前] で、シークレットを選択します。
- [アクション] を選択し、[暗号化キーの編集] を選択します。
- [新しい暗号化キーで新しいバージョンのシークレットを作成] を選択し、[保存] を選択します。
AWS CLI
シークレットがあるソースアカウントから手順 1 ~ 3 を実行し、もう一方のアカウントから手順 4 を実行します。
-
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"}
-
creds.txt という名前のファイルを作成します。
cat creds.txt {"CrossAccount":"DefaultEncryption"}
-
update-secret コマンドを実行して暗号化キーを再度暗号化します。
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"
}
注: カスタマーマネージドキーを使用する場合は、そのキーに対する kms:GenerateDataKey および kms:Decrypt アクセス許可も必要です。
-
もう一方のアカウントから 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"}
関連情報
How to use resource-based policies in the AWS Secrets Manager console to securely access secrets across AWS accounts
AWS Secrets Manager のシークレットを AWS アカウント間で共有する方法を教えてください
別のアカウントから AWS Secrets Manager のシークレットにアクセスする