こんにちは。技術5課 長崎です。
AWS環境にてTrend Micro Cloud One – Workload Security(旧DSaaS)をインターネットを介さずにPrivateLink経由で利用する機会が ありましたので、設定方法をまとめておこうと思います。
用語(略称)
- Trend Micro Cloud One – Workload Security(旧DSaaS) → Cloud One
- DeepSecurity Manager → DSM
- DeepSecurity Agent → DSA
PrivateLinkで利用するメリット
- インターネット接続が不可なサブネットに配置しているサーバ(DBサーバなど)を監視対象とする事ができる。
前提
現在(2020/9月)、Cloud Oneのサービスエンドポイントはバージニア(us-east-1)にしかない為、他リージョンのリソースを保守したい場合はバージニア(us-east-1)にサービスエンドポイント用の環境を構築する必要があります。
今回、サービスエンドポイント用の環境はCloudFormationで作成していきます。
想定している構成
東京リージョン側のアカウントとバージニアリージョン側のアカウントは別で、VPCピアリングを設定します。 保守対象のリソース(EC2)は東京リージョンにあります。
CloudFormationテンプレートによるリソース作成①
まず、以下のCloudFormationテンプレートをバージニアリージョンで流します。 パラメータは環境に合わせて適宜入力していきます。
※CloudFormationで別アカウント間VPCピアリング接続を確立する為、東京リージョン側で事前にクロスアカウントIAMロールを作成しておく必要あり。(以下リンクを参照)
チュートリアル: 別の AWS アカウントで Amazon VPC とピア接続する - AWS CloudFormation
AWSTemplateFormatVersion: "2010-09-09" Description: "DSaaS PrivateLink" Parameters: VPCCIDR: Type: String Description: "DSaaS VPC CIDR ex)172.31.0.0/16" Subnet01CIDR: Type: String Description: "DSaaS Subnet CIDR ex)172.31.1.0/24" Subnet02CIDR: Type: String Description: "DSaaS Subnet CIDR ex)172.31.2.0/24" PeerVpcId: Type: String Description: "Peer VPC ID" PeerOwnerId: Type: String Description: "Peer VPC Owner AWS Acount ID" PeerRegion: Type: String Description: "Peer VPC Region ex)ap-northeast-1" PeerRoleArn: Type: String Description: "Cross Acount Access Role Arn" DestinationCidrBlock: Type: String Description: "Peer VPC CIDR" Resources: EC2VPCEndpoint: Type: "AWS::EC2::VPCEndpoint" Properties: VpcEndpointType: "Interface" VpcId: !Ref EC2VPC ServiceName: !Sub "com.amazonaws.vpce.${AWS::Region}.vpce-svc-0ca160f19663f348e" PolicyDocument: | { "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] } SubnetIds: - !Ref EC2Subnet - !Ref EC2Subnet2 PrivateDnsEnabled: false SecurityGroupIds: - !Ref EC2SecurityGroup EC2VPCEndpoint2: Type: "AWS::EC2::VPCEndpoint" Properties: VpcEndpointType: "Interface" VpcId: !Ref EC2VPC ServiceName: !Sub "com.amazonaws.vpce.${AWS::Region}.vpce-svc-0ecb2dc36c34b3aef" PolicyDocument: | { "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] } SubnetIds: - !Ref EC2Subnet - !Ref EC2Subnet2 PrivateDnsEnabled: false SecurityGroupIds: - !Ref EC2SecurityGroup EC2VPCEndpoint3: Type: "AWS::EC2::VPCEndpoint" Properties: VpcEndpointType: "Interface" VpcId: !Ref EC2VPC ServiceName: !Sub "com.amazonaws.vpce.${AWS::Region}.vpce-svc-01a733ad6b4b0afc1" PolicyDocument: | { "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] } SubnetIds: - !Ref EC2Subnet - !Ref EC2Subnet2 PrivateDnsEnabled: false SecurityGroupIds: - !Ref EC2SecurityGroup EC2VPCEndpoint4: Type: "AWS::EC2::VPCEndpoint" Properties: VpcEndpointType: "Interface" VpcId: !Ref EC2VPC ServiceName: !Sub "com.amazonaws.vpce.${AWS::Region}.vpce-svc-04912367f0b0c73d9" PolicyDocument: | { "Statement": [ { "Action": "*", "Effect": "Allow", "Principal": "*", "Resource": "*" } ] } SubnetIds: - !Ref EC2Subnet - !Ref EC2Subnet2 PrivateDnsEnabled: false SecurityGroupIds: - !Ref EC2SecurityGroup EC2VPC: Type: "AWS::EC2::VPC" Properties: CidrBlock: !Ref VPCCIDR EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: "default" Tags: - Key: "Name" Value: "DSaaS-VPC" EC2Subnet: Type: "AWS::EC2::Subnet" Properties: AvailabilityZone: !Sub "${AWS::Region}a" CidrBlock: !Ref Subnet01CIDR VpcId: !Ref EC2VPC MapPublicIpOnLaunch: false EC2Subnet2: Type: "AWS::EC2::Subnet" Properties: AvailabilityZone: !Sub "${AWS::Region}c" CidrBlock: !Ref Subnet02CIDR VpcId: !Ref EC2VPC MapPublicIpOnLaunch: false EC2VPCPeeringConnection: Type: "AWS::EC2::VPCPeeringConnection" Properties: Tags: - Key: "Name" Value: "DSaaS-Peer" PeerVpcId: !Ref PeerVpcId PeerOwnerId: !Ref PeerOwnerId PeerRegion: !Ref PeerRegion PeerRoleArn: !Ref PeerRoleArn VpcId: !Ref EC2VPC EC2RouteTable: Type: "AWS::EC2::RouteTable" Properties: VpcId: !Ref EC2VPC RouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref EC2RouteTable SubnetId: !Ref EC2Subnet RouteTableAssociation2: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref EC2RouteTable SubnetId: !Ref EC2Subnet2 EC2Route: Type: "AWS::EC2::Route" Properties: DestinationCidrBlock: !Ref DestinationCidrBlock VpcPeeringConnectionId: !Ref EC2VPCPeeringConnection RouteTableId: !Ref EC2RouteTable DependsOn: EC2VPCPeeringConnection EC2SecurityGroup: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: "sgr-DSaaS" GroupName: "sgr-DSaaS" VpcId: !Ref EC2VPC SecurityGroupIngress: - CidrIp: !Ref DestinationCidrBlock FromPort: 4122 IpProtocol: "tcp" ToPort: 4122 - CidrIp: !Ref DestinationCidrBlock FromPort: 4120 IpProtocol: "tcp" ToPort: 4120 - CidrIp: "0.0.0.0/0" FromPort: 4118 IpProtocol: "tcp" ToPort: 4118 - CidrIp: !Ref DestinationCidrBlock FromPort: 443 IpProtocol: "tcp" ToPort: 443 SecurityGroupEgress: - CidrIp: "0.0.0.0/0" IpProtocol: "-1" Outputs: EC2VPCOutput: Value: !Ref EC2VPC Export: Name: EC2VPCid
作成されるリソース
- VPC(DNSホスト名・DNS解決:有効)
- プライベートサブネット(2つ)
- Cloud Oneサービスエンドポイント(4つ)
- セキュリティグループ(サービスエンドポイント用)
- VPCピアリング
- ルートテーブル(VPCピアリング向けのルートを含む)
CloudFormationテンプレートによるリソース作成②
次に以下のCloudFormationテンプレートをバージニアリージョンで流します。 パラメータは適宜入力します。
AWSTemplateFormatVersion: "2010-09-09" Description: "DSaaS PrivateLink" Parameters: EC2VPCEndpointDnsName: Type: String Description: "com.amazonaws.vpce.us-east-1.vpce-svc-0ca160f19663f348e DnsName" EC2VPCEndpoint2DnsName: Type: String Description: "com.amazonaws.vpce.us-east-1.vpce-svc-0ecb2dc36c34b3aef DnsName" EC2VPCEndpoint3DnsName: Type: String Description: "com.amazonaws.vpce.us-east-1.vpce-svc-01a733ad6b4b0afc1 DnsName" EC2VPCEndpoint4DnsName: Type: String Description: "com.amazonaws.vpce.us-east-1.vpce-svc-04912367f0b0c73d9 DnsName" Resources: Route53HostedZone: Type: "AWS::Route53::HostedZone" Properties: Name: "deepsecurity.trendmicro.com." VPCs: - VPCRegion: !Ref AWS::Region VPCId: !ImportValue EC2VPCid Route53RecordSet: Type: "AWS::Route53::RecordSet" Properties: Name: "agents.deepsecurity.trendmicro.com." Type: "A" AliasTarget: HostedZoneId: "Z7HUB22UULQXV" DNSName: !Ref EC2VPCEndpoint2DnsName EvaluateTargetHealth: false HostedZoneId: !Ref Route53HostedZone Route53RecordSet2: Type: "AWS::Route53::RecordSet" Properties: Name: "app.deepsecurity.trendmicro.com." Type: "A" AliasTarget: HostedZoneId: "Z7HUB22UULQXV" DNSName: !Ref EC2VPCEndpoint4DnsName EvaluateTargetHealth: false HostedZoneId: !Ref Route53HostedZone Route53RecordSet3: Type: "AWS::Route53::RecordSet" Properties: Name: "dsmim.deepsecurity.trendmicro.com." Type: "A" AliasTarget: HostedZoneId: "Z7HUB22UULQXV" DNSName: !Ref EC2VPCEndpoint3DnsName EvaluateTargetHealth: false HostedZoneId: !Ref Route53HostedZone Route53RecordSet4: Type: "AWS::Route53::RecordSet" Properties: Name: "relay.deepsecurity.trendmicro.com." Type: "A" AliasTarget: HostedZoneId: "Z7HUB22UULQXV" DNSName: !Ref EC2VPCEndpointDnsName EvaluateTargetHealth: false HostedZoneId: !Ref Route53HostedZone
作成されるリソース
- Route53 Private Hosted Zone(deepsecurity.trendmicro.com)
- Cloud One サービスエンドポイントのDNSに紐づけたエイリアスレコード
DSAからDSMにアクセスする際のサービスアドレス(agents.deepsecurity.trendmicro.comなど)でサービスエンドポイントのプライベートIPを返す事で、 DSA(EC2)-->エンドポイント-->Cloud Oneという経路でのアクセスを可能とする為、Route53 PrivateHostedZoneの作成が必要。
その他実施作業
東京リージョンのVPCルートテーブルにてVPCピアリング宛てのルートを追加
AWS MarketplaceでCloud Oneを購入する。
弊社参考ブログ:
- DSMでアカウント連携
参考リンク:
- Route53 Private Hosted Zoneを東京リージョンのVPCへ関連付け
参考リンク:
Route 53 プライベートホストゾーンを別の AWS アカウントの VPC に関連付ける
- 保守対象EC2インスタンスへDSAのインストール及び有効化
インストールについての参考リンク:
Deep Security長期サポートソフトウェア| Deep Security
有効化についての参考リンク:
- EC2インスタンスのセキュリティグループ設定
参考リンク:
ポート番号、URL、およびIPアドレス - Workload Security | Trend Micro Cloud One™ ドキュメント
最後に
閉域にあるEC2インスタンスが、DSMの管理コンソール上で以下のように【管理対象(オンライン)】になればPrivateLink経由で利用ができます。 また、Cloud Oneは弊社で取り扱っておりますので、導入をご検討されているお客様はぜひお問合せください。
その他参考資料
AWS PrivateLinkとの統合 - Workload Security | Trend Micro Cloud One™ ドキュメント