クロスアカウントでSecrets Managerのシークレットを取得する

記事タイトルとURLをコピーする

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