kakakakakku blog

Weekly Tech Blog: Keep Learning!

2027年4月26日から変わる CloudWatch Logs の IAM ポリシーの評価方法を CloudWatch Logs IAM Policy Validator で確認する

はじめに

個人の検証環境として使ってる AWS アカウントに AWS Health から「AWS CLOUDWATCH PLANNED LIFECYCLE EVENT」という AWS Health Event が来ていた.簡単に言うと「2027年4月26日から Amazon CloudWatch Logs の IAM ポリシーの評価方法が変わるから事前に対応よろしく!」という内容だった.

Starting April 26, 2027, IAM statements that authorize Log Group actions must use a Log Group ARN. Today, a Log Stream ARN also grants these Log Group-level actions - after this change, it will not.

今までは arn:aws:logs:ap-northeast-1:000000000000:log-group:xxxxx:* のように末尾に :* が付いたログストリーム形式の ARN を指定すればロググループに対するアクションも許可できていた.実際に AWS の API Reference でも :* を付けるようなアナウンスがあって該当するチームも多そう.今後はロググループに対するアクションには :* が付かないロググループ形式の ARN を指定する必要がある.

  • arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>(ロググループ形式)
  • arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:*(ログストリーム形式)

docs.aws.amazon.com

修正方法

AWS Health Event を読むと,以下の4つのアクションは今後もログストリーム形式の ARN で評価されると書いてあった.変更なし✅️

  • logs:PutLogEvents
  • logs:GetLogEvents
  • logs:CreateLogStream
  • logs:DeleteLogStream

Four actions remain scoped to Log Streams and still require a Log Stream ARN: PutLogEvents, GetLogEvents, CreateLogStream, and DeleteLogStream.

よって,影響があるのは「ロググループに対するそれ以外のアクション」になる🔥たとえば以下など.

  • logs:CreateLogGroup
  • logs:DeleteLogGroup
  • logs:DescribeLogStreams
  • logs:PutRetentionPolicy

修正方法としては,既存のステートメントはそのまま残しつつ「ロググループ形式の ARN を指定したステートメントを追加する」ことになる.

Keep the existing Log Stream ARN statement in place. It's still needed for the four Log Stream actions and ensures uninterrupted access as this change rolls out region by region.

CloudWatch Logs IAM Policy Validator

影響のある IAM ポリシーを確認するためのツール「CloudWatch Logs IAM Policy Validator」も aws-samples に公開されている❗️今回の仕様変更に影響のある IAM ポリシーを洗い出すコマンドと IAM ポリシーの評価結果をシミュレートする Python スクリプトがある.今回使ってみた \( 'ω')/

github.com

検証で使う IAM Role

検証をするために Terraform で Amazon ECS タスクロールを想定した IAM Role を作る.Amazon CloudWatch Logs ロググループとログストリームに対するアクションを混ぜて :* 付きの ARN で許可をするインラインポリシーにしておく.

data "aws_caller_identity" "current" {}

data "aws_iam_policy_document" "sandbox_assume_role" {
  statement {
    actions = [
      "sts:AssumeRole",
    ]

    principals {
      type = "Service"
      identifiers = [
        "ecs-tasks.amazonaws.com",
      ]
    }
  }
}

data "aws_iam_policy_document" "sandbox" {
  statement {
    actions = [
      "logs:CreateLogGroup",
      "logs:PutRetentionPolicy",
      "logs:DescribeLogStreams",
      "logs:CreateLogStream",
      "logs:PutLogEvents",
    ]
    resources = [
      "arn:aws:logs:ap-northeast-1:${data.aws_caller_identity.current.account_id}:log-group:sandbox-log-group:*",
    ]
  }
}

resource "aws_iam_role" "sandbox" {
  name               = "sandbox-role"
  assume_role_policy = data.aws_iam_policy_document.sandbox_assume_role.json
}

resource "aws_iam_role_policy" "sandbox" {
  name   = "sandbox-policy"
  role   = aws_iam_role.sandbox.id
  policy = data.aws_iam_policy_document.sandbox.json
}

影響のある IAM ポリシーを洗い出す

まずは LIST_IMPACTED_POLICIES.md に載っているコマンドを実行する.aws iam get-account-authorization-details コマンドの結果を jq コマンド(複雑すぎるw)で処理して,:* や :log-stream: が含まれる ARN を指定しているカスタマー管理ポリシー・インラインポリシーを一覧できる.

