3月よりカスタマーサクセス部に異動しました山﨑です。
今回はクロスアカウントでSecrets Managerのシークレットを取得する方法について整理したいと思います
想定するユースケース
- 複数のAWSアカウントを運用している中規模 / 大規模な組織
- セキュリティチームが各種シークレット情報を特定のAWSアカウントで一元管理
- 各部門はセキュリティチームが管理するAWSアカウントからシークレット情報を取得してアプリケーション内で処理を実行
今回の構成
- アカウントA上で稼働しているEC2インスタンス(サーバーA)が管理アカウントのSecrets Managerにアクセスし、アカウントBのシークレット情報を取得する
- 管理アカウントのSecrets Managerで保管しているシークレット情報は、同一アカウント上に作成したKMS(CMK)で暗号化した状態で保管されている
各AWSアカウントで必要となる作業
アカウントA
IAM
EC2インスタンス(サーバーA)に関連付けるIAMロール(IAM Instance Profile)を作成します。なお、IAMポリシーには以下のポリシーが必要となります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetSecretValue", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "管理アカウントのSecrets ManagerのARN" ] }, { "Sid": "AllowKMSDecrypt", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "管理アカウントのCMKのARN" ] } ] }
管理アカウント
Secrets Manager
アカウントAにあるIAMロール(IAM Instance Profile)からのアクセスを許可しておきます。
{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "AWS" : [ "アカウントAのIAM Instance ProfileのARN" ] }, "Action" : "secretsmanager:GetSecretValue", "Resource" : "*" } ] }
KMS
アカウントAにあるIAMロール(IAM Instance Profile)からのアクセスを許可しておきます。
{ "Version": "2012-10-17", "Id": "keypolicy", "Statement": [ { "Sid": "AllowUseOfTheKey", "Effect": "Allow", "Principal": { "AWS": [ "アカウントAのIAM Instance ProfileのARN", ] }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "secretsmanager.ap-northeast-1.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:SecretARN": "シークレットを暗号化しているCMKのARN" } } } ] }
アカウントAから管理アカウントのシークレットを取得する
aws secretsmanager get-secret-value \ --secret-id 管理アカウントのSecrets ManagerのARN \ --region ap-northeast-1
アカウントAのEC2インスタンス(サーバーA)から上記のAWS CLIを実行すると、以下の処理が走ってシークレットを取得できるようになります。
- アカウントAのIAM Instance Profileが、サーバーAに「sts:AssumeRole」を許可
- IAM Instance Profile で許可された操作のうち、「secretsmanager:GetSecretValue」を実行する
- 管理アカウントのSecrets Managerは、サーバーAからの「secretsmanager:GetSecretValue」を許可しているためリクエストを受け入れる
- シークレットはCMKを使って暗号化されているため、サーバーAは「kms:Decrypt」操作で復号化しようと試みる
- 管理アカウントのKMSは、サーバーAからの「kms:Decrypt」を許可しているためリクエストを受け入れる
- 上記一連の処理が実行されることで、サーバーAはシークレット情報を取得する
まとめ
クロスアカウントでの処理実行に際しては、以下の点を意識することが大切だと分かりました。
- アクセス元リソース
- アクセス先リソースへ、正しい操作権限を許可しているかどうか
- アクセス先リソース
- アクセス元リソースからの、正しい操作権限を許可しているかどうか
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors