[新サービス]大幅に使いやすくなりECRの脆弱性診断にも対応したAmazon Inspector v2が発表されました! #reinvent

re:Invent 2021の中で脆弱性診断を行うAmazon Inspectorの新バージョンが発表されました!大幅に機能が強化されています!
2021.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

みなさん、re:Inventエキサイトしてますか!?(挨拶

早速新サービスの情報が飛び込んできました!

AWSの脆弱性診断サービスであるAmazon Inspectorのv2が発表されました!

AWS announces the new Amazon Inspector for continual vulnerability management

上記では new Amazon Inspectorと表記されていますがマネジメントコンソールでは aws.amazon.com/inspector/v2/であり、サービスエンドポイントはinspector2.amazonaws.comなのでv2でいいかなと思います。このあたりはAWS WAFでも同じような表現のブレがあったので細かいことは気にせずに行きましょう。

既存のAmazon Inspectorから何が変わったのか?概要をまとめた後実際に使っていきます。

新バージョン概要

箇条書きでまとめるとこんな感じ。

  • AWS Organizationsと連携して組織全体でスキャンできる
  • 有効化するだけで自動でスキャン
  • 15日無料トライアル
  • EventBridgeと連携して自動対応
  • ECRスキャンサポート
  • SSMエージェントでスキャン
  • EC2とECRの脆弱性を統合ビューで確認
  • Snykから脆弱性インテリジェンスを取得
  • すでに各セキュリティ製品へ連携可能
  • 19リージョンで利用可能、東京あり、大阪なし

既存のInspectorはEC2のみでスキャンを行うためにいろんな設定が必要でしたが、そういった手間がなくなって、ECR Repository Scanningと連携できるようになっていい感じになっています。

やってみた

実際に使っていきましょう。ユーザーガイドも新しくなっているので参考にしましょう。

有効化

Amazon Inspectorにアクセスすると、新しい画面が表示されます。URLがv2になっていますね。既存のInspectorではターゲットとテンプレートを作成してスキャンを実行する、という流れでしたが、v2では最初に有効化という作業を行ったら、あとは自動的でスキャンされます。楽ちん!

有効化をすすめるとService-Linked Roleを作りますよ、という画面。最近のサービスっぽくなりましたね。既存のInspectorにアクセスしたい場合には左側にリンクがありますのでこれを使いましょう。Classicという表現はAWS WAFでも同じでしたね。

作成されるRoleの権限は以下のとおりです。当然ですがECRからイメージを取得したりSSMでスキャンするための権限があります。そしてManagedRulesという文字は今後要注目ですね。

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "TirosPolicy",
          "Effect": "Allow",
          "Action": [
              "directconnect:DescribeConnections",
              "directconnect:DescribeDirectConnectGatewayAssociations",
              "directconnect:DescribeDirectConnectGatewayAttachments",
              "directconnect:DescribeDirectConnectGateways",
              "directconnect:DescribeVirtualGateways",
              "directconnect:DescribeVirtualInterfaces",
              "ec2:DescribeAvailabilityZones",
              "ec2:DescribeCustomerGateways",
              "ec2:DescribeInstances",
              "ec2:DescribeInternetGateways",
              "ec2:DescribeManagedPrefixLists",
              "ec2:DescribeNatGateways",
              "ec2:DescribeNetworkAcls",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DescribePrefixLists",
              "ec2:DescribeRegions",
              "ec2:DescribeRouteTables",
              "ec2:DescribeSecurityGroups",
              "ec2:DescribeSubnets",
              "ec2:DescribeTransitGatewayAttachments",
              "ec2:DescribeTransitGatewayConnects",
              "ec2:DescribeTransitGatewayPeeringAttachments",
              "ec2:DescribeTransitGatewayRouteTables",
              "ec2:DescribeTransitGatewayVpcAttachments",
              "ec2:DescribeTransitGateways",
              "ec2:DescribeVpcEndpointServiceConfigurations",
              "ec2:DescribeVpcEndpoints",
              "ec2:DescribeVpcPeeringConnections",
              "ec2:DescribeVpcs",
              "ec2:DescribeVpnConnections",
              "ec2:DescribeVpnGateways",
              "ec2:GetManagedPrefixListEntries",
              "ec2:GetTransitGatewayRouteTablePropagations",
              "ec2:SearchTransitGatewayRoutes",
              "elasticloadbalancing:DescribeListeners",
              "elasticloadbalancing:DescribeLoadBalancerAttributes",
              "elasticloadbalancing:DescribeLoadBalancers",
              "elasticloadbalancing:DescribeRules",
              "elasticloadbalancing:DescribeTags",
              "elasticloadbalancing:DescribeTargetGroups",
              "elasticloadbalancing:DescribeTargetHealth",
              "network-firewall:DescribeFirewall",
              "network-firewall:DescribeFirewallPolicy",
              "network-firewall:DescribeResourcePolicy",
              "network-firewall:DescribeRuleGroup",
              "network-firewall:ListFirewallPolicies",
              "network-firewall:ListFirewalls",
              "network-firewall:ListRuleGroups",
              "tiros:CreateQuery",
              "tiros:GetQueryAnswer"
          ],
          "Resource": [
              "*"
          ]
      },
      {
          "Sid": "PackageVulnerabilityScanning",
          "Effect": "Allow",
          "Action": [
              "ecr:BatchGetImage",
              "ecr:BatchGetRepositoryScanningConfiguration",
              "ecr:DescribeImages",
              "ecr:DescribeRegistry",
              "ecr:DescribeRepositories",
              "ecr:GetAuthorizationToken",
              "ecr:GetDownloadUrlForLayer",
              "ecr:GetRegistryScanningConfiguration",
              "ecr:ListImages",
              "ecr:PutRegistryScanningConfiguration",
              "organizations:DescribeAccount",
              "organizations:DescribeOrganization",
              "organizations:ListAccounts",
              "ssm:DescribeAssociation",
              "ssm:DescribeInstanceInformation",
              "ssm:ListAssociations",
              "ssm:ListResourceDataSync",
              "ssm:StartAssociationsOnce",
              "ssm:DeleteAssociation",
              "ssm:UpdateAssociation"
          ],
          "Resource": "*"
      },
      {
          "Sid": "GatherInventory",
          "Effect": "Allow",
          "Action": [
              "ssm:CreateAssociation"
          ],
          "Resource": [
              "arn:*:ec2:*:*:instance/*",
              "arn:aws:ssm:*:*:document/AWS-GatherSoftwareInventory",
              "arn:*:ssm:*:*:managed-instance/*"
          ]
      },
      {
          "Sid": "DataSyncCleanup",
          "Effect": "Allow",
          "Action": [
              "ssm:CreateResourceDataSync",
              "ssm:DeleteResourceDataSync"
          ],
          "Resource": [
              "arn:*:ssm:*:*:resource-data-sync/InspectorResourceDataSync-do-not-delete"
          ]
      },
      {
          "Sid": "ManagedRules",
          "Effect": "Allow",
          "Action": [
              "events:PutRule",
              "events:DeleteRule",
              "events:DescribeRule",
              "events:ListTargetsByRule",
              "events:PutTargets",
              "events:RemoveTargets"
          ],
          "Resource": [
              "arn:*:events:*:*:rule/DO-NOT-DELETE-AmazonInspector*ManagedRule"
          ]
      }
  ]
}

