Trend Micro Cloud One – Workload Security(旧DSaaS)をPrivateLinkで利用する

記事タイトルとURLをコピーする

こんにちは。技術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)は東京リージョンにあります。 f:id:swx-nagasaki:20200930170833p:plain

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を購入する。

弊社参考ブログ:

AWS Marketplace で Trend Micro Deep Security as a Service のライセンスを契約して、検証環境で使えるようにしてみる - サーバーワークスエンジニアブログ

  • DSMでアカウント連携

参考リンク:

Add an AWS account using a cross-account role - Workload Security | Trend Micro Cloud One™ Documentation

  • Route53 Private Hosted Zoneを東京リージョンのVPCへ関連付け

参考リンク:

Route 53 プライベートホストゾーンを別の AWS アカウントの VPC に関連付ける

  • 保守対象EC2インスタンスへDSAのインストール及び有効化

インストールについての参考リンク:

Deep Security長期サポートソフトウェア| Deep Security

有効化についての参考リンク:

コマンドラインの基本 | Deep Security

  • EC2インスタンスのセキュリティグループ設定

参考リンク:

ポート番号、URL、およびIPアドレス - Workload Security | Trend Micro Cloud One™ ドキュメント

最後に

閉域にあるEC2インスタンスが、DSMの管理コンソール上で以下のように【管理対象(オンライン)】になればPrivateLink経由で利用ができます。 また、Cloud Oneは弊社で取り扱っておりますので、導入をご検討されているお客様はぜひお問合せください。 f:id:swx-nagasaki:20200930184431j:plain

その他参考資料

AWS PrivateLinkとの統合 - Workload Security | Trend Micro Cloud One™ ドキュメント