AWS Secrets Manager のシークレットを別の AWS アカウントと共有したいです。
簡単な説明
この例では、Security_Account ユーザーはアカウント A で認証情報を管理し、Dev_Account user ユーザーはアカウント B の開発者が使用します。AWS ID およびアクセス管理 (IAM) ユーザーまたはアプリケーションは、Dev_Account の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで実行されます。このユーザーまたはアプリケーションは、Security_Account ユーザーアカウントのシークレットを取得します。
シークレットにアクセス権限ポリシーをアタッチできるようにするリソースベースのポリシーをシークレットに使用します。このポリシーを使用して、Dev_Account の IAM エンティティが Security_Account のシークレットにアクセスできるようにします。
Security_Account (アカウント A) の DevSecret という名前のシークレットは、AWS キー管理サービス (AWS KMS) キー DevSecretKMS で暗号化されます。次に、シークレットは Dev_Account (アカウント B) と共有されます。
**注:**アカウントの AWS KMS デフォルトキーは使用できません。AWS KMS デフォルトキーは、AWS キー管理サービス上で実行される AWS サービスによって、お客様に代わって作成、管理、使用されます。AWS KMS のデフォルトキーは、AWS アカウントと AWS リージョンに固有です。AWS マネージドキーを作成したサービスのみが使用できます。詳細については、「AWS KMS キーポリシー」を参照してください。
解決策
Security_Account (アカウント A)
シークレットがあるリージョンの Security_Account (アカウント A) で以下の手順を実行します。
1. シークレットがない場合は、指示に従ってシークレットを作成してください。シークレットの AWS KMS キー ID パラメータにAmazon リソースネーム (ARN) を指定します。
2. エイリアスを使用する既存のシークレットがある場合は、指示に従ってシークレットを変更します。シークレットの AWS KMS キー ID パラメータに AWS KMS キー ARN を指定します。
注: 別の AWS アカウントからシークレットにアクセスするには、完全な AWS KMS キー ARN を使用する必要があります。
3. AWS KMS キーのキーポリシーでアクセス権限を付与します。シークレットマネージャーはデフォルトでシークレットを暗号化します。これらのシークレットを取得する ID には、それらを復号化するためのアクセス権が必要です。DevSecret は DevSecretKMS で暗号化されているため、キーポリシーを変更する必要があります。これを行うには、次の権限を追加します
**注:**リージョンを自分の AWS リージョンに置き換えてください。
{ "Sid": "AllowUseOfTheKey",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"
},
"Action": [
"kms:Decrypt"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.your-region.amazonaws.com"
},
"StringLike": {
"kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
}
}
}
このポリシーは、Dev_アカウント (アカウント B) の SecretsUser に、Security_Account (アカウント A) の DevSecretKMS を使用する権限を付与します。
4. IAM エンティティにシークレットへのアクセス権限を許可します。Security_Account から、SecretsUser に DevSecret を取得する権限を付与するリソースベースのポリシーをアタッチします。
注: プリンシパル ARN を IAM ユーザーまたはロールの ARN に置き換えます。
{ "Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"
},
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}
]
Dev_Account (アカウント B) の設定
Dev_Account (アカウント B) で以下の手順を実行します。
1. シークレットを取得したい IAM ID にアクセス権限をアタッチします。以下のようなポリシーを使用してください。
**注:**リージョンを自分の AWS リージョンに置き換えてください。
{ "Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetSecretValue",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
]
},
{
"Sid": "AllowKMSDecrypt",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"arn:aws:kms:your-region:Security_Account:key/DevSecretKMS_id"
]
}
]
}
シークレットを取得するには、SecretsUser が Dev_Account の IAM ユーザー SecretsUser の secretsmanager:GetSecretValue に対する権限を持っている必要があります。DevSecret は DevSecretKey で暗号化されているため、SecretsUser には AWS の復号化権限が必要です。
2. 以下のように、シークレットを SecretsUser として取得します。
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret --version-stage AWSCURRENT --region your-region
注: 自分のリージョン をシークレットが存在する AWS リージョンに置き換えます。
すべての IAM エンティティにこれらの手順を使用してください。たとえば、Amazon EC2 インスタンスプロファイルまたはロールの場合、リソースポリシーの ARN を置き換えたり追加したりします。次に、IAM エンティティにアタッチされている権限を編集します。
関連情報
リソースベースのポリシーをアタッチして AWS アカウント全体のシークレットにアクセスする方法
暗号化された AWS Secrets Manager シークレットへのアクセスに関する問題を解決するにはどうすればいいですか?
別のアカウントのユーザーに対する AWS Secrets Manager シークレットへの権限