🐷

IDS 導入をcfn化してみた

2024/03/11に公開

やりたいこと

以下 IDS(Deep Discovery Inspector)を CloudFormation を使って自動展開できるようにする
https://files.trendmicro.com/jp/ucmodule/tmdd/66/DDI6.6_AWS_DG.pdf
EC2 コンソールからポチポチ都度やるのではなく、サクッと複数環境に導入するために展開部分を自動化したいと思いました。

展開構成

以下2パターンがサポートされています

①NLB + ENI がミラーリングターゲット

②NLB がミラーリングターゲット

今回は②の NLB のみをミラーリングターゲットとする構成で CloudFormation テンプレートを作成していきます。

いきなり結論

以下の CloudFormation テンプレートでスタックを作成する

IDS(Deep Discovery Inspector)

バージョン 6.7 English Version
管理者ガイド: https://docs.trendmicro.com/o-help/pdf/96515cfe-aa03-464c-acd9-3f132e7ff962/DDI_AG_(Deep_Discovery_Inspector_Administrators_Guide)=GUID-9316E73C-EB97-4CD9-8188-6D44E8202933=9=en-us=.pdf

注意点

本製品を使う場合、Activation Code が必要なため、このテンプレートではあくまで展開までを行います。

CLoudFormation テンプレート

AWSTemplateFormatVersion: 2010-09-09
Description: Create a cloudformation template

Parameters:
  InspectSubnet:
    Description: Enter the first subnet id
    Type: AWS::EC2::Subnet::Id

  ManagemntSubnet:
    Description: Enter the second subnet id
    Type: AWS::EC2::Subnet::Id

  MyIP:
    Description: Enter the your ip. used for DDI access
    Type: String

  VPCCIDR:
    Description: Enter the VPC CIDR for detection
    Type: String

  VPCID:
    Description: Enter the VPC ID
    Type: AWS::EC2::VPC::Id

Mappings:
  # vDDI 6.7 Image
  AMIID:
    af-south-1:
      vDDI: ami-0a0549b567b022232
    ap-east-1:
      vDDI: ami-0d658070b7a07659c
    ap-northeast-1:
      vDDI: ami-0112d7e191c596d97
    ap-northeast-2:
      vDDI: ami-07a5a6f50a6ebcd94
    ap-northeast-3:
      vDDI: ami-0abd85262c10200e0
    ap-south-1:
      vDDI: ami-0b6aa8e0ad0c828b1
    ap-southeast-1:
      vDDI: ami-075543a269f7d18f0
    ap-southeast-2:
      vDDI: ami-08e5e43dec2ab4792
    ap-southeast-3:
      vDDI: ami-0db945a570fd10b5e
    ca-central-1:
      vDDI: ami-01c0458b4ebd1fc41
    eu-central-1:
      vDDI: ami-00e6a459e48ae32a2
    eu-north-1:
      vDDI: ami-09c5896f8fcad9f51
    eu-south-1:
      vDDI: ami-043407346805274d1
    eu-west-1:
      vDDI: ami-0716de3fb78e94d6b
    eu-west-2:
      vDDI: ami-0c2330a83af56a1e2
    eu-west-3:
      vDDI: ami-0100dff284920533a
    me-south-1:
      vDDI: ami-067f7b421f994fc0f
    sa-east-1:
      vDDI: ami-04055028462390766
    us-east-1:
      vDDI: ami-05f5c14cacd1b42f4
    us-east-2:
      vDDI: ami-03f744ece527c0870
    us-west-1:
      vDDI: ami-0de09a026092bab70
    us-west-2:
      vDDI: ami-07a5e9300ecae998d

Resources:
  vDDI:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap
        - AMIID
        - !Ref AWS::Region
        - vDDI
      InstanceType: m5.2xlarge
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 500
      NetworkInterfaces:
        - DeviceIndex: 0
          NetworkInterfaceId: !Ref DataPort
        - DeviceIndex: 1
          NetworkInterfaceId: !Ref MgmtPort
      Tags:
        - Key: Name
          Value: vDDI

  MgmtPort:
    Type: AWS::EC2::NetworkInterface
    Properties:
      Description: Mgmt Port for Console access
      GroupSet:
        - !Ref vDDIMgmtSecurityGroup
      SubnetId: !Ref ManagemntSubnet
      Tags:
        - Key: Name
          Value: vDDIMgmtPort

  DataPort:
    Type: AWS::EC2::NetworkInterface
    Properties:
      Description: Data Port For Inspection
      GroupSet:
        - !Ref vDDIPortSecurityGroup
      SubnetId: !Ref InspectSubnet
      Tags:
        - Key: Name
          Value: vDDIDataPort

  vDDIMgmtSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow SSH and HTTP
      VpcId: !Ref VPCID
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: !Ref MyIP
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0

  vDDIPortSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow SSH and HTTP
      VpcId: !Ref VPCID
      SecurityGroupIngress:
        - IpProtocol: -1
          CidrIp: !Ref VPCCIDR
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0

  MgmtEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  EIPAssociate:
    DependsOn: vDDI
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: !GetAtt MgmtEIP.AllocationId
      NetworkInterfaceId: !Ref MgmtPort

