Deep Security Manager 11.0 On WindowsをCloudFormationを使って構築してみた

おはようございます、もきゅりんです。
10連休ってどこも混んでるのだろうし、ずっと家でぱそこんを触っているわけにもいかないだろうし、
どこで何すればいいのだろう、と今から悩みが尽きません。

贅沢な悩みですね。

今回は、掲題の通り、CloudFormationで最新(2019年3月22日現在)のDeepSecurityManager11.0をWindowsサーバーにインストールする記事となります。

DeepSecurityManager(以下、DSM)を利用する機会はあまりないかとは思いますが、どなたかの参考になるかも、ということでブログ化しておきます。

また、今回利用したCloudFormationテンプレートも掲載しておきます。 手を加えたり修正することで、他の方が利用できたら幸いです。

ただし、ご利用の際は下記の環境、前提、注意事項などの記載はよくお読みの上、お使い下さい。

はじめに

当稿は、[Deep SecurityでEC2徹底防御]シリーズの記事に大きく依存した内容となっております。
なので、DeepSecurityって...という感じの場合、まずは[Deep SecurityでEC2徹底防御]シリーズを読むことをお勧めします。

とても整理されて読みやすいため、DeepSecurityとは?が、スラスラと頭に入ってくること間違いないありません。

環境

環境については、DeepSecurityManager システム要件から下記の通りです。

  • Windows Server 2016 (64bit)
  • PostgreSQL 9.6.x (Amazon RDS for PostgreSQL)

前提

  • VPCが作成済みであること (デフォルトでも可)

  • RDS用のサブネットが作成済みであること (デフォルトでも可)

  • DSMをインストールするサーバーを置くパブリックサブネットが作成済みであること

  • サーバーにログインする鍵を作成済みであること

  • Deep Securityの検証・評価のために30日間の体験版アクティベーションコードを取得していること
    (右記から簡単に取得ができます。) Trend Micro Deep Security | 体験版ダウンロード

作成されるリソース

このテンプレートで作成されるリソースは以下です。

  • 最新のWindows Server 2016のEC2インスタンス

  • Amazon RDS for PostgreSQL 9.6.11

  • DBサブネットグループ

  • セキュリティグループ

ポート番号/プロトコル 用途 許可対象
4119/tcp DSMのWeb管理画面の待受ポート 管理端末IP(後述)
4120/tcp DSA/DSRからDSMへ通信するポート DSA/DSR(今回はVPCのネットワークアドレス)
4122/tcp DSAからDSRへ通信するポート DSA(今回はVPCのネットワークアドレス)

ポイント

  • 環境変数でRDSを別に起動するかどうか分岐
  • SSMのパラメータストアからWindows Server 2016の最新AMIを取得
  • PowerShellでCドライブにディレクトリ作ってDSM11.0をダウンロード

注意事項

  • 必要な管理端末のIPは自身で追加・更新する
  • DBインスタンスの削除保護設定は無効
  • DBのパブリックアクセスは無効
  • オプショングループはデフォルト
  • デフォルトのMultiAZ設定はfalse
  • DSMサーバーのメモリが最低でも4GBが必須なので、t2.mediumにしている
  • PostgreSQLのversionは直打ち

CloudFormationテンプレート

