AWS Security Hub の自動修復ソリューションの既存の修復処理をカスタマイズしてみた

2022.10.24

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

AWS事業本部 梶原@福岡です。

SecurityHubの自動修復ソリューションの公開されているGitHubの手順(下記)にしたがって既存の処理のカスタマイズを行ってみました。

https://github.com/aws-solutions/aws-security-hub-automated-response-and-remediation

事前準備

a Linux client with the following software

  • AWS CLI v2
  • Python 3.7+ with pip
  • AWS CDK 1.155.0+
  • Node.js with npm

が必要となります。事前にインストールまた環境構築を行っておきます。

また、展開時にS3バケットが最低2つ(本体とリージョン毎)で必要になります。

バージョン確認

AWS CLI

$ aws --version
aws-cli/2.5.3 Python/3.9.12 Linux/5.10.102.1-microsoft-standard-WSL2 source/x86_64.ubuntu.18 prompt/off

Python

$ python3 -m venv .venv
$ source .venv/bin/activate
$ python --version
Python 3.9.12

Node(NVM)

$ nvm install --lts
$ nvm use 16
Now using node v16.18.0 (npm v8.19.2)
$ node --version
v16.18.0

ソースの取得

適当なディレクトリを作成し、その中でソースを取得してビルドを行います。

$ git clone https://github.com/aws-solutions/aws-security-hub-automated-response-and-remediation.git
$ cd aws-security-hub-automated-response-and-remediation/

ビルド

一旦、正常にビルドできるかやってみます。

マシンパワーもよりますがわりと時間がかかりますので気長にお待ち下さい

この時に指定したバケットでテンプレート展開時に参照するバケットとなりますのでメモしておきます。

ここではバケットに”my-solution” を指定としていますが、実際作成するS3バケットは

  1. my-solution-reference
  2. my-solution-us-east-1

(後半はリージョン名)

という名前のバケットが必要になります。また自動修復ソリューションを展開するリージョン毎に必要になるので、必要に応じて作成してください

ビルドの実施

$ cd deployment/
$ chmod +x build-s3-dist.sh
# ./build-s3-dist.sh -b source-bucket-base-name solution-name version-code
$ ./build-s3-dist.sh -b my-solution

※ソリューション名, バージョンコードを省略するとダウンロードしてきたソースのバージョンになります

デフォルト値はそれぞれ

  • ソリューション名: aws-security-hub-automated-response-and-remediation
  • version-code (source\package.json のバージョン番号)
    • 現在の最新は”v1.5.0”

実行ログ(抜粋)

prepend v to 1.5.0
==========================================================================
Building AWS Security Hub Automated Response & Remediation (SO0111) version v1.5.0 for bucket my-solution
==========================================================================
------------------------------------------------------------------------------
[Init] Clean old dist, node_modules and bower_components folders
------------------------------------------------------------------------------
・・・省略
------------------------------------------------------------------------------
[Init] Create folders
------------------------------------------------------------------------------
・・・省略
------------------------------------------------------------------------------
[Install] CDK
------------------------------------------------------------------------------
・・・省略
------------------------------------------------------------------------------
[Pack] Lambda Layer (used by playbooks)
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[Pack] Member Stack Lambda Layer (used by custom resources)
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[Pack] Custom Action Lambda
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[Pack] Updatable Runbook Provider Lambda
------------------------------------------------------------------------------
------------------------------------------------------------------------------
[Create] Playbooks
------------------------------------------------------------------------------
Create AFSBP playbook

正常にビルドが行えますとdeploymentフォルダ配下に

global-s3-assets, reginal-s3-assets が作成されその中にテンプレート等が保存されますので

確認してください

※エラー等が途中で発生している場合、空のファイルが作成されていたりするのでご注意ください

カスタマイズ

それでは実際に修正してみます

RDS.2 の コントロールを検知した際に実行されるプレイブックを変更してみます。

詳細はこちらのエントリーに記載されていますが自動修復ソリューションで検知した際に

DBインスタンスを作成時の修復を想定されたステップになっていない為

ステータスがAvailableになるまで待機する処理を追加して、パブリックアクセスを無効にするように変更します。

Configルールを使ってパブリックアクセスが有効になっているRDSのDBインスタンスを自動修復する | DevelopersIO

