🍣

Amazon GuardDutyで検知した脅威情報をAmazon SNSでEメール通知してみた

2023/03/31に公開

こんにちは、ナオトと申します。
クラスメソッド様によるDevelopersIO BASECAMPを受講しています。
ブログの執筆により、学んだことを定着させることができるとのことで、初めてブログを書きます。
拙い文章ですが、参考にしていただけると嬉しいです。

初めてのブログのお題は、Amazon GuardDutyについてです。
Amazon GuardDutyは、AWS環境のセキュリティ上の脅威を検出してくれるサービスです。
サービスを提供する際には、どうしても機能面に目が行きがちです。
しかし、サイバー攻撃が日々高度化・激化する中で、「安心して使える」ことが、今後のサービス選定に大きく関わってくると思います。
セキュリティ確保こそサービス提供の土台になると考え、初めてのブログのお題に選びました。

Amazon GuardDutyとは

AWSアカウントやAWS環境における脅威検出を目的としたマネージドサービスです。Amazon GuardDutyそのものは検出を行うサービスなので、Amazon SNS等と連携して、検出した脅威を通知するような運用が想定されます。

今回の構成

Amazon GuardDutyで検出した脅威情報を、Amazon EventBridgeでフィルタリングして、Amazon SNSでEメール通知します。

Amazon EventBridgeは、イベントを通してアプリケーション同士を接続するサービスです。今回はAmazon GuardDutyとAmazon SNSを接続します。
Amazon SNSは、EメールやSMS、モバイルプッシュ通知等に対してメッセージを配信するサービスです。今回はEメール通知に利用します。

やってみます

Amazon GuardDutyの設定

Amazon GuardDutyの設定はとても簡単です。
まずはAmazon GuardDutyのページで「今すぐ始める」をクリックします。

次のページで、「GuardDutyを有効にする」をクリックします。

すると、Amazon GuardDutyが有効になります!以上です。

Amazon SNSの設定

続いてAmazon SNSの設定を行います。

トピックの作成

まず、Amazon SNSのページで左ペインの「トピック」をクリックします。その後「トピックの作成」ボタンを押します。

今回はEメールによる通知なので、タイプは「スタンダード」を選択します。
続いて名前を入力します。
その他設定項目は今回はデフォルト値にしました。

サブスクリプションの作成

トピックが作成できたら、サブスクリプションを作成します。
「サブスクリプションの作成」ボタンを押します。

トピックARNは、先ほど作成したトピックを選択します。
プロトコルは「Eメール」を選択し、エンドポイントに通知先Eメールアドレスを入力します。
その他設定項目は今回はデフォルト値にしました。

Amazon EventBridgeの設定

最後に、Amazon EventBridgeの設定を行います。
まずAmazon EventBridgeのページで「イベントブリッジルール」を選択の上「ルールを作成」ボタンを押します。

ステップ1 ルールの詳細を定義

ルールの詳細を定義します。
今回は、名前以外はデフォルト値にしています。

ステップ2 イベントパターンを構築

イベントパターンを構築します。
イベントソースは「AWS イベントまたは EventBridge パートナーイベント」にします。

サンプルイベントは設定項目ではないのですが、実際にイベントが発生した際にどのような情報が活用できるのかを確認することができます。
サンプルイベントタイプを「AWSイベント」にし、サンプルイベントで「GuardDuty Finding」を選択することで、GuardDutyの脅威検知のサンプルイベントを確認できます。

作成メソッドは「パターンフォームを使用する」にします。
イベントソースは「AWSのサービス」、AWSのサービスは「GuardDuty」、イベントタイプは「GuardDuty Finding」にします。

すると、イベントパターンに「GuardDuty Finding」でフィルタリングされたパターンが表示されます。
デフォルトのままだと、GuardDutyで検知した脅威がすべてEメールで通知されることになるため、「severity(脅威の重大度)」で更にフィルタリングすることにします。

パターンの編集

「パターンの編集」をクリックすると、イベントパターンを編集できるモードに切り替わります。

イベントパターンを次のとおり修正します。

{
  "source": ["aws.guardduty"],
  "detail-type": ["GuardDuty Finding"],
  "detail": {
    "severity": [{
      "numeric": [">=", 4]
    }]
  }
}

この修正により、「severity(脅威の重大度)」が4以上の場合に通知するようになります。
サンプルイベントを確認すると、detailの中に「"severity": 5」と記載があるのが分かると思います。

