Amazon Inspectorで意図的に手頃な検出をいっぱい出す
はじめに
皆様こんにちは、あかいけです。
Amazon Inspectorの抑制ルールや、Security Hubの自動化ルールを検証したいと思ったことはありますか?
私はあります。
ただ、いざ検証しようとすると手頃な検出がなく、困ってしまいました。
GuardDutyであればcreate-sample-findingsというサンプル検出を出すコマンドがありますが、Inspectorには同等のものがありません。
Inspectorは実際のリソースをスキャンして脆弱性を突き合わせる仕組みなので、検出が欲しければ、脆弱性のある状態を実際に作ってスキャンさせるしかないわけです。
そんなわけで今回は、EC2で意図的にInspectorの検出をいっぱい出してみます。
やること
古いAMIからEC2インスタンスを起動するだけです。
Inspectorはインスタンス上のパッケージの脆弱性(CVE)をスキャンするので、リリースから時間の経ったAMIを使うと、その分だけ未修正の脆弱性がたまっており、大量の検出を出せます。
検証用のダミー検出がほしいだけであれば、これが一番手っ取り早いです。
※ 前提として対象リージョンでInspectorのEC2スキャンを有効化しておいてください
AMIを探す
まずは古代のAMIを探します。
--include-deprecatedを付けて非推奨のAMIも対象にし、作成日の古い順に並べてみます。
aws ec2 describe-images --owners amazon --include-deprecated \
--filters "Name=name,Values=al2023-ami-2023.*-kernel-6.1-x86_64" \
"Name=state,Values=available" \
--query 'sort_by(Images,&CreationDate)[].[CreationDate,ImageId,Name,DeprecationTime]' \
--output text | head -5
2023年2月。
なかなか良さそうです。
2023-02-24T05:02:33.000Z ami-06b9a1f1f27895002 al2023-ami-2023.0.20230222.1-kernel-6.1-x86_64 2023-03-27T22:00:00.000Z
2023-03-13T23:52:35.000Z ami-067871d950411e643 al2023-ami-2023.0.20230315.0-kernel-6.1-x86_64 2023-08-25T17:30:00.000Z
2023-03-22T20:19:18.000Z ami-02a2700d37baeef8b al2023-ami-2023.0.20230322.0-kernel-6.1-x86_64 2023-08-25T17:30:00.000Z
2023-04-04T18:27:21.000Z ami-079a2a9ac6ed876fc al2023-ami-2023.0.20230329.0-kernel-6.1-x86_64 2023-08-25T17:30:00.000Z
2023-04-18T23:37:44.000Z ami-01b32aa8589df6208 al2023-ami-2023.0.20230419.0-kernel-6.1-x86_64 2023-08-25T17:30:00.000Z
起動する
先ほど調べたAMIのIDをami_idに渡して、EC2を起動します。
今回は以下のTerraformを使います。
なおInspectorのエージェントベーススキャンの対象になるにはSSM管理下に入っている必要があるので、AmazonSSMManagedInstanceCoreを付けたインスタンスプロファイルもあわせて作成しています。
terraform {
required_version = ">= 1.15"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = var.region
}
###############################################################################
# Variables
###############################################################################
variable "region" {
type = string
default = "ap-northeast-1"
}
variable "ami_id" {
type = string
}
variable "instance_type" {
type = string
default = "t3.micro"
}
variable "name" {
type = string
default = "inspector-test"
}
###############################################################################
# IAM: SSM 管理下に置くためのインスタンスプロファイル
###############################################################################
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
resource "aws_iam_role" "ssm" {
name = "${var.name}-ssm-role"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
resource "aws_iam_role_policy_attachment" "ssm_core" {
role = aws_iam_role.ssm.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
resource "aws_iam_instance_profile" "ssm" {
name = "${var.name}-ssm-profile"
role = aws_iam_role.ssm.name
}
###############################################################################
# EC2
###############################################################################
resource "aws_instance" "this" {
ami = var.ami_id
instance_type = var.instance_type
iam_instance_profile = aws_iam_instance_profile.ssm.name
metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
}
root_block_device {
volume_size = 8
volume_type = "gp3"
encrypted = true
delete_on_termination = true
}
tags = {
Name = var.name
Purpose = "amazon-inspector-detection-test"
}
}
###############################################################################
# Outputs
###############################################################################
output "instance_id" {
value = aws_instance.this.id
}
output "check_ssm" {
description = "SSM 管理下になったかの確認コマンド(数分かかる)"
value = "aws ssm describe-instance-information --region ${var.region} --filters Key=InstanceIds,Values=${aws_instance.this.id} --query 'InstanceInformationList[].[InstanceId,PlatformName,PlatformVersion,AgentVersion]' --output table"
}
output "check_findings" {
description = "Inspector の検出結果確認コマンド(初回スキャンまで10〜30分程度)"
value = "aws inspector2 list-findings --region ${var.region} --filter-criteria '{\"resourceId\":[{\"comparison\":\"EQUALS\",\"value\":\"${aws_instance.this.id}\"}]}' --query 'findings[].{Sev:severity,Title:title}' --output table"
}
applyしたら、まずはSSMの管理対象になっているかを確認します。
数分待って以下のように表示されればOKです。
aws ssm describe-instance-information \
--region ap-northeast-1 \
--filters Key=InstanceIds,Values=i-08846885b4c065daa \
--query 'InstanceInformationList[].[InstanceId,PlatformName,PlatformVersion,AgentVersion]' \
--output table
---------------------------------------------------------------
| DescribeInstanceInformation |
+----------------------+----------------+-------+-------------+
| i-08846885b4c065daa | Amazon Linux | 2023 | 3.1.1927.0 |
+----------------------+----------------+-------+-------------+
しばらく待つと
SSMの管理対象になってからすぐ、Inspectorの初回スキャンが完了しました。
aws inspector2 list-coverage \
--region ap-northeast-1
--filter-criteria '{"resourceId":[{"comparison":"EQUALS","value":"i-08846885b4c065daa"}]}' \
--query 'coveredResources[].{Status:scanStatus.statusCode,Reason:scanStatus.reason,Last:resourceMetadata.ec2}' \
--output json
[
{
"Status": "ACTIVE",
"Reason": "SUCCESSFUL",
"Last": {
"tags": {
"Name": "inspector-test",
"Purpose": "amazon-inspector-detection-test"
},
"amiId": "ami-06b9a1f1f27895002",
"platform": "LINUX"
}
}
]
そして初回スキャンが終わると、大量の検出が押し寄せてきます。
今回は起動から数分で検知が発生しました。
カウントしてみたら、3340個の検出がありました。
これで抑制ルールを検証し放題です。

Security Hub側も、ほぼ同じタイミングで検出が反映されていました。
これで自動化ルールも検証し放題ですね。

なお今回はEC2で試しましたが、ECSなどのコンテナでも考え方は同じです。
古いイメージをもとにタスクを動かせば、コンテナイメージのスキャンで同じように検出を出せます。
コンテナ環境で検証したい場合は、そちらで試してみてください。
さいごに
以上、Inspectorで意図的に手頃な検出を出す方法でした。
古いAMIから起動するだけと非常にシンプルですが、抑制ルールや自動化ルールの検証には十分すぎるほどの検出が手に入ります。
また検証が終わったら、必ずこの脆弱なインスタンスを削除しておきましょう。
同じように検証用の検出を探している方の助けになれば幸いです。









