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

2019.03.25

おはようございます、もきゅりんです。 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",
"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",
"",
"\n",
"cfn-init.exe -v -s ",
{
"Ref": "AWS::StackId"
},
" -r DSMInstance --region ",
{
"Ref": "AWS::Region"
},
"\n",
""
]
]
}
},
"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がキーボード入力も快適でオススメ