github.com

実行結果は一部抜粋したけど,今回の検証で作った IAM Role sandbox-role のインラインポリシーはちゃんと検出されていた👌他にも AWS Lambda イベント関数の service-role や AWS CodeBuild の service-role でも検出されていた.

$ aws iam get-account-authorization-details \
  --filter LocalManagedPolicy Role User Group \
  --output json | jq -r '
  def arr: if type=="array" then . else [.] end;
  def old: test("^arn:aws[a-z0-9-]*:logs:[^:]*:[^:]*:log-group:.*(:\\*$|:log-stream:)");

  # Scan one policy document, emitting indented "<Effect>\t<Field>\t<Arn>" lines.
  def scan:
    (.Statement|arr)[] | .Effect as $e
    | ("Resource","NotResource") as $f
    | (.[$f]//empty|arr)[]
    | select(type=="string" and old)
    | "    \($e // "Unknown")\t\($f)\t\(.)";

  # Print header then hits, only if the doc has any.
  def report($hdr; doc): [doc|scan] | select(length>0) | ($hdr, .[]);

  ( .Policies[]
    | report("MANAGED  \(.Arn)";
        (.PolicyVersionList[]|select(.IsDefaultVersion)|.Document)) ),
  ( .UserDetailList[]  | .Arn as $a | .UserPolicyList[]?
    | report("INLINE   \($a) [\(.PolicyName)]"; .PolicyDocument) ),
  ( .GroupDetailList[] | .Arn as $a | .GroupPolicyList[]?
    | report("INLINE   \($a) [\(.PolicyName)]"; .PolicyDocument) ),
  ( .RoleDetailList[]  | .Arn as $a | .RolePolicyList[]?
    | report("INLINE   \($a) [\(.PolicyName)]"; .PolicyDocument) )
'
MANAGED  arn:aws:iam::000000000000:policy/service-role/AWSLambdaBasicExecutionRole-8ca2a1c1-379d-4fd7-a717-96ac3ca200b2
    Allow       Resource        arn:aws:logs:ap-northeast-1:000000000000:log-group:/aws/lambda/xxxxx:*
MANAGED  arn:aws:iam::000000000000:policy/service-role/CodeBuildBasePolicy-sandbox-cdk-codebuild-role-ap-northeast-1
    Allow       Resource        arn:aws:logs:ap-northeast-1:000000000000:log-group:/aws/codebuild/sandbox:*
INLINE   arn:aws:iam::000000000000:role/sandbox-cdk-codebuild-role [SandboxCdkCodeBuildRoleDefaultPolicy75732249]
    Allow       Resource        arn:aws:logs:ap-northeast-1:000000000000:log-group:/aws/codebuild/sandbox:*
INLINE   arn:aws:iam::000000000000:role/sandbox-role [sandbox-policy]
    Allow       Resource        arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group:*

評価結果を確認する: Before

次に simulate_cloudwatch_logs_policy.py を使って,IAM ポリシーの評価方法を確認する.内部的には IAM の SimulateCustomPolicy API を使っている.

github.com

まずは aws iam get-role-policy コマンドでインラインポリシーを JSON ファイルに書き出しておく.

$ aws iam get-role-policy \
  --role-name sandbox-role \
  --policy-name sandbox-policy \
  --query PolicyDocument \
  --output json > policy.json

以下のようになった.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:PutRetentionPolicy",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group:*"
        }
    ]
}

そして simulate_cloudwatch_logs_policy.py を実行する.合計132個のアクションがログストリーム形式の ARN(LogStream 列)とロググループ形式の ARN(LogGroup 列)に対して評価される.

$ python3 simulate_cloudwatch_logs_policy.py policy.json sandbox-log-group --region ap-northeast-1
LogStream ARN: arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group:log-stream:*
LogGroup  ARN: arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group
Actions simulated: 132

