Amazon Web Services ブログ

CloudTrail Insights の発表: 異常な API アクティビティの特定とそれへの対応

クラウド上でソフトウェアを構築すると、ログ記録用のシステムを初期の段階から簡単に実装できます。AWS CloudTrail などのツールを使用すると、AWS のアカウントおよびサービスで実行されたすべてのアクションの追跡が容易になり、変更の原因となったイベントを探し出すことができます。ただし、ログエントリがすべて役立つわけではありません。スムーズに実行されている場合のログエントリは、さながら工場で安定して響く安心感のある機械音のようなものです。しかし不具合が発生した際には、その音が邪魔になりどの機器に不具合があるのかが聞き取りにくくなります。ログデータの量が膨大になる可能性があるような大規模なソフトウェアシステムでも、同じことが言えます。その記録を精査して実用的な情報を見つけるのは骨が折れる仕事です。記録の精査には通常、多くのカスタムソフトウェアやカスタム統合が必要なため、新しいサービスが追加されたときに誤検知やアラート疲れを引き起こすおそれがあります。

そこで、ソフトウェアのオートメーションと機械学習が役立ちます。本日、すべての商用 AWS リージョンで AWS CloudTrail Insights をリリースします。CloudTrail Insights は、CloudTrail の証跡からの書き込み管理イベントを自動的に分析し、異常なアクティビティを警告します。たとえば、確立されたベースラインと異なる TerminateInstance イベントの増加があった場合、Insight イベントとして表示されます。こうしたイベントにより、異常な API アクティビティの検出とそれへの対応がこれまで以上に簡単になります。

AWS CloudTrail Insights の有効化

CloudTrail は、ユーザーアクティビティと API の使用状況を追跡します。AWS マネジメントコンソール、AWS SDK、コマンドラインツール、その他 AWS のサービスを通じて実行されたアクションを含む、AWS アカウントアクティビティのイベント履歴が提供されます。AWS CloudTrail Insights を起動すると、これらのログの異常なアクティビティを検出する機械学習モデルが、数回クリックするだけで有効になります。AWS CloudTrail Insights は、過去の API コールを分析し、使用パターンを識別し、異常なアクティビティの Insight イベントを生成します。

CloudTrail Insights を有効にする方法を説明するスクリーンショット

put-insight-selectors コマンドを使用して、AWS コマンドラインインターフェイス (CLI) から証跡に対する Insights を有効にすることもできます。

$ aws cloudtrail put-insight-selectors --trail-name trail_name --insight-selectors '{"InsightType": "ApiCallRateInsight"}'

CloudTrail Insights を有効にすると、証跡の詳細ページで指定した S3 バケットにイベントが送信されます。他の CloudTrail イベントと同じく、イベントは CloudWatch Events に、またオプションで CloudWatch Logs のロググループにも送信されます。これにより、CloudWatch イベントに応答する高度なルールからカスタム AWS Lambda 関数に至るまで、アラートに関するさまざまなオプションが提供されます。Insights を有効にすると、その証跡に関する過去のイベントが分析されます。異常な使用パターンが見つかると、30 分以内に CloudTrail コンソールに表示されます。

CloudTrail Insights の使用

本稿では、AWS コンソールから AWS CloudTrail Insights イベントを見ていきます。AWS CLI から Insight イベントを表示するには、event-category パラメータで CloudTrail LookupEvents 呼び出しを使用します。

$ aws cloudtrail lookup-events --event-category insight [--max-item] [--lookup-attributes]

CloudTrail Insights のリストをざっと見渡すと、RunInstances イベントが目に入ってきます。EC2 インスタンスを追加でスピンアップするのはコストがかかる可能性があります。必要以上に多くのインスタンスを作成してしまったので、詳しく見てみたいと思います。リストをこれらのイベントだけに絞り込み、AWS CloudTrail Insights から何が分かるのかを見てみましょう。

最新のイベントを見てみましょう。

ここでは、1 分間にわたって RunInstances API コールのボリュームにスパイクが発生したことがわかります。Insights グラフから、raw イベントを JSON で見ることができます。

{
    "Records": [
        {
            "eventVersion": "1.07",
            "eventTime": "2019-11-07T13:25:00Z",
            "awsRegion": "us-east-1",
            "eventID": "a9edc959-9488-4790-be0f-05d60e56b547",
            "eventType": "AwsCloudTrailInsight",
            "recipientAccountId": "-REDACTED-",
            "sharedEventID": "c2806063-d85d-42c3-9027-d2c56a477314",
            "insightDetails": {
                "state": "Start",
                "eventSource": "ec2.amazonaws.com",
                "eventName": "RunInstances",
                "insightType": "ApiCallRateInsight",
                "insightContext": {
                    "statistics": {
                        "baseline": {
                            "average": 0.0020833333},
                        "insight": {
                            "average": 6}
                    }
                }
            },
            "eventCategory": "Insight"},
        {
            "eventVersion": "1.07",
            "eventTime": "2019-11-07T13:26:00Z",
            "awsRegion": "us-east-1",
            "eventID": "33a52182-6ff8-49c8-baaa-9caac16a96ce",
            "eventType": "AwsCloudTrailInsight",
            "recipientAccountId": "-REDACTED-",
            "sharedEventID": "c2806063-d85d-42c3-9027-d2c56a477314",
            "insightDetails": {
                "state": "End",
                "eventSource": "ec2.amazonaws.com",
                "eventName": "RunInstances",
                "insightType": "ApiCallRateInsight",
                "insightContext": {
                    "statistics": {
                        "baseline": {
                            "average": 0.0020833333},
                        "insight": {
                            "average": 6},
                        "insightDuration": 1}
                }
            },
            "eventCategory": "Insight"}
    ]}

ここでは、ベースライン API コールボリュームが 0.002 であることがわかります。通常は 500 分ごとに 1 回 RunInstances が呼び出されるため、グラフに表示されているアクティビティが正常でないことは確実です。[CloudTrail Events] タブをクリックすると、この Insight イベントにグループ化されている個々のイベントを確認できます。これはおそらく通常の EC2 Auto Scaling アクティビティだと思われるのですが、ここからさらに掘り下げて確認したいと思います。

このタブでイベントを展開して [View Event] をクリックすると、CloudTrail のイベントに直接移動して詳細を確認することができます。イベントメタデータおよび関連のある EC2 リソースと IAM リソースを確認した後、この動作は異常ではあるものの心配する必要はないことが確認できました。Auto Scaling が想定通りに機能し、正しいタイプのインスタンスが作成されたようです。

知っておくべきこと

使用開始する前に、知っておくべき重要なことがいくつかあります:

  • CloudTrail Insights では、Insight タイプごとに分析された書き込み管理イベントについて、100,000 イベントごとに 0.35 USD の料金が請求されます。起動時には、API コールボリュームのインサイトのみが利用可能です。
  • アクティビティベースラインは、CloudTrail の証跡が動作しているリージョンとアカウントを対象としています。
  • アカウントで Insights イベントを初めて有効にした後、異常なアクティビティが検出された場合に最初の Insights イベントを受信できるのは、Insights を有効にしてから 36 時間以内です。
  • 異常なアクティビティが新たに検出されると、ログに記録され、Insight イベントが送信先 S3 バケットと AWS コンソールに、ほとんどの場合 30 分以内に送信されます。

ご質問や機能のご要望がありましたら、お気軽にお問い合わせください。

— Brandon