AWS Secrets Manager の CloudTrail イベントデータに関する変更がアナウンスされていたので、実動作を確認し EventBridge ルールを変更してみた

2023.08.12

いわさです。

先日 AWS より次の件名の通知メールを受信しました。

[Action may be required] Upcoming changes to CloudTrail events published by AWS Secrets Manager

上記アナウンスでは AWS Secrets Manager に関する CloudTrail イベントデータの内容が 2024 年 1 月から変わるという内容が案内されています。

CloudTrail では AWS API コールの履歴を記録してくれます。
AWS Secrets Manager の API も、使用すると記録されるわけですが、イベントデータ内に対象シークレットの ARN が含まれています。
今回の通知で知ったのですが、現時点ではいくつかのアクションで ARN のプロパティ名が「aRN」という表記になっているそうです。知らなかった...

それが 2024 年 1 月より「arn」に統一されるとのこと。

Health Dashboard でも確認可能

Health Dashboard でも SecretsManager Security Notification という内容でイベントが発生していました。

通知内容確認して変更に備えてねというところですが、公式ドキュメントでは EventBridge ルールにて現時点で変更に備えた対処方法が紹介されていました。

そこで本日は、現状の挙動を実際に確認しつつ EventBridge ルールを変更してみましたので、その様子を紹介します。

CloudTrail で Secrets Manager の「aRN」が 2024 年 1 月に「arn」に統一される

まず、通知されていた変更内容をおさらいしておきます。

AWS Secrets Manager の API を操作すると、CloudTrail にイベントデータが記録されます。
イベントデータには操作対象シークレットの Amazon リソースネーム (ARN) が含まれていますが、そのプロパティ名が現状は「aRN」と「arn」で混在しているそうです。
aRN になった経緯が気になりますね。

対象のアクションは以下です。

  • 現状「aRN」として出力されるもの
    • CancelRotateSecret
    • DeleteResourcePolicy
    • DeleteSecret
    • PutResourcePolicy
    • RemoveRegionsFromReplication
    • ReplicateSecretToRegions
    • RestoreSecret
    • RotateSecret
    • StopReplicationToReplica
    • UpdateSecretVersionStage
  • 既に「arn」と出力されているもの
    • CreateSecret
    • DescribeSecret
    • GetRandomPassword
    • GetResourcePolicy
    • GetSecretValue
    • ListSecrets
    • ListSecretVersionIds
    • PutSecretValue
    • TagResource
    • UntagResource
    • UpdateSecret
    • ValidateResourcePolicy

現状「aRN」として出力されるものは、2024年1月から「arn」として出力されるように変更されます。
そのため、上記イベントデータを EventBridge ルールで条件として「aRN」を指定している人は、2024 年 1 月からイベントが条件に一致しなくなります。

あるいは受け取ったイベントをアプリケーション側でパース処理している人も影響しそうですね。

現時点のイベントを EventBridge で取得してみる

まずは EventBridge で適当なルールを作ってターゲットに CloudWatch Logs あたりを指定してみます。

この状態で、現状のイベントデータがまずアナウンスのとおりになっているのかを確認してみます。
CloudTrail でそのまま確認しても良いのですが、イベントルールを後ほど変更してみたいので、この記事では EventBridge を中心に確認してみます。

arn として出力される CreateSecret

まずはarnが出力されるであろう、CreateSecretアクションを確認してみましょう。
Secrets Manager で新しく適当なシークレットを作成するだけです。

CloudWatch Logs で確認されたイベントは次のようになっていました。

{
    "version": "0",
    "id": "2e167bb9-918d-9583-31a1-3fe257926444",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.secretsmanager",
    "account": "123456789012",
    "time": "2023-08-12T01:29:51Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",

:

        "eventTime": "2023-08-12T01:29:51Z",
        "eventSource": "secretsmanager.amazonaws.com",
        "eventName": "CreateSecret",
        "awsRegion": "ap-northeast-1",
        "sourceIPAddress": "...",
        "userAgent": "...",
        "requestParameters": {
            "name": "hoge0812secret",
            "clientRequestToken": "ef952565-4520-4624-a28a-40e10b237b56",
            "description": "",
            "forceOverwriteReplicaSecret": false
        },
        "responseElements": {
            "arn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v"
        },

:

    }
}

arnですね。まぁ普通ですね。

aRN として出力される DeleteSecret

続いてDeleteSecretアクションのイベントデータを発生させるには、作成済みのシークレットを削除するだけ良いです。

CloudWatch Logs で確認されたイベントは次のようになっていました。