Action                                         LogStream     LogGroup
---------------------------------------------  ------------  ------------
logs:AssociateKmsKey                           implicitDeny  implicitDeny
logs:AssociateSourceToS3TableIntegration       implicitDeny  implicitDeny
logs:CallWithBearerToken                       implicitDeny  implicitDeny
logs:CancelExportTask                          implicitDeny  implicitDeny
logs:CancelImportTask                          implicitDeny  implicitDeny
logs:CreateDelivery                            implicitDeny  implicitDeny
logs:CreateExportTask                          implicitDeny  implicitDeny
logs:CreateImportTask                          implicitDeny  implicitDeny
logs:CreateLogAnomalyDetector                  implicitDeny  implicitDeny
logs:CreateLogDelivery                         implicitDeny  implicitDeny
logs:CreateLogGroup                            allowed       implicitDeny
logs:CreateLogStream                           allowed       implicitDeny
logs:CreateLookupTable                         implicitDeny  implicitDeny
logs:CreateScheduledQuery                      implicitDeny  implicitDeny
logs:DeleteAccountPolicy                       implicitDeny  implicitDeny
logs:DeleteDataProtectionPolicy                implicitDeny  implicitDeny
logs:DeleteDelivery                            implicitDeny  implicitDeny
logs:DeleteDeliveryDestination                 implicitDeny  implicitDeny
logs:DeleteDeliveryDestinationPolicy           implicitDeny  implicitDeny
logs:DeleteDeliverySource                      implicitDeny  implicitDeny
logs:DeleteDestination                         implicitDeny  implicitDeny
logs:DeleteIndexPolicy                         implicitDeny  implicitDeny
logs:DeleteIntegration                         implicitDeny  implicitDeny
logs:DeleteLogAnomalyDetector                  implicitDeny  implicitDeny
logs:DeleteLogDelivery                         implicitDeny  implicitDeny
logs:DeleteLogGroup                            implicitDeny  implicitDeny
logs:DeleteLogStream                           implicitDeny  implicitDeny
logs:DeleteLookupTable                         implicitDeny  implicitDeny
logs:DeleteMetricFilter                        implicitDeny  implicitDeny
logs:DeletePipelineRule                        implicitDeny  implicitDeny
logs:DeleteQueryDefinition                     implicitDeny  implicitDeny
logs:DeleteResourcePolicy                      implicitDeny  implicitDeny
logs:DeleteRetentionPolicy                     implicitDeny  implicitDeny
logs:DeleteScheduledQuery                      implicitDeny  implicitDeny
logs:DeleteSubscriptionFilter                  implicitDeny  implicitDeny
logs:DeleteSyslogConfiguration                 implicitDeny  implicitDeny
logs:DeleteTransformer                         implicitDeny  implicitDeny
logs:DescribeAccountPolicies                   implicitDeny  implicitDeny
logs:DescribeConfigurationTemplates            implicitDeny  implicitDeny
logs:DescribeDeliveries                        implicitDeny  implicitDeny
logs:DescribeDeliveryDestinations              implicitDeny  implicitDeny
logs:DescribeDeliverySources                   implicitDeny  implicitDeny
logs:DescribeDestinations                      implicitDeny  implicitDeny
logs:DescribeExportTasks                       implicitDeny  implicitDeny
logs:DescribeFieldIndexes                      implicitDeny  implicitDeny
logs:DescribeImportTaskBatches                 implicitDeny  implicitDeny
logs:DescribeImportTasks                       implicitDeny  implicitDeny
logs:DescribeIndexPolicies                     implicitDeny  implicitDeny
logs:DescribeLogGroups                         implicitDeny  implicitDeny
logs:DescribeLogStreams                        allowed       implicitDeny
logs:DescribeLookupTables                      implicitDeny  implicitDeny
logs:DescribeMetricFilters                     implicitDeny  implicitDeny
logs:DescribeQueries                           implicitDeny  implicitDeny
logs:DescribeQueryDefinitions                  implicitDeny  implicitDeny
logs:DescribeResourcePolicies                  implicitDeny  implicitDeny
logs:DescribeSubscriptionFilters               implicitDeny  implicitDeny
logs:DisassociateKmsKey                        implicitDeny  implicitDeny
logs:DisassociateSourceFromS3TableIntegration  implicitDeny  implicitDeny
logs:FilterLogEvents                           implicitDeny  implicitDeny
logs:GetDataProtectionPolicy                   implicitDeny  implicitDeny
logs:GetDelivery                               implicitDeny  implicitDeny
logs:GetDeliveryDestination                    implicitDeny  implicitDeny
logs:GetDeliveryDestinationPolicy              implicitDeny  implicitDeny
logs:GetDeliverySource                         implicitDeny  implicitDeny
logs:GetIntegration                            implicitDeny  implicitDeny
logs:GetLogAnomalyDetector                     implicitDeny  implicitDeny
logs:GetLogDelivery                            implicitDeny  implicitDeny
logs:GetLogEvents                              implicitDeny  implicitDeny
logs:GetLogFields                              implicitDeny  implicitDeny
logs:GetLogGroupFields                         implicitDeny  implicitDeny
logs:GetLogRecord                              implicitDeny  implicitDeny
logs:GetLookupTable                            implicitDeny  implicitDeny
logs:GetQueryResults                           implicitDeny  implicitDeny
logs:GetScheduledQuery                         implicitDeny  implicitDeny
logs:GetScheduledQueryHistory                  implicitDeny  implicitDeny
logs:GetStorageTierPolicy                      implicitDeny  implicitDeny
logs:GetTransformer                            implicitDeny  implicitDeny
logs:IntegrateWithS3Table                      implicitDeny  implicitDeny
logs:Link                                      implicitDeny  implicitDeny
logs:ListAggregateLogGroupSummaries            implicitDeny  implicitDeny
logs:ListAnomalies                             implicitDeny  implicitDeny
logs:ListEntitiesForLogGroup                   implicitDeny  implicitDeny
logs:ListIntegrations                          implicitDeny  implicitDeny
logs:ListLogAnomalyDetectors                   implicitDeny  implicitDeny
logs:ListLogDeliveries                         implicitDeny  implicitDeny
logs:ListLogGroups                             implicitDeny  implicitDeny
logs:ListLogGroupsForEntity                    implicitDeny  implicitDeny
logs:ListLogGroupsForQuery                     implicitDeny  implicitDeny
logs:ListScheduledQueries                      implicitDeny  implicitDeny
logs:ListSourcesForS3TableIntegration          implicitDeny  implicitDeny
logs:ListSyslogConfigurations                  implicitDeny  implicitDeny
logs:ListTagsForResource                       implicitDeny  implicitDeny
logs:ListTagsLogGroup                          implicitDeny  implicitDeny
logs:ProcessWithPipeline                       implicitDeny  implicitDeny
logs:PutAccountPolicy                          implicitDeny  implicitDeny
logs:PutBearerTokenAuthentication              implicitDeny  implicitDeny
logs:PutDataProtectionPolicy                   implicitDeny  implicitDeny
logs:PutDeliveryDestination                    implicitDeny  implicitDeny
logs:PutDeliveryDestinationPolicy              implicitDeny  implicitDeny
logs:PutDeliverySource                         implicitDeny  implicitDeny
logs:PutDestination                            implicitDeny  implicitDeny
logs:PutDestinationPolicy                      implicitDeny  implicitDeny
logs:PutIndexPolicy                            implicitDeny  implicitDeny
logs:PutIntegration                            implicitDeny  implicitDeny
logs:PutLogEvents                              allowed       implicitDeny
logs:PutLogGroupDeletionProtection             implicitDeny  implicitDeny
logs:PutMetricFilter                           implicitDeny  implicitDeny
logs:PutPipelineRule                           implicitDeny  implicitDeny
logs:PutQueryDefinition                        implicitDeny  implicitDeny
logs:PutResourcePolicy                         implicitDeny  implicitDeny
logs:PutRetentionPolicy                        allowed       implicitDeny
logs:PutStorageTierPolicy                      implicitDeny  implicitDeny
logs:PutSubscriptionFilter                     implicitDeny  implicitDeny
logs:PutSyslogConfiguration                    implicitDeny  implicitDeny
logs:PutTransformer                            implicitDeny  implicitDeny
logs:StartLiveTail                             implicitDeny  implicitDeny
logs:StartQuery                                implicitDeny  implicitDeny
logs:StopLiveTail                              implicitDeny  implicitDeny
logs:StopQuery                                 implicitDeny  implicitDeny
logs:TagLogGroup                               implicitDeny  implicitDeny
logs:TagResource                               implicitDeny  implicitDeny
logs:TestMetricFilter                          implicitDeny  implicitDeny
logs:TestTransformer                           implicitDeny  implicitDeny
logs:Unmask                                    implicitDeny  implicitDeny
logs:UntagLogGroup                             implicitDeny  implicitDeny
logs:UntagResource                             implicitDeny  implicitDeny
logs:UpdateAnomaly                             implicitDeny  implicitDeny
logs:UpdateDeliveryConfiguration               implicitDeny  implicitDeny
logs:UpdateLogAnomalyDetector                  implicitDeny  implicitDeny
logs:UpdateLogDelivery                         implicitDeny  implicitDeny
logs:UpdateLookupTable                         implicitDeny  implicitDeny
logs:UpdateScheduledQuery                      implicitDeny  implicitDeny