信頼関係が以下のようになっています。これはinspector2からの利用を許可する設定ですね。完全に既存のinspectorとは別であることがわかります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "inspector2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

脆弱性の確認

有効化するとスキャンが開始されます。これだけでOK!Organizations連携ボタンも見えていますが一旦スルーします。

しばらく待っているとスキャンした結果が出てきました。私の環境ではEC2が2台とECRが1 Repositoryありましたが、EC2のうち1台だけスキャンされ、Criticalな脆弱性が12個発見された事がわかりました。EC2についてはSSMで管理されていないインスタンス(Unmanaged Instance)が1台あるためです、ECRは新規のプッシュがされていないので0%になっています。

EC2についてはSSMエージェントを特にアップデートしていないので気になりました。

確認したら手元のSSMバージョンは2.3.1644.0、最新バージョンは3.0.1124.0でした。

脆弱性の確認画面(Findings)です。これが非常に良くなっているのが今回のアップデートのいいところですね。以前はスキャン毎の脆弱性が全部並んでいる感じでしたが、脆弱性単位やインスタンス/イメージ単位で表示が可能です。フィルタリングで脆弱性スコアやAMI IDなど様々な絞り込みが可能です。直感的でわかりやすい!

All findings画面から脆弱性を確認すると右カラムに詳細が表示されます。GuardDutyやDetectiveなどとおんなじ感じになりました。

