Terraform を使って Dome9 に 完全保護モードで AWS アカウントを連携してみた
こんにちは、岩城です。
最近、Dome9 を触る機会が増えています。そんな中、Terraform に Dome9 Provider があることを知りました。
Check Point CloudGuard Dome9 Provider
本エントリでは、Terraform を使い Dome9 に対し自身の AWS アカウントを完全保護モード(読み取り/書き込み)で連携するところまでを試してみたいと思います。
やってみた
大まかな手順
コードはこちらに置きました。
Terraform 実行までの大まかな手順は以下のとおりです。なお、本エントリでは、backend に S3 を指定しているため、AWS CLI を利用する前提になっていますので注意してください。必須要件ではありませんので、ローカル管理やTerraform Cloud管理など環境に合わせて適宜修正してください。
- Dome9 コンソールから Credential を取得する
- Dome9 コンソールから IAM ロールに指定する信頼されたエンティティと外部 ID を取得する
- 上記情報を元に Terraform のコードの当該部分を修正する
- terraform apply する
- D確認する
Dome9 コンソールから Credential を取得する
Terraform から Dome9 の API を実行するためには、Dome9 の Credential が必要になります。Credential の発行は Dome9 コンソールから行います。
Dome9 コンソールにログインした後、左ペインの SETTINGS
> Credentials
> API キーの作成
から Credential を発行します。
ID と Secret が作成されますので控えておきます。特に Secret については、この場面でしか確認することができないので注意してください。分からなくなった場合は、再度 API キーを作成してください。
Dome9 コンソールから IAM ロールに指定する信頼されたエンティティと外部 ID を取得する
今回は、完全保護モードで Dome9 を利用を想定しているので、自身の AWS アカウントのリソース情報を取得したり、SecurityGroup の付け外しを行うため、Dome9 用の IAM ロールと IAM ポリシーを作成します。IAM ロール作成の際、信頼されたエンティティと外部 ID の設定を Dome9 から求められます。このため、以下 URL から信頼されたエンティティに指定する AWS アカウント ID と外部 ID を控えておき、IAM ロール作成時に使用します。
https://secure.dome9.com/v2/aws/create-role
Terraform のコードを修正する
コードはこちらに置きました。あくまで参考としてください。
ざっくりコードについて説明していきます。
tfstate を S3 で管理しているため、backend の設定をしています。必須要件ではないので、tfstate をローカルで管理したり、Terraform Cloud で管理しても良いと思います。 また、Terraform 実行環境や AWS CLI 実行環境の構築手順については触れませんので、必要に応じて各自で調べてください。
今回の構成の Terraform では AWS と Dome9 の2つの Provider を利用します。このため、Provider 毎にディレクトリを分けています。Terraform を実行する際は、それぞれのディレクトリ直下で terraform apply
します。
. └── terraform ├── aws │ ├── iam.tf │ ├── main.tf │ ├── outputs.tf │ └── terraform.tfvars └── dome9 ├── dome9.tf ├── main.tf └── terraform.tfvars
Terraform から Dome9 を操作するため、dome9
ディレクトリ配下の terraform.tfvars
に Credential 情報を持たせます。
access_id = "API キーの AccessId" secret_key = "API キーの Secret"
aws
ディレクトリ配下の terraform.tfvars
に、IAM ロールで指定する信頼されたエンティティと外部 ID を記載します。
dome9-account-id = "Dome9 の AWS アカウントID (自身のアカウントとは別)" dome9-external-id = "外部 ID"
aws
ディレクトリ配下の outputs.tf
は、Dome9 でアカウント連携時に IAM ロールの Arn と指定した外部 ID が必要になり、dome9
ディレクトリ配下から参照するため output しています。
output "dome9-external-id" { value = var.dome9-external-id } output "dome9-connect-role-arn" { value = aws_iam_role.dome9-connect.arn }
IAM ロールには Dome9 から指定されたポリシーをアタッチしています。Dome9 に AWS アカウントを連携する際、モニター(読み取り専用)モードと完全保護(読み取り/書き込み)モードを選択できます。今回は完全保護モードを想定したポリシーをアタッチしています。
variable "dome9-account-id" {} variable "dome9-external-id" {} resource "aws_iam_role" "dome9-connect" { assume_role_policy = data.aws_iam_policy_document.dome9-connect.json description = "Dome9-Connect" force_detach_policies = false max_session_duration = 3600 name = "Dome9-Connect" path = "/" tags = {} } data "aws_iam_policy_document" "dome9-connect" { statement { actions = ["sts:AssumeRole"] condition { test = "StringEquals" variable = "sts:ExternalId" values = [var.dome9-external-id] } effect = "Allow" principals { type = "AWS" identifiers = ["arn:aws:iam::${var.dome9-account-id}:root"] } } } resource "aws_iam_policy" "dome9-readonly-policy" { description = "dome9-readonly-policy" name = "dome9-readonly-policy" path = "/" policy = data.aws_iam_policy_document.dome9-readonly-policy.json } data "aws_iam_policy_document" "dome9-readonly-policy" { statement { sid = "Dome9ReadOnly" actions = [ "cloudtrail:LookupEvents", "dynamodb:DescribeTable", "elasticfilesystem:Describe*", "elasticache:ListTagsForResource", "firehose:Describe*", "firehose:List*", "guardduty:Get*", "guardduty:List*", "kinesis:List*", "kinesis:Describe*", "kinesisvideo:Describe*", "kinesisvideo:List*", "logs:Describe*", "logs:Get*", "logs:FilterLogEvents", "lambda:List*", "s3:List*", "sns:ListSubscriptions", "sns:ListSubscriptionsByTopic", "waf-regional:ListResourcesForWebACL" ] effect = "Allow" resources = ["*"] } } resource "aws_iam_policy" "dome9-write-policy" { description = "dome9-write-policy" name = "dome9-write-policy" path = "/" policy = data.aws_iam_policy_document.dome9-write-policy.json } data "aws_iam_policy_document" "dome9-write-policy" { statement { sid = "Dome9Write" actions = [ "ec2:AuthorizeSecurityGroupEgress", "ec2:AuthorizeSecurityGroupIngress", "ec2:CreateSecurityGroup", "ec2:DeleteSecurityGroup", "ec2:RevokeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress", "ec2:ModifyNetworkInterfaceAttribute", "ec2:CreateTags", "ec2:DeleteTags" ] effect = "Allow" resources = ["*"] } } resource "aws_iam_role_policy_attachment" "dome9-readonly-policy" { policy_arn = aws_iam_policy.dome9-readonly-policy.arn role = aws_iam_role.dome9-connect.name } resource "aws_iam_role_policy_attachment" "dome9-write-policy" { policy_arn = aws_iam_policy.dome9-write-policy.arn role = aws_iam_role.dome9-connect.name } resource "aws_iam_role_policy_attachment" "aws-securityaudit" { policy_arn = "arn:aws:iam::aws:policy/SecurityAudit" role = aws_iam_role.dome9-connect.name } resource "aws_iam_role_policy_attachment" "aws-inspector-readonly-access" { policy_arn = "arn:aws:iam::aws:policy/AmazonInspectorReadOnlyAccess" role = aws_iam_role.dome9-connect.name }
実行
準備が整ったら各ディレクトリに移動して terraform apply
します。Dome9 へのアカウント連携の前に、IAM ロールが作成されている必要があるので IAM ロールから作成します。
$ cd aws $ terraform plan $ terraform apply
IAM ロールの作成が成功したら、Dome9 のアカウント連携を行います。
$ cd ../dome9 $ terraform plan $ terraform apply
正常終了した場合は、dome9
というアカウントが追加され、ステータスがチェック(正常)されます。
おわりに
Terraform を使って、IAM ロール作成含めて Dome9 で AWS アカウント連携を試してみました。Terraform でどこまで Dome9 を管理できるのか見えてきたので、別エントリで紹介したいと思います。
本エントリがどなたかのお役に立てれば幸いです。
合わせて読みたい
Dome9 がどういった製品なのかについては、以下エントリをご確認ください。
【登壇しました】「AWSアカウントの現状を把握できてますか? それ、Dome9でよく見えますよ。」 #cmdevio2019sec
Developers.IO 2019 in OSAKAで「Dome9ではじめるAWSセキュリティリスク管理」を話しました #cmdevio