AWS アカウント間で AWS Secrets Manager のシークレットを共有するにはどうすればよいですか?
AWS Secrets Manager のシークレットを別の AWS アカウントと共有したいと考えています。これを行うにはどうすればよいですか?
簡単な説明
この例では、Security_Account ユーザーがアカウント A の認証情報を管理し、Dev_Account ユーザーはアカウント B の開発者が 使用します。AWS Identity and Access Management (IAM) ユーザー、または Amazon Elastic Compute Cloud (Amazon EC2) で実行されているアプリケーション Dev_Account のインスタンスが、Security_Account ユーザーアカウントのシークレットを取得します。シークレットに [resource-based policy] (リソースベースのポリシー) を使用できます。これにより、許可ポリシーをシークレットにアタッチできます。このポリシーを使って、Dev_Account の IAM エンティティが Security_Account のシークレットにアクセスできます。
Security_Account (アカウント A) の [DevSecret] というシークレットは、AWS Key Management Service (AWS KMS) キー DevSecretKMS を使用して暗号化されます。その後、シークレットが Dev_Account (アカウント B) に共有されます。
注: アカウントに AWS KMS のデフォルトキーを使用することはできません。AWS KMS のデフォルトキーは、AWS Key Management Service で実行される AWS のサービスによって作成、管理、使用されます。AWS KMS のデフォルトキーは、AWS アカウントと AWS リージョンに対して一意です。AWS マネージドキーを使用できるのは、そのキーを作成したサービスのみです。詳細については、「AWS KMS keys」を参照してください。
解決方法
シークレットのある次のリージョンの Security_Account (アカウント A) で次のステップに従います。
1. シークレットがない場合は、「シークレットの作成」の手順に従ってください。シークレットの AWS KMS キー ID パラメーターで Amazon リソースネーム (ARN) を必ず指定してください。
2. エイリアスを使用した既存のシークレットがある場合は、「シークレットの変更」の手順に従ってください。シークレットの AWS KMS キー ID パラメータで [AWS KMS キー ARN] を必ず指定してください。
注: 別の AWS アカウントからシークレットにアクセスするには、完全な AWS KMS キー ARN を使用する必要があります。
3. AWS KMS キーのキーポリシーでアクセス許可を付与します。シークレットマネージャーは、デフォルトでシークレットを暗号化します。これらのシークレットを取得するアイデンティティには、復号化を行うためのアクセス権が必要です。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_Account (アカウント B) の SecretsUser に、Security_Account (アカウント A) で DevSecretKMS を使用する権限を付与します。このポリシーは、SecretsUser に DevSecretKMS で decrypt および describe-key コマンドを使用する機能も付与します。
4. シークレットにアクセスするための許可を IAM エンティティに付与します。Security_Account から、DevSecret を取得するための許可を SecretsUser に付与するリソースベースのポリシーをアタッチします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Dev_Account:user/SecretsUser" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }
Dev_Account (アカウント B) で次のステップに従います。
1. シークレットを取得する IAM アイデンティティにアクセス許可をアタッチします。次のようなポリシーを使用します。
注: リージョンを 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" ] } ] }
Dev_Account の IAM ユーザー SecretsUser がシークレットを取得するには、SecretsUser に [secretsmanager:GetSecretValue] へのアクセス許可が必要です。DevSecret は DevSecretKey を使って暗号化されるため、SecretsUser には AWS [decrypt] (復号化) 権限が必要です。
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 エンティティにアタッチされたアクセス許可を編集します。
関連情報
How to access secrets across AWS accounts by attaching resource-based policies (リソースベースのポリシーをアタッチして、AWS アカウント間でシークレットにアクセスする方法)
暗号化された AWS Secrets Manager シークレットへのアクセス時に発生する問題を解決するにはどうすればよいですか?

関連するコンテンツ
- 質問済み 3年前lg...
- 質問済み 4ヶ月前lg...
- 質問済み 6年前lg...
- AWS公式更新しました 6ヶ月前