Amazon EventBridgeでルートテーブルの変更を検知してみる


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

前回「Amazon EventBridgeでセキュリティグループの変更を検知してみる」を書きました。あってはならないことですが、ルートテーブルも変更されていることがあります。

 

ルートテーブルなどネットワークに関わる設定は、場合によって重大なインシデントを引き起こします。

 

今回の記事では、Amazon EventBridgeを使って、ルートテーブルの作成・変更・削除を検知する仕組みを紹介します。

 

 

Amazon EventBridgeでルートテーブルの変更を検知

構築の流れは以下の通りです。

 

  1. Amazon SNSトピック作成
  2. Amazon EventBridgeルール作成

 

 

■Amazon SNSトピック作成

検知した際に通知してくれるAmazon SNSトピックを作成します。

 

 

↓Amazon SNSコンソール画面に行きます。

 securitygroup-change-notification トピック作成

 

↓左のコンソール画面から[トピック] 、[トピックの作成]をクリックします。

 

securitygroup-change-notification トピック作成

 

↓[タイプ]を[スタンダード]を選択し、[名前]・[表示名]を入力します。

 

項目 設定値
名前 saitou-test-topic
表示名 ルートテーブル変更検知

 

routetable-change-notificationトピック作成

 

 

↓[トピックの作成] をクリックします。

 

securitygroup-change-notification トピック作成

 

↓トピックの一覧から、作成したトピックを選択します。[サブスクリプション]タブから[サブスクリプションの作成] をクリックしてください。

 

securitygroup-change-notification トピック作成

 

↓[プロトコル]で、[Eメール]を選択します。[エンドポイント]で、通知を受け取るEメールアドレスを入力し、[サブスクリプションの作成]を押してください。

 

securitygroup-change-notification トピック作成

 

↓入力したメールアドレスに確認メールが来るので、メール本文にある[Confirm subscription]をクリックします。

 

routetable-change-notificationサブスクリプション作成

securitygroup-change-notification トピック作成

 

Amazon SNSトピックの作成は以上です。

 

 

■Amazon EventBridgeルール作成

ルートテーブルが作成・変更・削除される際のAPIコールをトリガーにAmazon SNSに通知を送信するためのAmazon EventBridgeルールを作成します。

 

 

↓Amazon EventBridgeコンソール画面にいきます。

 

securitygroup-change-notification EventBridge設定

 

↓左のナビゲーションペインから[ルール]をクリックし、[ルールを作成]を押します。

 

securitygroup-change-notification EventBridge設定

 

↓ルールの [名前]を入力します。[説明]は任意で入力します。[イベントパス]はdefault、[ルールタイプ]は[イベントパターンを持つルール]を選択し、[次へ]をクリックします。

 

項目 設定値
名前 saitou-test-rule-routetable-change
説明 任意

 

routetable-change-notificationEventBridge作成

 

↓[イベントソース]を[AWS イベントまたは EventBridge パートナーイベント]を選択します。

 

securitygroup-change-notification EventBridge設定

 

↓[作成のメソッド]で[パターンフォームを使用する]を選択します。

 

securitygroup-change-notification EventBridge設定

 

↓[イベントソース]で、[AWSサービス]を選択し、[AWSのサービス]で、[EC2]を選択します。

 

securitygroup-change-notification EventBridge設定

 

↓[イベントタイプ]で、[AWS API Call via CloudTrail] を選択します。

 

securitygroup-change-notification EventBridge設定

 

↓[特定のオペレーション]を選択し、以下のAPIコールを一つずつ追加していきます。

 

  • CreateRoute:ルートテーブルにルートを作成
  • DeleteRoute:ルートテーブルから指定されたルートを削除
  • CreateRouteTable:ルートテーブルを作成
  • DeleteRouteTable:ルートテーブルを削除
  • AssociateRouteTable:ルートテーブルをサブネットに関連付け
  • DisassociateRouteTable:ルートテーブルをサブネットから関連付けを解除

 