{
    "version": "0",
    "id": "c6be7aae-18b3-2001-0faa-d8fcde81639c",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.secretsmanager",
    "account": "123456789012",
    "time": "2023-08-12T01:25:54Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",

:

        "eventTime": "2023-08-12T01:25:54Z",
        "eventSource": "secretsmanager.amazonaws.com",
        "eventName": "DeleteSecret",
        "awsRegion": "ap-northeast-1",
        "sourceIPAddress": "...",
        "userAgent": "...",
        "requestParameters": {
            "secretId": "rds-db-credentials/cluster-F4LAQKJMF4EFKW3U2M2DMYXC44/postgres/1687934031428",
            "recoveryWindowInDays": 7
        },
        "responseElements": {
            "aRN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds-db-credentials/cluster-F4LAQKJMF4EFKW3U2M2DMYXC44/postgres/1687934031428-yjzWam",
            "name": "rds-db-credentials/cluster-F4LAQKJMF4EFKW3U2M2DMYXC44/postgres/1687934031428",
            "deletionDate": "Aug 19, 2023, 1:25:54 AM"
        },

:

    }
}

本当にaRNって出力されてますね。おもしろい。

2024 年 1 月より前にどちらも対応出来るようにしておく

今回のアナウンスでは上記のaRNが 2024 年 1 月からはarnに変更されるのでよろしくねという内容です。
イベントデータを確認して変更が確認されてから手動で変更しても良いと思いますが、挙動の変更に確実に対応したい場合は事前にarnaRNどちらの形式にも対応出来るように変更しておく方法が推奨されています。

AWS 公式ドキュメントでは EventBridge のサンプルルールとしてarnaRNどちらの形式にも対応出来るコードが紹介されていたのでこちらを使ってみましょう。

修正対象のルール

PutResourcePolicyアクションは現時点ではaRNとして出力されており、2024 年 1 月からはarnとして出力されるように変更される予定のアクションです。
今回はこのアクションで ARN を指定したイベントルールを作成し、これをaRNarnのどちらでも対応出来るようにしてみます。

次のルールで現時点のイベントデータを拾うことが出来ます。

{
  "source": ["aws.secretsmanager"],
  "detail": {
    "eventName": ["PutResourcePolicy"],
    "responseElements": {
      "aRN": ["arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v"]
    }
  }
}

PutResourcePolicy イベントを発生

PutResourcePolicyイベントはシークレットのアクセス許可を更新する際に発生します。

ポリシーを変更すると次のような PutResourcePolicy のイベントレコードを取得することが出来ました。

{
    "version": "0",
    "id": "1c833cec-26ce-18cd-82d8-674b60beb532",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.secretsmanager",
    "account": "123456789012",
    "time": "2023-08-12T01:39:26Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",

:

        "eventTime": "2023-08-12T01:39:26Z",
        "eventSource": "secretsmanager.amazonaws.com",
        "eventName": "PutResourcePolicy",
        "awsRegion": "ap-northeast-1",
        "sourceIPAddress": "...",
        "userAgent": "...",
        "requestParameters": {
            "secretId": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v",
            "resourcePolicy": "...",
            "blockPublicPolicy": true
        },
        "responseElements": {
            "aRN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v",
            "name": "hoge0812secret"
        },

:

    }
}

arn イベントにも対応させる

ここで、イベントデータの条件を変更し、aRNarnだとしても条件に該当するようにしてみます。
ちなみに、PutResourcePolicy の arn イベントは本日時点で発生出来ないので、カスタムイベントとして送信します。そのため以降に記載するルールは実際の検証時と少し異なっています。

前述の公式ドキュメントに記載されていますが、EventBridge ルールの場合は$orを使うことで、arnaRNどちらにも対応出来るルールを作成することが出来ます。
ここでは次のようなルールを作成しました。

{
  "source": ["aws.secretsmanager"],
  "detail": {
    "eventName": ["PutResourcePolicy"],
    "responseElements": {
      "$or": [
        { "arn": ["arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v"] }, 
        { "aRN": ["arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:hoge0812secret-JWby4v"] }
      ]
    }
  }
}

今回の検証はカスタムイベントを使っているので次のようにsourceを除外しています。

上記ルールを設定後に、マネジメントコンソールから手動でのポリシー変更と、カスタムイベントを行ってみました。

arnaRNのどちらも取得することが出来ましたね。

さいごに

本日は AWS Secrets Manager の CloudTrail イベントデータに関する変更がアナウンスされていたので、実動作を確認し EventBridge ルールを変更してみました。

まず、前提として CloudTrail + Secrets Manager で ARN を参照している場合という、なかなか限られたケースでのみ今回のアナウンスは対象となっています。
もし、ARN を参照している場合は切り替えのタイミングで問題が生じることも許容出来るのであれば手動でaRNからarnに変更しても良いですし、確実に挙動変更に対処したい場合は今回紹介したような方法で 2024 年 1 月までの間にaRNarnのどちらにでも対応出来るように検討してみてください。