継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

クロスアカウントでの IAM Access Analizer を実行して Administrator の操作から IAM ポリシーを生成する

タダです.

IAM Identity Center で Administrator アクセスを使うことがあると思います.しかし,組織の拡大がしてくると全員に Administrator アクセスを振ったりせず適切な権限調整を行う必要が出てきます.自分もそういった調整を行う必要が出てきた時に IAM Access Analizer を使ってみました.IAM Access Analizer の特徴は CloudTrail ログから IAM エンティティが使ってるアクションを抽出してくれるため今回のケースに当てはまるだろうと思いやってみたのでこの記事にまとめます.

IAM Access Analyzer は AWS CloudTrail ログを分析して、IAM エンティティ (ユーザーまたはロール) が使用しているアクションとサービスを特定します。次に、そのアクセスアクティビティに基づく IAM ポリシーを生成します。生成されたポリシーを使用して、エンティティのアクセス許可を IAM ユーザーまたはロールにアタッチすることで、そのエンティティのアクセス許可を絞り込むことができます。

docs.aws.amazon.com

この記事における AWS アカウントについて

IAM Access Identity を使うにあたって今回の実行環境を記載します.まず,CloudTrail は AWS Organizations でメンバーアカウントに全てで設定し,ログ用アカウントに集約するような設定をしていたとします.IAM Access Analizer の実行環境は開発アカウントになります.つまり,IAM Access Analizer を使って CloudTrail ログにアクセスするにはクロスアカウントアクセスが発生します.

登場する AWS アカウントについて

  • マスターアカウント: AWS Organizations の親アカウント
  • ログ用アカウント: CloudTrailのログなど他にもログを集約するアカウント
  • 開発アカウント: IAM Access Analizer の実行アカウント

aws.amazon.com

IAM Access Analizer の実行

事前準備

IAM Access Analizer の実行準備としてドキュメントに則り各種設定を行います.

CloudTrail のバケットポリシーと KMS ポリシーを更新する

まず,CloudTrail のバケットポリシーともしバケットの暗号化を有効化していれば,KMS ポリシーを更新します.S3 バケットポリシーはドキュメントに誤りがありますので,実際のパスを反映してください.また,オブジェクトの所有権が バケット所有者の強制 になっているかを確認しておきます.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PolicyGenerationBucketPolicy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/AWSLogs/organization-id/[アカウント番号]/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "organization-id"
        },
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::[アカウント番号]:role/service-role/AccessAnalyzerMonitorServiceRole*"
        }
      }
    }
  ]
}

もう1つ KMS ポリシーです.ここで注意すべきは S3 オブジェクトの暗号化されている鍵のポリシーを更新しないといけないということです.そんなこと当たり前だろってお話なんですが,自分が遭遇したケースでは S3 のバケット暗号化キーとオブジェクトの暗号化キーが異なっているパターンでした.バケットの暗号化キーポリシーを更新しても IAM Access Analizer でポリシー生成はできません.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:EncryptionContext:aws:cloudtrail:arn": "[CloudTrail のログをまとめて設定しているマスターアカウントの CloudTrail ARN ]",
          "aws:PrincipalOrgID": "organization-id"
        },
        "StringLike": {
          "kms:ViaService": "s3.*.amazonaws.com",
          "aws:PrincipalArn": "arn:aws:iam::[アカウント番号]:role/service-role/AccessAnalyzerMonitorServiceRole*"
        }
      }
    }
  ]
}

IAM Access Analizer の実行

準備が終わり,IAM Access Analizer を実行していきます.Administrator ロールのページで Generate policy から実行していきます.自動で生成された IAM Access Analizer のポリシーを S3 と KMS の箇所を更新します.イメージとしては下記のポリシーのような感じです.このポリシーができたら IAM ポリシーの生成ができるはずです.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "cloudtrail:GetTrail",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GenerateServiceLastAccessedDetails",
                "iam:GetServiceLastAccessedDetails"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "[S3 オブジェクトの暗号化で使われている KMS キー ARN]"
            ],
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.*.amazonaws.com"
                }
            }
        }
    ]
}

実行時の注意点

IAM Access Analizer には制限があります.ポリシーの生成時に何日前のログを遡っていくかを指定するのですが,特に以下の制約は引っかかることが多いため注意です.この制約の調べ方はこちらの記事を参考にして調べると効率的です.

  • ポリシー生成で走査できるCloudTrailのオブジェクトは10万オブジェクトまで
  • ポリシー生成で走査できるデータ量は25GB以下まで

docs.aws.amazon.com

まとめ

クロスアカウントでの IAM Access Analizer でポリシー生成で行ったことをまとめました.