EventBridgeルール作成

 

↓入力が完了したら、[次へ]をクリックします。

 

EventBridgeルール作成

 

↓[ターゲットタイプ]で[AWSのサービス]を選択し、[ターゲットを選択]で[SNSトピック]を選択、[トピック]で作成したトピックを選択します。

 

securitygroup-change-notification EventBridge設定

 

↓[追加設定]で[ターゲット入力を設定]から[入力トランスフォーマー]を選択し、[入力トランスフォーマーを設定]をクリックします。

 

securitygroup-change-notification EventBridge設定

 

↓[ターゲット入力トランスフォーマー]の[入力パス]で以下を入力します。

 

{
  "requestParameters": "$.detail.requestParameters",
  "userName": "$.detail.userIdentity.userName",
  "eventID": "$.detail.eventID",
  "eventName1": "$.detail.eventName",
  "eventName2": "$.detail.userIdentity.eventName",
  "eventTime": "$.detail.eventTime",
  "accountId": "$.account",
  "routeTableId1": "$.detail.responseElements.routeTable.routeTableId",
  "routeTableId2": "$.detail.requestParameters.routeTableId",
  "awsRegion": "$.region"
}

 

EventBridgeルール作成

 

↓[テンプレート]で以下を入力します。

 

"ルートテーブルで以下のイベントが発生しました。"

"イベント名 : <eventName1> <eventName2> "
"イベントID : <eventID> "
"ルートテーブルID : <routeTableId1> <routeTableId2> "
"発生アカウントID : <accountId> "
"発生時間 : <eventTime> UTC "
"発生リージョン : <awsRegion> "
"ユーザーID : <userName> "
"変更内容 : <requestParameters> "

"※作成・削除の場合、変更内容は空白です。"

 

EventBridgeルール作成

 

↓入力が完了したら、[確認]します。

 

securitygroup-change-notification EventBridge設定

 

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

 

securitygroup-change-notification EventBridge設定

 

↓[タグ]は任意で設定し、[次へ]をクリックします。

 

securitygroup-change-notification EventBridge設定

 

↓問題なければ、[ルールの作成]をクリックします。

 

securitygroup-change-notification EventBridge設定

 

 

構築は以上です。

 

 

■動作確認

動作確認をしていきます。今回トリガーになるAPIコールは以下の通りです。作成・変更・削除作業を行い、通知が来るのか試してみましょう。

 

  • CreateRoute:ルートテーブルにルートを作成
  • DeleteRoute:ルートテーブルから指定されたルートを削除
  • CreateRouteTable:ルートテーブルを作成
  • DeleteRouteTable:ルートテーブルを削除
  • AssociateRouteTable:ルートテーブルをサブネットに関連付け
  • DisassociateRouteTable:ルートテーブルをサブネットから関連付けを解除
     

 

1,ルートテーブル作成

まずはルートテーブルを作成します。

 

項目 設定値
ルートテーブル名 saitou-test-change-notification-rtb

 

ルートテーブル作成

 

作成しましたら、メールボックスを見てみましょう。

 

ルートテーブル変更検知

 

来てますね。

 

2,ルートテーブルにルートを作成

作成したルートテーブルにルートを作成します。

 

ルートテーブル変更検知

 

作成しましたら、メールボックスを見てみましょう。

 

ルートテーブル変更検知

 

 

3,ルートを削除

作成したルートテーブルから指定されたルートを削除します。

 

ルートテーブル変更検知

 

 

ルートテーブル変更検知

 

4,サブネット関連付け

作成したルートテーブルをサブネットに関連付けしてみます。

 

ルートテーブル変更検知

ルートテーブル変更検知

ルートテーブル変更検知

 

5,サブネット関連解除

作成したルートテーブルをサブネットから関連付けを解除してみます。

 

ルートテーブル変更検知

ルートテーブル変更検知

ルートテーブル変更検知

 

7,ルートテーブル削除

さいごに、ルートテーブルを削除します。

 