詳細画面では脆弱性の詳細はもちろん、EC2だけでなくVPCなどにもリンクが有り飛ぶことができたり、推奨の対応事項や、スコアタブではわかりやすくスコアが確認できます。CVEのスコアだけでなくInspectorスコアが用意されました。ぱっと調べた感じユーザーガイドにもInspectorスコアの扱いについて書いていなかったので詳細は不明ですが、Amazon Linuxとしてのスコアとか出してくれるんですかね、期待です。

インスタンス単位の画面です。わかりやすいですね。

検知結果の抑制

今回は有効化するだけで全部スキャンされるということで、逆に確認したくないものも見えてしまいます。というわけでSuppression rule(抑制ルール)が実装されました。これもやってみましょう。Suppression rulesへアクセスして作っていきます。

ルールではフィルターで何を抑制するか指定しますが、めちゃくちゃ細かく指定できます。アカウントID、AMI ID、インスタンスIDなどの基本的なところからVPC IDや作成から何日経っているかなどもあり、複合条件で指定することもできます。

今回はVPC ID指定でいってみます。指定すると下に実際の対象が表示されます。わかりやすい。

ルールを作成して少しすると適用が完了します。Findings画面では表示されなくなり、ステータスをSuppressedに指定すると表示されます。この状態ではSecurity HubへのFindings連携はされるものの、Event Bridgeへは通知されないようです。ユーザーガイドに詳細があります。

ルールを削除してみます。指定してDelete ruleすればOKです。しばらくしたら抑制したFindingsもActiveに戻りました。

アカウント管理

Account ManagementからAWS Organizationsと連携したアカウント管理状況を確認できます。

今回は連携できてないので割愛します。アカウントごとにEC2/ECRそれぞれ有効化ステータスがあるようですね。

Instances / Repositoriesタブではアカウントをまたがって全てのEC2インスタンスとECRリポジトリの一覧が確認できます。

無効化

Inspector v2では有効化したら自動的にスキャンが継続されるので、止めたい場合は無効化という作業になります。Generalから操作可能です。

ECRスキャン

ECRのスキャンは既存でECRリポジトリスキャンがありますが、これが強化された形です。

これまでの機能はBasic scanningとなり、Inspector v2と連携したスキャン機能はEnhanced scanningとなりました。

オペレーティングシステムとプログラミング言語パッケージの脆弱性の両方についてスキャンでき、Event Bridge経由の通知も利用可能です。

Inspector v2を有効化した後自動的にEnhanced scanningの設定がされていました。ECRのScanning設定でこれを確認できます。

詳細は今回は割愛するのでユーザーガイドをご確認下さい。

料金

現状の利用料金はUsageで確認できます。有効化したばかりなので15日のフリートライアル期間であることが確認できます。

料金ページを確認してみます。現状では英語表示にすれば確認できました。

既存のInspectorではスキャン数に応じた料金体系でしたが、v2では継続的にスキャンされるので違う感じになっています。

EC2はスキャンしている時間、ECRはイメージ数とスキャン数ベースになっています。東京リージョンでは以下のようになっています。

  • 1か月にスキャンされたAmazonEC2インスタンスの平均数: インスタンスあたり$ 1.2528
  • 1か月あたりAmazon ECRに最初にオンプッシュでスキャンされたコンテナイメージの数: イメージあたり0.09ドル
  • 1か月あたりの継続的なスキャン用に設定されたAmazon ECRのコンテナイメージの自動再スキャンの数: 再スキャンごとに0.01ドル

EC2は1台月額$1.2528という廉価でわかりやすい運用が可能です。いいですね。料金ページに具体的な試算もあるので確認してください。

まとめ

Amazon Inspectorがv2になりました!既存ではいろいろ使いづらい部分とかありましたが、かなり使いやすくなったり、ECR連携やOrganizatinos連携など最近のサービス感が出てきました。

安価に簡単に運用できますので、ぜひ使い倒していきましょう!