Terraform で Amazon Inspector を導入して、CloudWatch Events で定期実行させるための手順。
Terraform は v0.11.2 を使っています。
Inspector の導入
Inspector を導入するには、Assessment targets (評価ターゲット) と Assessment templates (評価テンプレート) を設定する必要があります。
Assessment targets の設定
Terraform で Assessment targets を設定するには、aws_inspector_resource_group
, aws_inspector_assessment_target
リソースを使用します。
こんな感じです。
variable "project" { default = "my-big-project" }
variable "stage" { default = "production" }
resource "aws_inspector_resource_group" "inspector" {
tags = {
project = "${var.project}"
stage = "${var.stage}"
inspector = "true"
}
}
resource "aws_inspector_assessment_target" "inspector" {
name = "my-inspector-target"
resource_group_arn = "${aws_inspector_resource_group.inspector.arn}"
}
aws_inspector_resource_group
では、対象となるインスタンスを特定するための条件を記述します。
上記の例だと、以下のタグが設定されているインスタンスを対象にします。
Name | Value |
---|---|
project | my-big-project |
stage | production |
inspector | true |
aws_inspector_assessment_target
では、aws_inspector_resource_group
で定義した条件を元に Assessment targets を作成します。
Assessment templates の設定
Terraform で Assessment templates を設定するには、aws_inspector_assessment_template
リソースを使用します。
こんな感じです。
variable "inspector-rule" = {
type = "list"
default = [
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-gHP9oWNT",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-knGBhqEu"
]
}
resource "aws_inspector_assessment_template" "inspector" {
name = "my-inspector-template"
target_arn = "${aws_inspector_assessment_target.inspector.arn}"
duration = 3600
rules_package_arns = [ "${var.inspector-rule}" ]
}
output "assessment_template_arn" {
value = "${aws_inspector_assessment_template.inspector.arn}"
}
rules_package_arns
では、利用可能な Inspector rule package の ARN を設定します。
variable にしておくと、後で rule package を変更したい時に楽ですね。
こんな感じで、使用する rule package を変更できます。
"inspector-rule" = [
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq"
]
使用できる rule package は、aws-cli で取得してください。
# パッケージ一覧の表示
$ aws --region ap-northeast-1 inspector list-rules-packages
{
"rulesPackageArns": [
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-gHP9oWNT",
"arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-knGBhqEu"
]
}
# 詳細を確認
$ aws --region ap-northeast-1 inspector describe-rules-packages \
--rules-package-arns "arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu"
{
"rulesPackages": [
{
"description": "The CIS Security Benchmarks program provides well-defined, un-biased and consensus-based industry best practicesto help organizations assess and improve their security.\n\nThe rules in this package help establish a secure configuration posture for the following operating systems:\n\n - Amazon Linux version 2015.03 (CIS benchmark v1.1.0)\n \n ",
"version": "1.0",
"name": "CIS Operating System Security Configuration Benchmarks",
"arn": "arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu",
"provider": "Amazon Web Services, Inc."
}
],
"failedItems": {}
}
参考URL: Terraform v0.8.5でAWS Inspectorに対応します
これで terraform apply
すれば Assessment targets, templates が作成されます。
動作確認
実際に Inspector が実施されるか確認して見ましょう。
$ aws inspector start-assessment-run \
--assessment-template-arn arn:aws:inspector:ap-northeast-1:************:target/0-xxxxxxxx/template/0-xxxxxxxx
{
"assessmentRunArn": "arn:aws:inspector:ap-northeast-1:************:target/0-xxxxxxxx/template/0-xxxxxxxx/run/0-7WNjqgGu"
}
実行状況の確認は aws inspector describe-assessment-runs
で
$ aws inspector describe-assessment-runs \
--assessment-run-arns arn:aws:inspector:ap-northeast-1:************:target/0-QOvPswHA/template/0-uCIUy636/run/0-n9nnWOem
CloudWatch Events Schedule による定期実行
当初は CloudWatch Events で定期実行するには Lambda から呼び出すようにしなければいけませんでした。
しかし、CloudWatch Events から直接 Inspector を実行できるようになったため、Lambda を使用しなくても aws_cloudwatch_event_target
と aws_cloudwatch_event_rule
だけで定期実行設定が可能です。
CloudWatch Events で使用する IAM ロールの作成
まずは、CloudWatch Events で使用する IAM ロールを作ります。
esource "aws_iam_role" "run_inspector_role" {
name = "cloudwatch-events-run-inspector-role"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
resource "aws_iam_policy" "run_inspector_policy" {
name = "cloudwatch-events-run-inspector-policy"
description = ""
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"inspector:StartAssessmentRun"
],
"Resource": "*"
}
]
}
POLICY
}
resource "aws_iam_role_policy_attachment" "run_inspector_role" {
role = "${aws_iam_role.run_inspector_role.name}"
policy_arn = "${aws_iam_policy.run_inspector_policy.arn}"
}
CloudWatch Events への登録
CloudWatch Events に登録するために aws_cloudwatch_event_target
リソースと aws_cloudwatch_event_rule
を作りましょう。
variable "schedule" { default = "cron(00 19 ? * Sun *)" }
resource "aws_cloudwatch_event_target" "inspector" {
target_id = "inspector"
rule = "${aws_cloudwatch_event_rule.inspector.name}"
arn = "${aws_inspector_assessment_template.inspector.arn}"
role_arn = "${aws_iam_role.run_inspector_role.arn}"
}
resource "aws_cloudwatch_event_rule" "inspector" {
name = "run-inspector-event-rule"
description = "Run Inspector"
schedule_expression = "${var.schedule}"
}
schedule_expression の cron()
は UTC で設定する必要があるので注意してください。
記述方法は、以下を参考に
参考URL: Rate または Cron を使用したスケジュール式
EC2 への IAM Role の設定と、ユーザーデータによる Inspector エージェントのインストール
評価ターゲットとなる EC2 には、Inspector エージェントがインストールされていて、適切なインスタンスロールが設定されている必要があります。
導入するには、こんな感じ
インスタンスロール
Inspector エージェントを使用するために必要なポリシーをアタッチしたインスタンスロールの作成はこんな感じです。
resource "aws_iam_role" "instance_role" {
name = "my-ec2-role"
path = "/"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
resource "aws_iam_instance_profile" "instance_role" {
name = "my-ec2-role"
role = "${aws_iam_role.instance_role.name}"
}
resource "aws_iam_policy" "inspector" {
name = "my-ec2-iam-policy-inspector"
description = ""
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeAvailabilityZones",
"ec2:DescribeCustomerGateways",
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:DescribeInternetGateways",
"ec2:DescribeNatGateways",
"ec2:DescribeNetworkAcls",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribePrefixLists",
"ec2:DescribeRegions",
"ec2:DescribeRouteTables",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcEndpoints",
"ec2:DescribeVpcPeeringConnections",
"ec2:DescribeVpcs",
"ec2:DescribeVpn",
"ec2:DescribeVpnGateways",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeRules",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth"
],
"Resource": "*"
}
]
}
POLICY
}
resource "aws_iam_role_policy_attachment" "inspector" {
role = "${aws_iam_role.instance_role.name}"
policy_arn = "${aws_iam_policy.inspector.arn}"
}
ユーザーデータによる inspector エージェントのインストール
OS は Amazon Linux を想定してます。
ユーザーデータに書いておけば、インスタンス起動直後に Inspector エージェントインストールできますね。
参考URL: Amazon Inspector エージェントをインストールする
ssh-key.pem
と ssh-key.pem.pub
は ssh-keygen
で適当に作っておきましょう。
## AMI
##
data "aws_ami" "amazonlinux" {
most_recent = true
owners = ["amazon"]
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "root-device-type"
values = ["ebs"]
}
filter {
name = "name"
values = ["amzn-ami-hvm-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
filter {
name = "block-device-mapping.volume-type"
values = ["gp2"]
}
}
## SSH Key Pair
##
resource "aws_key_pair" "deployer" {
key_name = "ssh-key-name"
public_key = "${file(ssh-key.pem.pub)}"
}
## EC2
##
resource "aws_instance" "ec2" {
ami = "${data.aws_ami.amazonlinux.id}"
instance_type = "t2.micro"
key_name = "${aws_key_pair.deployer.key_name}"
iam_instance_profile = "${aws_iam_instance_profile.instance_role.name}"
user_data = <<USERDATA
# !/bin/bash
# install inspector agent
cd /tmp
/usr/bin/curl -O https://d1wk0tztpsntt1.cloudfront.net/linux/latest/install
/bin/bash install -u false
/bin/rm -f install
USERDATA
tags {
project = "${var.project}"
stage = "${var.stage}"
inspector = "true"
}
}
現場からは以上です。