ルートテーブル変更検知

ルートテーブル変更検知

 

確認は以上です。

 

 

■おまけ

 

AWSTemplateFormatVersion: "2010-09-09"

Description:
  Create SNS,EventBridge

Parameters:
  myMailAddress:
    Type: String

Resources:
  mySNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub ${AWS::StackName}-topic
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-topic

  mySubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: !Ref myMailAddress
      Protocol: email
      TopicArn: !Ref mySNSTopic

  myEventRule: 
    Type: AWS::Events::Rule
    Properties: 
      Name: !Sub ${AWS::StackName}-rule
      Description: "EventRule"
      EventPattern: |
        {
          "source": ["aws.ec2"],
          "detail-type": ["AWS API Call via CloudTrail"],
          "detail": {
            "eventSource": ["ec2.amazonaws.com"],
            "eventName": ["CreateRoute", "DeleteRoute", "CreateRouteTable", "DeleteRouteTable", "AssociateRouteTable", "DisassociateRouteTable"]
          }
        }
      Targets: 
        - 
          Arn: 
            Ref: "mySNSTopic"
          Id: "myTopic001"
          InputTransformer:
            InputPathsMap:
              "requestParameters": "$.detail.requestParameters",
              "userName": "$.detail.userIdentity.userName",
              "eventID": "$.detail.eventID",
              "eventName1": "$.detail.eventName",
              "eventName2": "$.detail.userIdentity.eventName",
              "eventTime": "$.detail.eventTime",
              "accountId": "$.account",
              "routeTableId1": "$.detail.responseElements.routeTable.routeTableId",
              "routeTableId2": "$.detail.requestParameters.routeTableId",
              "awsRegion": "$.region"
            InputTemplate: |
              "ルートテーブルで以下のイベントが発生しました。"
              "イベント名 : <eventName1> <eventName2> "
              "イベントID : <eventID> "
              "ルートテーブルID : <routeTableId1> <routeTableId2> "
              "発生アカウントID : <accountId> "
              "発生時間 : <eventTime> UTC "
              "発生リージョン : <awsRegion> "
              "ユーザーID : <userName> "
              "変更内容 : <requestParameters> "
              "※作成・削除の場合、変更内容は空白です。"

  EventTopicPolicy:
    Type: 'AWS::SNS::TopicPolicy'
    Properties:
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: 'sns:Publish'
            Resource: '*'
      Topics:
        - !Ref mySNSTopic

Outputs:
  myEventRuleArn:
    Value: !GetAtt myEventRule.Arn
    Export:
      Name: !Sub ${AWS::StackName}-rule

  mySNSTopicArn:
    Value: !GetAtt mySNSTopic.TopicArn
    Export:
      Name: !Sub ${AWS::StackName}-topic

 

 

まとめ:Amazon EventBridgeでルートテーブルの変更を検知してみる

ルートテーブルはネットワークトラフィックの送信先を制御する役割を担っています。

 

ルートテーブルの変更は意図しない通信を招き、最悪システムが動作しなくなるかもしれません。もしルートテーブルが変更されたら、即対応できるようにしておきたいですよね。

 

TransitGatewayルートテーブルの変更検知にも応用できますので、次回の記事で紹介します。

 

 

参考リンク:AWS公式ドキュメント
 

↓ほかの協栄情報メンバーもAmazon EventBridgeに関する記事を公開しています。ぜひ参考にしてみてください。

 

■EventBridgeとLambdaを使用してRDS自動停止を作成する(watanabe)
https://cloud5.jp/autostop-rds/

 

■APIGateway + Lambda + DynamoDB を利用したサーバレス構築ハンズオン(INAMURA)
https://cloud5.jp/apigateway-lambda-dynamodb-serverless/

 

■『タグなしポイ捨てリソース、ダメ絶対!!』Config非準拠判定でSNSメール通知構築ハンズオン(INAMURA)
https://cloud5.jp/sns-notification-at-config/

 

Last modified: 2023-04-08

Author