ポイントを抜粋すると,ロググループ形式の ARN を指定する必要がある logs:CreateLogGroup・logs:PutRetentionPolicy・logs:DescribeLogStreams の3つは2027年4月26日以降に implicitDeny(暗黙の拒否) になってしまう🔥

Action                                         LogStream     LogGroup
---------------------------------------------  ------------  ------------
logs:CreateLogGroup                            allowed       implicitDeny
logs:CreateLogStream                           allowed       implicitDeny
logs:DescribeLogStreams                        allowed       implicitDeny
logs:PutLogEvents                              allowed       implicitDeny
logs:PutRetentionPolicy                        allowed       implicitDeny

ちなみに logs:CreateLogStream と logs:PutLogEvents はログストリーム形式の ARN を指定すれば良いため問題ないと判断できる.アクションごとに期待される指定方法はドキュメントに載っている.

docs.aws.amazon.com

評価結果を確認する: After

今度はロググループ形式の ARN を指定したステートメントを追加する.既存のステートメントもそのまま残しておく👌

data "aws_iam_policy_document" "sandbox" {
  statement {
    actions = [
      "logs:CreateLogGroup",
      "logs:PutRetentionPolicy",
      "logs:DescribeLogStreams",
      "logs:CreateLogStream",
      "logs:PutLogEvents",
    ]
    resources = [
      "arn:aws:logs:ap-northeast-1:${data.aws_caller_identity.current.account_id}:log-group:sandbox-log-group:*",
    ]
  }

  statement {
    actions = [
      "logs:CreateLogGroup",
      "logs:PutRetentionPolicy",
      "logs:DescribeLogStreams",
    ]
    resources = [
      "arn:aws:logs:ap-northeast-1:${data.aws_caller_identity.current.account_id}:log-group:sandbox-log-group",
    ]
  }
}

