IDS 導入をcfn化してみた
やりたいこと
以下 IDS(Deep Discovery Inspector)を CloudFormation を使って自動展開できるようにする
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 に登録したものから指定
インスタンスタイプ、ボリュームサイズは以下システム要件から選択
ENI については以下で作成する検査/管理 ポートを指定します。
※ここで EC2 内でポートを作成しない理由として、EIP をアタッチする際に ENI の論理IDが必要でそれを CloudFormation 上で取得するためとなります。
この際、管理ポートは eth1、検査ポートが eth0 となる仕様です。
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
検査/管理 ポート
上述のとおり、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
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
管理 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
NLB
検査ポートの前段に置く NLB を作成します。
これを作成することで複数の IDS インスタンスで検査を行い冗長性を確保することが可能となります。 (このテンプレートでは1つのインストールを作成します)
基本的にはドキュメントをおこしているだけですが特質すべき点としては、ヘルスチェックで使用するポートが 4789/UDP と 14789/TCP を使用している点かなーと思いました。
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
ミラーリングの設定
以下ブログで記載したテンプレートを展開します。
この際、本テンプレートで出力された NLB の ARN を指定します。
最後に
IDS(Deep Discovery Inspector)を CloudFormation を使って自動展開してみました。
あんまり使う方はいないかもしれないですが、どなたかの参考になれば幸いです。
Discussion