# NLB for Data port
  InternetNLB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Sub NLB-${AWS::StackName}
      Scheme: internal
      LoadBalancerAttributes:
        - Key: deletion_protection.enabled
          Value: false
      SecurityGroups:
        - !Ref vDDIPortSecurityGroup
      Subnets:
        - !Ref InspectSubnet
      Type: network

  NLBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref TargetGroup
          Type: forward
      LoadBalancerArn: !Ref InternetNLB
      Port: 4789
      Protocol: UDP

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      VpcId: !Ref VPCID
      Name: !Sub target-group-${AWS::StackName}
      Protocol: UDP
      Port: 4789
      HealthCheckProtocol: TCP
      HealthCheckPort: 14789
      TargetType: instance
      Targets:
        - Id: !Ref vDDI

Outputs:
  vDDIConsole:
    Description: vDDI console link.
    Value: !Sub https://${MgmtEIP}

  NLBArn:
    Description: NLB Arn.
    Value: !Ref InternetNLB

そもそも IDS #とは

IDSとは Intrusion Detection Systemの略で「侵入検知システム」とも呼ばれる。 ネットワーク上を流れるパケットを監視したり、サーバー上の受信データやログを調べたりして、何らかの不正侵入の兆候が確認できた場合に、管理者へ警告メールを通知するなどのアクションを起こすシステム。
https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/words/ids.html#:~:text=IDSとは,のアクションを起こすシステム。

シンプルに書くと IDS はネットワーク上のパケットを検査して不審な動作を検出するものですね。IPS や FW と異なるのは通信の遮断は行わないという点です。

独自のルールや機械学習を使用したアノマリー検出を持った製品が多い印象です。
また、遮断は行わないため、もし異常な通信が確認できた場合は別のソリューションを使用して遮断を行う必要があります。
※検査環境の通信がクリーンであることをチェックするために使うこともあります

Deep Discovery Inspector #とは

Deep Discovery Inspectorは、トレンドマイクロの第3世代の脅威管理ソリューションで、APTや標的型攻撃の可視性、洞察、および制御を強化するよう設計されています。
世界中の標的型攻撃を徹底的に調査し、主なお客さまからの聞き取りを重ね、主要な1,000の組織と政府機関で構成される特殊製品諮問委員会に参加してきた結果、トレンドマイクロは、Deep Discovery Inspectorを新たに発表することになりました。
Deep Discovery Inspectorは、重要なセキュリティ情報、警告、およびレポートをIT管理者に提供します。
Deep Discovery Inspectorは、オフライン監視モードで設置できます。スイッチのミラーポートに接続することで、ネットワークの切断を最低限または、発生させることなく、ネットワークトラフィックを監視できます。
https://ohc.blob.core.windows.net/o-help/manual/1fc295e4-44cc-4862-b298-e5a364c2fb05/DDI6.6_Readme.html

トレンドマイクロ社製の IDS 製品となっています。
オンプレ環境ではスイッチのミラーポートに接続することで通信を検査し不正なトラフィックを検出するものです。

CloudFormation テンプレートで作成されるものの詳細

作成されるものリスト

以下のコンポーネントが作成されます。

  • IDS インスタンス
  • 検査/管理 ポート
  • Security Group
  • 管理 IP
  • NLB

IDS インスタンス