対象のソースは下記になります。

source\remediation_runbooks\DisablePublicAccessToRDSInstance.yaml

こちらに以下の作成時の待機処理を追加します

index c1f8c72..496467a 100644
--- a/source/remediation_runbooks/DisablePublicAccessToRDSInstance.yaml
+++ b/source/remediation_runbooks/DisablePublicAccessToRDSInstance.yaml
@@ -47,6 +47,21 @@ mainSteps:
       - Name: DbInstanceIdentifier
         Selector: $.DBInstances[0].DBInstanceIdentifier
         Type: String
+  -
+    name: WaitForDBInstanceStatusToAvailable
+    action: "aws:waitForAwsResourceProperty"
+    timeoutSeconds: 1200
+    isEnd: false
+    description: |
+      ## WaitForDBInstanceStatusToAvailable
+      Waits for the DB instance to change to a AVAILABLE state.
+    inputs:
+      Service: rds
+      Api: DescribeDBInstances
+      DBInstanceIdentifier: "{{ GetRDSInstanceIdentifier.DbInstanceIdentifier }}"
+      PropertySelector: "$.DBInstances[0].DBInstanceStatus"
+      DesiredValues:
+        - "available"
   -
     name: VerifyDBInstanceStatus
     action: "aws:assertAwsResourceProperty"

Build

ビルドを実施し、正常終了すると下記パスのプレイブックが変更されて生成されます

deployment\temp\source\remediation_runbooks\DisablePublicAccessToRDSInstance.yaml

最終的には上記のプレイブックはメンバーアカウントに展開させる修復用のプレイブックの

テンプレートに反映されます。

deployment\global-s3-assets\aws-sharr-remediations.template

展開準備

2つのS3バケットを作成し、作成したソース(テンプレート)を配置します

deploymentフォルダののglobal-s3-assets, regional-s3-assets の中身をS3バケットにコピーします

また、配置先は

s3://backet/ソユーション名/バージョン/

となります。こちらは./build-s3-dist.sh で指定することも可能ですのでカスタマイズする場合はビルド時に指定してください

S3バケット作成(テンプレート用)

aws s3 mb s3://my-solution-reference

テンプレート配置

aws s3 sync global-s3-assets/ s3://my-solution-reference/aws-security-hub-automated-response-and-remediation/v1.5.0/

S3バケット作成(Lambda用 東京リージョン)

aws s3 mb s3://my-solution-ap-northeast-1

Lambda用のzip配置

aws s3 sync regional-s3-assets/ s3://my-solution-ap-northeast-1/aws-security-hub-automated-response-and-remediation/v1.5.0/

テンプレートの展開

使用するテンプレートを今回ビルドしたテンプレートに置き換えて自動修復ソリューションのCloudFormationのスタックを展開します。

なお、CloudFormationからアクセスする際にPublicのアクセスまたは適切な公開設定を実施していないとテンプレートが見つからない旨のメッセージでエラーが発生します。

とくにテンプレート自体には機密情報は含まれないとおもいますがご注意ください

展開先のバケットを my-solution とした場合、それぞれの対応は下記になります

テンプレート 通常 カスタマイズしたテンプレートの場合
aws-sharr-deploy.template https://solutions-reference.s3.amazonaws.com/aws-security-hub-automated-response-and-remediation/latest/aws-sharr-deploy.template https://my-solution--reference/aws-security-hub-automated-response-and-remediation/v1.5.0/aws-sharr-deploy.template
aws-sharr-member.template https://solutions-reference.s3.amazonaws.com/aws-security-hub-automated-response-and-remediation/latest/aws-sharr-member.template https://my-solutions-reference.s3.amazonaws.com/aws-security-hub-automated-response-and-remediation/v1.5.0/aws-sharr-member.template

まとめ

AWS Security Hub の自動修復ソリューションの変更をおこなってみました。

単純に使用するだけであれば、すでに公開されているテンプレートを使用すれば問題ないですが、一部修正したい。また現在対応していない独自のSecurityHubのコントロールの自動修復処理を追加する際になどに参考になると幸いです

参考

https://github.com/aws-solutions/aws-security-hub-automated-response-and-remediation

AWS Cloud Development Kit (CDK) の開始方法 | はじめに