サンプルイベント
{
  "version": "0",
  "id": "c8c4daa7-a20c-2f03-0070-b7393dd542ad",
  "detail-type": "GuardDuty Finding",
  "source": "aws.guardduty",
  "account": "123456789012",
  "time": "1970-01-01T00:00:00Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "schemaVersion": "2.0",
    "accountId": "123456789012",
    "region": "us-east-1",
    "partition": "aws",
    "id": "16afba5c5c43e07c9e3e5e2e544e95df",
    "arn": "arn:aws:guardduty:us-east-1:123456789012:detector/123456789012/finding/16afba5c5c43e07c9e3e5e2e544e95df",
    "type": "Canary:EC2/Stateless.IntegTest",
    "resource": {
      "resourceType": "Instance",
      "instanceDetails": {
        "instanceId": "i-05746eb48123455e0",
        "instanceType": "t2.micro",
        "launchTime": 1492735675000,
        "productCodes": [],
        "networkInterfaces": [{
          "ipv6Addresses": [],
          "privateDnsName": "ip-0-0-0-0.us-east-1.compute.internal",
          "privateIpAddress": "0.0.0.0",
          "privateIpAddresses": [{
            "privateDnsName": "ip-0-0-0-0.us-east-1.compute.internal",
            "privateIpAddress": "0.0.0.0"
          }],
          "subnetId": "subnet-d58b7123",
          "vpcId": "vpc-34865123",
          "securityGroups": [{
            "groupName": "launch-wizard-1",
            "groupId": "sg-9918a123"
          }],
          "publicDnsName": "ec2-11-111-111-1.us-east-1.compute.amazonaws.com",
          "publicIp": "11.111.111.1"
        }],
        "tags": [{
          "key": "Name",
          "value": "ssh-22-open"
        }],
        "instanceState": "running",
        "availabilityZone": "us-east-1b",
        "imageId": "ami-4836a123",
        "imageDescription": "Amazon Linux AMI 2017.03.0.20170417 x86_64 HVM GP2"
      }
    },
    "service": {
      "serviceName": "guardduty",
      "detectorId": "3caf4e0aaa46ce4ccbcef949a8785353",
      "action": {
        "actionType": "NETWORK_CONNECTION",
        "networkConnectionAction": {
          "connectionDirection": "OUTBOUND",
          "remoteIpDetails": {
            "ipAddressV4": "0.0.0.0",
            "organization": {
              "asn": -1,
              "isp": "GeneratedFindingISP",
              "org": "GeneratedFindingORG"
            },
            "country": {
              "countryName": "United States"
            },
            "city": {
              "cityName": "GeneratedFindingCityName"
            },
            "geoLocation": {
              "lat": 0,
              "lon": 0
            }
          },
          "remotePortDetails": {
            "port": 22,
            "portName": "SSH"
          },
          "localPortDetails": {
            "port": 2000,
            "portName": "Unknown"
          },
          "protocol": "TCP",
          "blocked": false
        }
      },
      "resourceRole": "TARGET",
      "additionalInfo": {
        "unusualProtocol": "UDP",
        "threatListName": "GeneratedFindingCustomerListName",
        "unusual": 22
      },
      "eventFirstSeen": "2017-10-31T23:16:23Z",
      "eventLastSeen": "2017-10-31T23:16:23Z",
      "archived": false,
      "count": 1
    },
    "severity": 5,
    "createdAt": "2017-10-31T23:16:23.824Z",
    "updatedAt": "2017-10-31T23:16:23.824Z",
    "title": "Canary:EC2/Stateless.IntegTest",
    "description": "Canary:EC2/Stateless.IntegTest"
  }
}

詳細な記載方法は公式ドキュメントを参照ください。
なお、「severity(脅威の重大度)」を4以上とした根拠は、公式ドキュメントの次の記載からです。

効率的な優先順位付けのための脅威の重大度
Amazon GuardDuty は、3 つの重大度 (低、中、高) を用意して、お客様が潜在的な脅威への対応に優先順位を付けやすくしています。「低」の重大度は、疑わしいアクティビティや悪意のあるアクティビティのうち、リソースが侵害される前にブロックされたものを示します。「中」の重大度は、疑わしいアクティビティを示します。たとえば、Tor ネットワークの背後に隠れているリモートホストに返される大量のトラフィックや、通常観察される動作から逸脱したアクティビティなどです。「高」の重大度は、問題になっているリソース (Amazon EC2 インスタンスや IAM ユーザー資格情報など) が侵害され、不正な目的で活発に使用されていることを示します。

つまり、重大度「低」のものはすでにブロックされたもの、「中」以上のものはリソースの侵害に繋がる、またはすでに侵害されている状態であることから、セキュリティ確保に影響を与える「中」以上の通知が適切と考えました。
公式ドキュメントによると、重大度「低」の値の範囲は3.9~1.0なので、4.0以上でフィルタリングすることで重大度「中」以上のものを通知することができます。

イベントパターンの修正が完了したら、「次へ」ボタンを押します。

ステップ3 ターゲットを選択

ここでは、イベントの通知先を選択します。
ターゲットタイプを「AWSのサービス」にします。
次にターゲットを選択を「SNSトピック」にし、トピックに先ほど作成したトピックを選択します。

ステップ4 オプション

タグの設定の必要があれば、ここで設定します。
今回は設定せず、進めます。

ステップ5 レビューと作成

設定内容に問題がなければ、「ルールの作成」をクリックします。

設定は以上で終わりです。お疲れ様でした!

検証します

続いて、検知された脅威が設定したEメールアドレス宛に通知されるかどうか、検証します。
Amazon GuardDutyのページで、左ペインの「設定」をクリックした後、設定画面の「検出結果サンプルの生成」を押します。

すると、検出結果にたくさんの検出結果サンプルが生成されます。

数分後、無事通知先Eメールアドレスに設定したEメールアドレスに対して、たくさんの検出結果が通知されました。

まとめ

Amazon GuardDutyで検出した脅威情報を、Amazon EventBridgeでフィルタリングして、Amazon SNSでEメール通知する方法をご紹介しました。
今回は分量の関係上、通知内容の整形まではご紹介できませんでしたが、機会があれば執筆したいと思います。

最後まで読んでくださって、ありがとうございました!

デベキャン

Discussion