こちらで対応します。利用するパラメータはjsonファイルで例示しておきます。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Deep Secutiry Manager Windows 11.0 template",
  "Parameters": {
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "EnvType": {
      "Description": "must specify prod or test. If you specify prod, RDS PostgreSQL DB Instance create and use it.",
      "Default": "stg",
      "Type": "String",
      "AllowedValues": [
        "prod",
        "stg"
      ]
    },
    "DBMasterUsername": {
      "Description": "DSM DB master username",
      "Type": "String"
    },
    "DBMasterPassword": {
      "Description": "DSM DB master password",
      "NoEcho": "true",
      "Type": "String"
    },
    "DBName": {
      "Description": "DSM DB Name",
      "Default": "dsm",
      "Type": "String"
    },
    "VPC": {
      "Description": "VPC ID : vpc-XXXXXXXX",
      "Type": "String"
    },
    "VPCCIDR": {
      "Description": "VPC CIDR Address : x.x.x.x/x",
      "Type": "String"
    },
    "FrontendSubnet": {
      "Description": "will deploy DSM Instance : subnet-XXXXXXXX",
      "Type": "String"
    },
    "DBSubnetGroup": {
      "Description": "will apply to RDS DB instance",
      "Type": "String",
      "ConstraintDescription": "must specify if you specify prod environment."
    },
    "PostgreSQLOptionGroup": {
      "Description": "the Option Group name for PostgreSQL RDS",
      "Type": "String",
      "Default": "default:postgres-9-6"
    },
    "ImageId": {
      "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default": "/aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base"
    }
  },
  "Mappings": {
    "StackConfig": {
      "DeepSecurityManagerServer": {
        "InstanceType": "t2.medium",
        "AllocatedStorage": "80"
      },
      "DeepSecurityDBServer": {
        "InstanceType": "db.t2.small",
        "AllocatedStorage": "20",
        "DBName": "dsm"
      }
    },
    "IpAddress": {
      "Client": {
        "home": "YOUR_IP/32"
      }
    }
  },
  "Conditions": {
    "CreateProdResources": {
      "Fn::Equals": [
        {
          "Ref": "EnvType"
        },
        "prod"
      ]
    }
  },
  "Resources": {
    "DeepSecurityManagerSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "GroupDescription": "Deep Security Manager",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "3389",
            "ToPort": "3389",
            "CidrIp": {
              "Fn::FindInMap": [
                "IpAddress",
                "Client",
                "home"
              ]
            }
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "4119",
            "ToPort": "4119",
            "CidrIp": {
              "Fn::FindInMap": [
                "IpAddress",
                "Client",
                "home"
              ]
            }
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "4120",
            "ToPort": "4120",
            "CidrIp": {
              "Ref": "VPCCIDR"
            }
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "4122",
            "ToPort": "4122",
            "CidrIp": {
              "Ref": "VPCCIDR"
            }
          }
        ]
      }
    },
    "DeepSecurityManagerSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {
          "Ref": "DeepSecurityManagerSecurityGroup"
        },
        "IpProtocol": "tcp",
        "FromPort": "4120",
        "ToPort": "4120",
        "CidrIp": {
          "Fn::Join": [
            "",
            [
              {
                "Ref": "DSMInstanceEIP"
              },
              "/32"
            ]
          ]
        }
      }
    },
    "DeepSecurityManagerSecurityGroupIngress2": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {
          "Ref": "DeepSecurityManagerSecurityGroup"
        },
        "IpProtocol": "tcp",
        "FromPort": "4122",
        "ToPort": "4122",
        "CidrIp": {
          "Fn::Join": [
            "",
            [
              {
                "Ref": "DSMInstanceEIP"
              },
              "/32"
            ]
          ]
        }
      }
    },
    "DeepSecurityAgentSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "GroupDescription": "Enable Deep Security Agent access via port 4118 from DSM",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "4118",
            "ToPort": "4118",
            "SourceSecurityGroupId": {
              "Ref": "DeepSecurityManagerSecurityGroup"
            }
          }
        ]
      }
    },
    "PostgreSQLSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Condition": "CreateProdResources",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "GroupDescription": "Enable PostgreSQL access via port 5432 from VPC",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "5432",
            "ToPort": "5432",
            "CidrIp": {
              "Ref": "VPCCIDR"
            }
          }
        ]
      }
    },
    "DSMInstanceEIP": {
      "Type": "AWS::EC2::EIP",
      "Properties": {
        "Domain": "vpc",
        "InstanceId": {
          "Ref": "DSMInstance"
        }
      }
    },
    "DSMInstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": {
          "Fn::FindInMap": [
            "StackConfig",
            "DeepSecurityManagerServer",
            "InstanceType"
          ]
        },
        "BlockDeviceMappings": [
          {
            "DeviceName": "/dev/sda1",
            "Ebs": {
              "VolumeSize": {
                "Fn::FindInMap": [
                  "StackConfig",
                  "DeepSecurityManagerServer",
                  "AllocatedStorage"
                ]
              }
            }
          }
        ],
        "KeyName": {
          "Ref": "KeyName"
        },
        "SubnetId": {
          "Ref": "FrontendSubnet"
        },
        "SourceDestCheck": "false",
        "ImageId": {
          "Ref": "ImageId"
        },
        "SecurityGroupIds": [
          {
            "Ref": "DeepSecurityManagerSecurityGroup"
          }
        ],
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [
              "",
              [
                "<script>",
                "\n",
                "PowerShell -ExecutionPolicy RemoteSigned -Command {Set-ExecutionPolicy RemoteSigned}",
                "\n",
                "</script>",
                "\n",
                "<powershell>",
                "\n",
                "cfn-init.exe -v -s ",
                {
                  "Ref": "AWS::StackId"
                },
                " -r DSMInstance --region ",
                {
                  "Ref": "AWS::Region"
                },
                "\n",
                "</powershell>"
              ]
            ]
          }
        },
        "Tags": [
          {
            "Key": "Name",
            "Value": "DeepSecurityManager"
          }
        ]
      },
      "Metadata": {
        "AWS::CloudFormation::Init": {
          "config": {
            "files": {
              "C:\\DL_DSM.ps1": {
                "content": {
                  "Fn::Join": [
                    "",
                    [
                      "New-Item C:\\Classmethod -ItemType Directory",
                      "\n",
                      "$client = (new-object System.Net.WebClient)",
                      "\n",
                      "Invoke-WebRequest -Uri \"https://files.trendmicro.com/products/deepsecurity/en/11.0/Manager-Windows-11.0.319.x64.exe\" -OutFile \"C:\\Classmethod\\Manager-Windows-11.0.319.x64.exe\"",
                      "\n"
                    ]
                  ]
                }
              }
            },
            "commands": {
              "01_install_DeepSecurityManager": {
                "command": "powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -File C:\\DL_DSM.ps1"
              }
            }
          }
        }
      }
    },
    "DSMDBInstance": {
      "Type": "AWS::RDS::DBInstance",
      "Condition": "CreateProdResources",
      "Properties": {
        "DBInstanceClass": {
          "Fn::FindInMap": [
            "StackConfig",
            "DeepSecurityDBServer",
            "InstanceType"
          ]
        },
        "DBName": {
          "Ref": "DBName"
        },
        "StorageType": "gp2",
        "AllocatedStorage": {
          "Fn::FindInMap": [
            "StackConfig",
            "DeepSecurityDBServer",
            "AllocatedStorage"
          ]
        },
        "Engine": "postgres",
        "EngineVersion": "9.6.11",
        "MultiAZ": "false",
        "MasterUsername": {
          "Ref": "DBMasterUsername"
        },
        "MasterUserPassword": {
          "Ref": "DBMasterPassword"
        },
        "BackupRetentionPeriod": "7",
        "DBSubnetGroupName": {
          "Ref": "DBSubnetGroup"
        },
        "OptionGroupName": {
          "Ref": "PostgreSQLOptionGroup"
        },
        "PreferredBackupWindow": "19:30-20:00",
        "PreferredMaintenanceWindow": "sat:00:00-sat:00:30",
        "PubliclyAccessible": false,
        "VPCSecurityGroups": [
          {
            "Ref": "PostgreSQLSecurityGroup"
          }
        ]
      }
    }
  },
  "Outputs": {
    "DeepSecurityManagerURL": {
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Ref": "DSMInstanceEIP"
            },
            ":4119/"
          ]
        ]
      },
      "Description": "-"
    }
  }
}
# parameter.json
[
  {
    "ParameterKey": "KeyName",
    "ParameterValue": "YOUR_SECRET_KEY"
  },
  {
    "ParameterKey": "EnvType",
    "ParameterValue": "prod"
  },
  {
    "ParameterKey": "DBMasterUsername",
    "ParameterValue": "root"
  },
  {
    "ParameterKey": "DBMasterPassword",
    "ParameterValue": "dbpasswd"
  },
  {
    "ParameterKey": "VPC",
    "ParameterValue": "VPC_ID"
  },  
  {
    "ParameterKey": "VPCCIDR",
    "ParameterValue": "172.31.0.0/16"
  },
  {
    "ParameterKey": "FrontendSubnet",
    "ParameterValue": "SUBNET-ID"
  },
  {
    "ParameterKey": "DBSubnetGroup",
    "ParameterValue": "default"
  }  
]

実際にスタックを作成します。

aws cloudformation create-stack --stack-name dsm-win16-posgresql --template-body file://`pwd`/hogehoge.template --parameters file://`pwd`/parameter.json

DSMインストール

僕はMacを使っているので、Parallels ClientでWindowsに接続します。

参考: macOSからWindowsにリモートデスクトップする時はParallels Clientがキーボード入力も快適でオススメ

CドライブにDLしたDSM11.0をインストールします。

必要な情報を入力していきます。

インストールします。

ログインして確認。

最後に

PostgreSQLの対応されるようになったようなので、リーズナブルにDBの利用ができるようになりましたね。

どこかの誰かのお役に立ったら何よりです。

参考

[Deep SecurityでEC2徹底防御] #01 概要とAWS環境でのインストール

[小ネタ] AWS Management ConsoleからWindows Server 2016日本語版AMIを探す

パラメーターストアから最新のWindows AMIのIDを取得する

macOSからWindowsにリモートデスクトップする時はParallels Clientがキーボード入力も快適でオススメ