Guard DutyのアラートをSNSで通知する

概要

Guard Dutyのアラートを、SNSを介してユーザに通知する方法を示します。

EventBridgeを使ってSNSに通知します。

Guard DutbはEventBridgeにアラートを通知するので、EventBridgeがSNSを起動するように、EventBridgeを設定します。

すると、Guard DutyのアラートがEventBridge 、SNSを介してSNSの登録メールアドレスに送信されます。

Guard Dutyの概要

Amazon Guard Duty は、悪意のあるアクティビティのために AWS アカウントとワークロードを継続的にモニタリングし、可視化と修復のための詳細なセキュリティ調査結果を提供する脅威検出サービスです。

SNSのトピックの作成

SNSの作成方法は省略します。

EventBridgeの設定

EventBridgeがSNSを起動するように、EventBridgeを設定します。

イベントパターンを以下のようにしました

イベントパターンの内容

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

[次へ]をクリックします

入力トランスフォーマの設定

作成されたルールのターゲットを編集します

ターゲットの追加設定をクリックし、

[ターゲット入力を設定]に[入力トランスフォーマ]を選択し、

[入力トランスフォーマを設定]をクリックします。

入力トランスフォーマの入力パスと入力テンプレートを以下のように設定します。

入力テンプレートの各行の両端を”で囲ってください。

[確認]を押して保存してください。

入力トランスフォーマの入力パスの内容

{
  "Account_ID": "$.account",
  "Finding_ID": "$.detail.id",
  "Finding_Type": "$.detail.type",
  "Finding_description": "$.detail.description",
  "awsRegion": "$.region",
  "rule": "$.detail.service.action.actionType",
  "severity": "$.detail.severity",
  "time": "$.detail.createdAt"
}

入力トランスフォーマのテンプレートの内容


"アカウントdddddddのGuard Dutyの確認をお願い致します。"
"発生時刻 : <time>"
"重要度 : <severity>"
"アクションタイプ : <rule>"
"リソースタイプ : <Finding_Type>"
"発生内容:<Finding_description>"
"AWSアカウント : <Account_ID>"

"上記リソースが <severity> 判定となりました。"
"詳細は以下URLよりご確認ください。"
"https://console.aws.amazon.com/guardduty/home?region=<awsRegion>#/findings?search=id%3D<Finding_ID>"

入力トランスフォーマの設定の確認

サンプルイベントとして

Guard Duty Findingsを選ぶと以下のように表示されます。

サンプルイベントの内容

{
  "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"
  }
}

サンプルイベントの表示内容を参考にして入力パスに好みのパラメータを追記することができます。

(ただし、サンプルイベントにすべてのパラメータが記載されているわけではなく、あくまでサンプルです。

そこで後述する、実際の検出結果を元に、入力パスのパラメータを設定する方法もあります。)

サンプル出力の確認

入力トランスフォーマの下部の[出力を生成]をクリックすると、テンプレートに応じた出力例が表示されます。

これを参考にテンプレートを編集してください。

GuardDutyの検出結果を参考に入力トランスフォーマを決める

実際のGuardDutyの検出結果をクリックします。

右に説明が表示されます。

そこの[検出結果]をクリックします。

検出結果がJSONで表示されます。

これを参考に入力トランスフォーマの入力パスのパラメータを設定することもできます。

EventBridge Ruleの作成完了

これでEventBridge Ruleは作成完了です。

AWS Configが異常を検知すると、AWS Config はEventBridge Ruleを起動し、EventBridge RuleはSNSを起動し、ユーザに異常通知のメールが届きます。

タイトルとURLをコピーしました