もう一度 aws iam get-role-policy コマンドでインラインポリシーを JSON ファイルに書き出しておく.

$ aws iam get-role-policy \
  --role-name sandbox-role \
  --policy-name sandbox-policy \
  --query PolicyDocument \
  --output json > policy.json

以下のようになった.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:PutRetentionPolicy",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group:*"
        },
        {
            "Action": [
                "logs:PutRetentionPolicy",
                "logs:DescribeLogStreams",
                "logs:CreateLogGroup"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group"
        }
    ]
}

そして simulate_cloudwatch_logs_policy.py を実行する.

$ python3 simulate_cloudwatch_logs_policy.py policy.json sandbox-log-group --region ap-northeast-1
LogStream ARN: arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group:log-stream:*
LogGroup  ARN: arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-log-group
Actions simulated: 132

Action                                         LogStream     LogGroup
---------------------------------------------  ------------  ------------
logs:AssociateKmsKey                           implicitDeny  implicitDeny
logs:AssociateSourceToS3TableIntegration       implicitDeny  implicitDeny
logs:CallWithBearerToken                       implicitDeny  implicitDeny
logs:CancelExportTask                          implicitDeny  implicitDeny
logs:CancelImportTask                          implicitDeny  implicitDeny
logs:CreateDelivery                            implicitDeny  implicitDeny
logs:CreateExportTask                          implicitDeny  implicitDeny
logs:CreateImportTask                          implicitDeny  implicitDeny
logs:CreateLogAnomalyDetector                  implicitDeny  implicitDeny
logs:CreateLogDelivery                         implicitDeny  implicitDeny
logs:CreateLogGroup                            allowed       allowed
logs:CreateLogStream                           allowed       implicitDeny
logs:CreateLookupTable                         implicitDeny  implicitDeny
logs:CreateScheduledQuery                      implicitDeny  implicitDeny
logs:DeleteAccountPolicy                       implicitDeny  implicitDeny
logs:DeleteDataProtectionPolicy                implicitDeny  implicitDeny
logs:DeleteDelivery                            implicitDeny  implicitDeny
logs:DeleteDeliveryDestination                 implicitDeny  implicitDeny
logs:DeleteDeliveryDestinationPolicy           implicitDeny  implicitDeny
logs:DeleteDeliverySource                      implicitDeny  implicitDeny
logs:DeleteDestination                         implicitDeny  implicitDeny
logs:DeleteIndexPolicy                         implicitDeny  implicitDeny
logs:DeleteIntegration                         implicitDeny  implicitDeny
logs:DeleteLogAnomalyDetector                  implicitDeny  implicitDeny
logs:DeleteLogDelivery                         implicitDeny  implicitDeny
logs:DeleteLogGroup                            implicitDeny  implicitDeny
logs:DeleteLogStream                           implicitDeny  implicitDeny
logs:DeleteLookupTable                         implicitDeny  implicitDeny
logs:DeleteMetricFilter                        implicitDeny  implicitDeny
logs:DeletePipelineRule                        implicitDeny  implicitDeny
logs:DeleteQueryDefinition                     implicitDeny  implicitDeny
logs:DeleteResourcePolicy                      implicitDeny  implicitDeny
logs:DeleteRetentionPolicy                     implicitDeny  implicitDeny
logs:DeleteScheduledQuery                      implicitDeny  implicitDeny
logs:DeleteSubscriptionFilter                  implicitDeny  implicitDeny
logs:DeleteSyslogConfiguration                 implicitDeny  implicitDeny
logs:DeleteTransformer                         implicitDeny  implicitDeny
logs:DescribeAccountPolicies                   implicitDeny  implicitDeny
logs:DescribeConfigurationTemplates            implicitDeny  implicitDeny
logs:DescribeDeliveries                        implicitDeny  implicitDeny
logs:DescribeDeliveryDestinations              implicitDeny  implicitDeny
logs:DescribeDeliverySources                   implicitDeny  implicitDeny
logs:DescribeDestinations                      implicitDeny  implicitDeny
logs:DescribeExportTasks                       implicitDeny  implicitDeny
logs:DescribeFieldIndexes                      implicitDeny  implicitDeny
logs:DescribeImportTaskBatches                 implicitDeny  implicitDeny
logs:DescribeImportTasks                       implicitDeny  implicitDeny
logs:DescribeIndexPolicies                     implicitDeny  implicitDeny
logs:DescribeLogGroups                         implicitDeny  implicitDeny
logs:DescribeLogStreams                        allowed       allowed
logs:DescribeLookupTables                      implicitDeny  implicitDeny
logs:DescribeMetricFilters                     implicitDeny  implicitDeny
logs:DescribeQueries                           implicitDeny  implicitDeny
logs:DescribeQueryDefinitions                  implicitDeny  implicitDeny
logs:DescribeResourcePolicies                  implicitDeny  implicitDeny
logs:DescribeSubscriptionFilters               implicitDeny  implicitDeny
logs:DisassociateKmsKey                        implicitDeny  implicitDeny
logs:DisassociateSourceFromS3TableIntegration  implicitDeny  implicitDeny
logs:FilterLogEvents                           implicitDeny  implicitDeny
logs:GetDataProtectionPolicy                   implicitDeny  implicitDeny
logs:GetDelivery                               implicitDeny  implicitDeny
logs:GetDeliveryDestination                    implicitDeny  implicitDeny
logs:GetDeliveryDestinationPolicy              implicitDeny  implicitDeny
logs:GetDeliverySource                         implicitDeny  implicitDeny
logs:GetIntegration                            implicitDeny  implicitDeny
logs:GetLogAnomalyDetector                     implicitDeny  implicitDeny
logs:GetLogDelivery                            implicitDeny  implicitDeny
logs:GetLogEvents                              implicitDeny  implicitDeny
logs:GetLogFields                              implicitDeny  implicitDeny
logs:GetLogGroupFields                         implicitDeny  implicitDeny
logs:GetLogRecord                              implicitDeny  implicitDeny
logs:GetLookupTable                            implicitDeny  implicitDeny
logs:GetQueryResults                           implicitDeny  implicitDeny
logs:GetScheduledQuery                         implicitDeny  implicitDeny
logs:GetScheduledQueryHistory                  implicitDeny  implicitDeny
logs:GetStorageTierPolicy                      implicitDeny  implicitDeny
logs:GetTransformer                            implicitDeny  implicitDeny
logs:IntegrateWithS3Table                      implicitDeny  implicitDeny
logs:Link                                      implicitDeny  implicitDeny
logs:ListAggregateLogGroupSummaries            implicitDeny  implicitDeny
logs:ListAnomalies                             implicitDeny  implicitDeny
logs:ListEntitiesForLogGroup                   implicitDeny  implicitDeny
logs:ListIntegrations                          implicitDeny  implicitDeny
logs:ListLogAnomalyDetectors                   implicitDeny  implicitDeny
logs:ListLogDeliveries                         implicitDeny  implicitDeny
logs:ListLogGroups                             implicitDeny  implicitDeny
logs:ListLogGroupsForEntity                    implicitDeny  implicitDeny
logs:ListLogGroupsForQuery                     implicitDeny  implicitDeny
logs:ListScheduledQueries                      implicitDeny  implicitDeny
logs:ListSourcesForS3TableIntegration          implicitDeny  implicitDeny
logs:ListSyslogConfigurations                  implicitDeny  implicitDeny
logs:ListTagsForResource                       implicitDeny  implicitDeny
logs:ListTagsLogGroup                          implicitDeny  implicitDeny
logs:ProcessWithPipeline                       implicitDeny  implicitDeny
logs:PutAccountPolicy                          implicitDeny  implicitDeny
logs:PutBearerTokenAuthentication              implicitDeny  implicitDeny
logs:PutDataProtectionPolicy                   implicitDeny  implicitDeny
logs:PutDeliveryDestination                    implicitDeny  implicitDeny
logs:PutDeliveryDestinationPolicy              implicitDeny  implicitDeny
logs:PutDeliverySource                         implicitDeny  implicitDeny
logs:PutDestination                            implicitDeny  implicitDeny
logs:PutDestinationPolicy                      implicitDeny  implicitDeny
logs:PutIndexPolicy                            implicitDeny  implicitDeny
logs:PutIntegration                            implicitDeny  implicitDeny
logs:PutLogEvents                              allowed       implicitDeny
logs:PutLogGroupDeletionProtection             implicitDeny  implicitDeny
logs:PutMetricFilter                           implicitDeny  implicitDeny
logs:PutPipelineRule                           implicitDeny  implicitDeny
logs:PutQueryDefinition                        implicitDeny  implicitDeny
logs:PutResourcePolicy                         implicitDeny  implicitDeny
logs:PutRetentionPolicy                        allowed       allowed
logs:PutStorageTierPolicy                      implicitDeny  implicitDeny
logs:PutSubscriptionFilter                     implicitDeny  implicitDeny
logs:PutSyslogConfiguration                    implicitDeny  implicitDeny
logs:PutTransformer                            implicitDeny  implicitDeny
logs:StartLiveTail                             implicitDeny  implicitDeny
logs:StartQuery                                implicitDeny  implicitDeny
logs:StopLiveTail                              implicitDeny  implicitDeny
logs:StopQuery                                 implicitDeny  implicitDeny
logs:TagLogGroup                               implicitDeny  implicitDeny
logs:TagResource                               implicitDeny  implicitDeny
logs:TestMetricFilter                          implicitDeny  implicitDeny
logs:TestTransformer                           implicitDeny  implicitDeny
logs:Unmask                                    implicitDeny  implicitDeny
logs:UntagLogGroup                             implicitDeny  implicitDeny
logs:UntagResource                             implicitDeny  implicitDeny
logs:UpdateAnomaly                             implicitDeny  implicitDeny
logs:UpdateDeliveryConfiguration               implicitDeny  implicitDeny
logs:UpdateLogAnomalyDetector                  implicitDeny  implicitDeny
logs:UpdateLogDelivery                         implicitDeny  implicitDeny
logs:UpdateLookupTable                         implicitDeny  implicitDeny
logs:UpdateScheduledQuery                      implicitDeny  implicitDeny

ポイントを抜粋すると,ロググループ形式の ARN を指定する必要がある logs:CreateLogGroup・logs:PutRetentionPolicy・logs:DescribeLogStreams の3つが allowed(許可) になった👌

Action                                         LogStream     LogGroup
---------------------------------------------  ------------  ------------
logs:CreateLogGroup                            allowed       allowed
logs:CreateLogStream                           allowed       implicitDeny
logs:DescribeLogStreams                        allowed       allowed
logs:PutLogEvents                              allowed       implicitDeny
logs:PutRetentionPolicy                        allowed       allowed

まとめ

AWS Health から「AWS CLOUDWATCH PLANNED LIFECYCLE EVENT」という AWS Health Event が来ていたので確認した.Amazon CloudWatch Logs の IAM ポリシーの評価方法が2027年4月26日から変わるので,CloudWatch Logs IAM Policy Validator を活用しつつ,ロググループ形式の ARN とログストリーム形式の ARN を適切に許可しよう💪

github.com