IDS インスタンスを作成します。
AMI の ID は各リージョンで Mappings に登録したものから指定
インスタンスタイプ、ボリュームサイズは以下システム要件から選択
https://docs.trendmicro.com/o-help/manual/96515cfe-aa03-464c-acd9-3f132e7ff962/ddi_6.7_aws.pdf#page=16
ENI については以下で作成する検査/管理 ポートを指定します。
※ここで EC2 内でポートを作成しない理由として、EIP をアタッチする際に ENI の論理IDが必要でそれを CloudFormation 上で取得するためとなります。
この際、管理ポートは eth1、検査ポートが eth0 となる仕様です。
https://docs.trendmicro.com/o-help/manual/96515cfe-aa03-464c-acd9-3f132e7ff962/ddi_6.7_aws.pdf#page=28

  vDDI:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap
        - AMIID
        - !Ref AWS::Region
        - vDDI
      InstanceType: m5.2xlarge
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 500
      NetworkInterfaces:
        - DeviceIndex: 0
          NetworkInterfaceId: !Ref DataPort
        - DeviceIndex: 1
          NetworkInterfaceId: !Ref MgmtPort
      Tags:
        - Key: Name
          Value: vDDI

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html

検査/管理 ポート

上述のとおり、EIP をアタッチする際に ENI の論理IDが必要なため、EC2 インスタンスの作成部分ではなく切り離して ENI を個別に作成します。

  MgmtPort:
    Type: AWS::EC2::NetworkInterface
    Properties:
      Description: Mgmt Port for Console access
      GroupSet:
        - !Ref vDDIMgmtSecurityGroup
      SubnetId: !Ref ManagemntSubnet
      Tags:
        - Key: Name
          Value: vDDIMgmtPort

  DataPort:
    Type: AWS::EC2::NetworkInterface
    Properties:
      Description: Data Port For Inspection
      GroupSet:
        - !Ref vDDIPortSecurityGroup
      SubnetId: !Ref InspectSubnet
      Tags:
        - Key: Name
          Value: vDDIDataPort

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html

Security Group

管理ポートにはコンソールアクセスへのために指定した IP アドレスからの TCP/443 への通信を許可します。
また、検査ポートは VPC 内のすべてのトラフィックを許可します。

  vDDIMgmtSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow SSH and HTTP
      VpcId: !Ref VPCID
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: !Ref MyIP
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0

  vDDIPortSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow SSH and HTTP
      VpcId: !Ref VPCID
      SecurityGroupIngress:
        - IpProtocol: -1
          CidrIp: !Ref VPCCIDR
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-securitygroup.html

管理 IP

管理コンソールへのアクセス用に EIP を取得し、管理ポートの NIC へ紐づけます。

  MgmtEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  EIPAssociate:
    DependsOn: vDDI
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: !GetAtt MgmtEIP.AllocationId
      NetworkInterfaceId: !Ref MgmtPort

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eipassociation.html

NLB

検査ポートの前段に置く NLB を作成します。
これを作成することで複数の IDS インスタンスで検査を行い冗長性を確保することが可能となります。 (このテンプレートでは1つのインストールを作成します)
基本的にはドキュメントをおこしているだけですが特質すべき点としては、ヘルスチェックで使用するポートが 4789/UDP と 14789/TCP を使用している点かなーと思いました。
https://docs.trendmicro.com/o-help/manual/96515cfe-aa03-464c-acd9-3f132e7ff962/ddi_6.7_aws.pdf#page=45
NLB はターゲットが一つでも問題ないの意外ですよね(ALBだとターゲットが複数AZにないとエラー出力するので)

# NLB for Data port
  InternetNLB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Sub NLB-${AWS::StackName}
      Scheme: internal
      LoadBalancerAttributes:
        - Key: deletion_protection.enabled
          Value: false
      SecurityGroups:
        - !Ref vDDIPortSecurityGroup
      Subnets:
        - !Ref InspectSubnet
      Type: network

  NLBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref TargetGroup
          Type: forward
      LoadBalancerArn: !Ref InternetNLB
      Port: 4789
      Protocol: UDP

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      VpcId: !Ref VPCID
      Name: !Sub target-group-${AWS::StackName}
      Protocol: UDP
      Port: 4789
      HealthCheckProtocol: TCP
      HealthCheckPort: 14789
      TargetType: instance
      Targets:
        - Id: !Ref vDDI

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html

ミラーリングの設定

以下ブログで記載したテンプレートを展開します。
この際、本テンプレートで出力された NLB の ARN を指定します。
https://zenn.dev/ano/articles/dde1ed425f983c

最後に

IDS(Deep Discovery Inspector)を CloudFormation を使って自動展開してみました。
あんまり使う方はいないかもしれないですが、どなたかの参考になれば幸いです。

Discussion