[アップデート] AWS CloudTrail で Amazon SNS の Publish/PublishBatch イベントが記録出来るようになりました

2023.09.30

いわさです。

AWS CloudTrail を使うと、AWS リソースに対する API 操作をイベントとして記録することが出来ます。

AWS アカウントのアクティビティをトレース出来るようにすることは、セキュリティや運用の観点でベストプラクティスとされていますが、一方で 全ての API 操作が記録されているわけではなくいくつかの主要なイベントの中で記録されないものもあります。
Amazon SNS のメッセージ送信イベントもそのひとつで、以前までは CloudTrail イベントとして記録されないものでした。

先日のアップデートで、この SNS メッセージ送信イベントが CloudTrail イベントとして記録出来るようになりました。

こちらはデフォルトで記録される管理イベントではないので追加の設定が必要ですが、本日は有効化して実際にログの内容を確認してみましたので紹介したいと思います。

管理イベントではない

CloudTrail には管理イベントとデータイベントと、イベントの種類が存在します。
前者はリソースに対して実行される管理オペレーションで、後者はリソース内で実行されるリソースオペレーションです。

これらのデータイベントは CloudTrail デフォルト設定では有効化されておらず、オプションとして有効化が必要です。
データイベントの代表的なところでは、S3 バケット内のオブジェクトレベルの API 操作(GetObject など)があり、様々な要件から S3 オブジェクト操作を CloudTrail に記録したい場合にデータイベントを有効化することがあります。

今回のアップデートではこのデータイベントの対象リソースに Amazon SNS のメッセージ送信イベントが追加されました。
そのため利用の前提として CloudTrail のデータイベントの設定が必要となります。

試しに次のようにデータイベントが設定されていない状態で確認してみましょう。
後ほどデータイベントを確認する際に CloudWatch Logs を使いたいので、ロググループへの出力を指定しています。

ここではトピックを新規作成し、メッセージ送信を行いました。

% aws sns create-topic --name hoge0930topic
{
    "TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:hoge0930topic"
}
% cat publish.json
{
    "TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:hoge0930topic",
    "Message": "hogemessage",
    "Subject": "hogesubject"
}
% aws sns publish --cli-input-json file://publish.json
{
    "MessageId": "0cb2ddbd-c6fb-552f-9fa3-802c86a918bd"
}

CloudWatch Logs Insights で確認してみると、CreateTopic イベントのみが記録されています。

データイベントを有効化

では CloudTrail 証跡のデータイベントで Amazon SNS のメッセージ送信イベントを有効化してみてみたいと思います。

証跡のデータイベントを編集します。

記録するイベントタイプにデータイベントを選択します。
データイベントのどのイベントソースを記録するのか設定を行うのですが、デフォルト表示の基本イベントセレクタだと、S3・Lambda・DynamoDB のみ選択が出来ます。

データイベントは実は様々なものがサポートされており、上記以外のイベントソースを選択したい場合は「高度なイベントセレクター」を選択する必要があります。

高度なイベントセレクターに切り替えると様々なイベントソースが選択出来るようになります。
今回のアップデートでは次の 2 つのイベントソース「SNS topic」と「SNS platform endpoint」が追加されています。

Amazon SNS ではいくつかメッセージを送信する方法があります。

  • SNS トピックを作成してトピックに対してメッセージを送信する
  • 電話番号を指定して SMS でメッセージを送信する
  • プラットフォームエンドポイントを構成しモバイルプッシュ通知を送信する

「SNS topic」はトピックに対するメッセージ送信が対象です。
「SNS platform endpoint」はモバイルプッシュ通知が対象となっています。

なお、本日時点では電話番号指定での SMS メッセージ送信(リソースタイプ:AWS::SNS::PhoneNumber)はサポートされていませんのでご注意ください。

参考:Logging Amazon SNS API calls using CloudTrail - Amazon Simple Notification Service

今回は次のように SNS topic をデータイベントタイプとして選択し、ベーシックなトピックへのメッセージ送信を行ってみたいと思います。

プラットフォームエンドポイントを構成したメッセージ送信を行いたい方は次のドキュメントを参考にしてください。

メッセージを送信し、ログを確認する

データイベントで SNS Topic を有効化後出来たので、メッセージを送信してみましょう。
なお、データイベントは CloudTrail のイベント履歴からは確認出来ないので CloudWatch Logs で出力を確認したいと思います。

ログが出力されるまで数分のタイムラグがあり、すぐに出力が確認出来なかったため次のように 2 回送信しています。

% aws sns publish --cli-input-json file://publish.json
{
    "MessageId": "ed4afb79-180e-5d63-9fc9-a6e85bf44013"
}
% aws sns publish --cli-input-json file://publish.json
{
    "MessageId": "f2242168-ec30-5bf6-9de1-7cf9a8dfe3a8"
}

しばらく経つと Publish イベントが記録されていることが確認出来ました。

なお、今回のアップデートで記録されるようになったイベントは Publish の他に、一括送信用の PublishBatch も対象です。

ログ出力内容

出力されたイベントログは次のようなものが出力されました。

{
    "eventVersion": "1.09",
    "userIdentity": { ... 省略 ... },
    "eventTime": "2023-09-29T21:33:35Z",
    "eventSource": "sns.amazonaws.com",
    "eventName": "Publish",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "203.0.113.1",
    "userAgent": "aws-cli/2.13.15 Python/3.11.4 Darwin/22.6.0 exe/x86_64 prompt/off command/sns.publish",
    "requestParameters": {
        "topicArn": "arn:aws:sns:ap-northeast-1:123456789012:hoge0930topic",
        "message": "HIDDEN_DUE_TO_SECURITY_REASONS",
        "subject": "HIDDEN_DUE_TO_SECURITY_REASONS"
    },
    "responseElements": {
        "messageId": "f2242168-ec30-5bf6-9de1-7cf9a8dfe3a8"
    },
    "requestID": "232f1f15-76ef-5733-ad8b-42843200ff6d",
    "eventID": "c36d2759-0d2d-4993-be32-673a5bbac55d",
    "readOnly": false,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::SNS::Topic",
            "ARN": "arn:aws:sns:ap-northeast-1:123456789012:hoge0930topic"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "123456789012",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "sns.ap-northeast-1.amazonaws.com"
    }
}

注意点としては、メッセージや件名がHIDDEN_DUE_TO_SECURITY_REASONSとされている点です。
CloudTrail ではセキュリティ情報を保護するために様々な属性でHIDDEN_DUE_TO_SECURITY_REASONSとして出力される場合があるのですが、メッセージ内容についても保護の対象となっているようです。

さいごに

本日は AWS CloudTrail で Amazon SNS の Publish/PublishBatch イベントが記録出来るようになったので、実際に Publish イベントを使って試してみました。

データイベントであるという点と、コンソールでは高度なイベントセレクターで構成する必要があるという点を覚えておきましょう。
また、出力されるログのメッセージ内容についてはHIDDEN_DUE_TO_SECURITY_REASONSとして出力されるのでその点はご注意ください。