[アップデート] AWS Security Hub で有効化するセキュリティ基準と無効化するコントロールを AWS CloudFormation で設定できるようになりました

AWS Security Hub で有効化するセキュリティ基準と各セキュリティ基準内で無効化するコントロール(セキュリティチェック項目)の選択を AWS CloudFormation で設定できるようになりました。
2023.06.25

AWS Security Hub で有効化するセキュリティ基準と無効化するコントロールを AWS Cloudformation で設定できるようになりました。これまで、CloudFomration で Security Hub と有効化する際は、2 つのセキュリティ基準が同時に有効化され、基準内のコントロールの無効化は設定できませんでした。今回のアップデートで任意のセキュリティ基準の有効化と任意のコントロールの無効化が可能になりました。待望のアップデートです。

CloudFormation で Security Hub を有効化する

今回のアップデートの主要な点は 2 つです。

1 つ目は、Security Hub を有効化する際に指定するAWS::SecurityHub::Hubタイプにおいて、Security Hub 有効化時に「AWS 基礎セキュリティのベストプラクティス」と「CIS Foundations Benchmark version 1.2」を有効化しない指定ができるようになりました。

AWS::SecurityHub::Hub - AWS CloudFormation


2 つ目は、個別のセキュリティ基準を有効化するAWS::SecurityHub::Standardタイプが追加されました。コントロールの無効化も設定できます。

AWS::SecurityHub::Standard - AWS CloudFormation


CloudFormation テンプレートの例です。この例では、セキュリティ基準は「AWS 基礎セキュリティのベストプラクティス」のみを有効化しており、4 つのコントロールを無効化しています。

AWSTemplateFormatVersion: 2010-09-09
Description: Enable AWS Security Hub

Resources:
  SecurityHub:
    Type: AWS::SecurityHub::Hub
    Properties:
      AutoEnableControls: true
      EnableDefaultStandards: false
      ControlFindingGenerator: STANDARD_CONTROL

  Standard:
    Type: AWS::SecurityHub::Standard
    DependsOn: SecurityHub
    Properties:
      StandardsArn: !Sub arn:${AWS::Partition}:securityhub:${AWS::Region}::standards/aws-foundational-security-best-practices/v/1.0.0
      DisabledStandardsControls:
        - StandardsControlArn: !Sub arn:${AWS::Partition}:securityhub:${AWS::Region}:${AWS::AccountId}:control/aws-foundational-security-best-practices/v/1.0.0/IAM.6
          Reason: "No checked"
        - StandardsControlArn: !Sub arn:${AWS::Partition}:securityhub:${AWS::Region}:${AWS::AccountId}:control/aws-foundational-security-best-practices/v/1.0.0/EC2.8
          Reason: "No checked"
        - StandardsControlArn: !Sub arn:${AWS::Partition}:securityhub:${AWS::Region}:${AWS::AccountId}:control/aws-foundational-security-best-practices/v/1.0.0/CloudTrail.5
          Reason: "No checked"
        - StandardsControlArn: !Sub arn:${AWS::Partition}:securityhub:${AWS::Region}:${AWS::AccountId}:control/aws-foundational-security-best-practices/v/1.0.0/Config.1
          Reason: "No checked"

Outputs:
  SecurityHubArn:
    Value: !Ref SecurityHub
  StandardArn:
    Value: !Ref Standard

AWS::SecurityHub::HubタイプのEnableDefaultStandardsが Security Hub 有効化時に「AWS 基礎セキュリティのベストプラクティス」と「CIS Foundations Benchmark version 1.2」を有効化しない指定をするプロパティです。このプロパティをfalseにしてAWS::SecurityHub::Standardタイプで「AWS 基礎セキュリティのベストプラクティス」を個別に有効化しています。

また、AWS::SecurityHub::StandardタイプのリソースはDependsOnで Security Hub を有効化後に実行するようにしています。

「AWS 基礎セキュリティのベストプラクティス」では次の 4 つのコントロールを無効化しています。

  • IAM.6
  • EC2.8
  • CloudTrail.5
  • Config.1

参考情報ですが、上記 4 つのコントロール無効化は次のブログを参考に選定しました。


AWS CloudFormation StackSets を利用して、自身のアカウントのバージニア北部リージョンと東京リージョンに展開してみます。なお、StackSets を利用するための IAM ロール作成等は実施済みの環境です。

AWS CloudShell で実行する場合は、上記で紹介した CloudFormation テンプレートファイルをアップロードしておきます。

次のコマンドで StackSets を作成します。

aws cloudformation create-stack-set \
  --region ap-northeast-1 \
  --stack-set-name security-hub \
  --template-body file://security-hub.yaml \
  --permission-model SELF_MANAGED

実行結果です。

aws cloudformation create-stack-set \
>   --region ap-northeast-1 \
>   --stack-set-name security-hub \
>   --template-body file://security-hub.yaml \
>   --permission-model SELF_MANAGED
{
    "StackSetId": "security-hub:1a3e63f9-3d5e-4c39-9e00-b8b73690577b"
}


次のコマンドでスタックインスタンスを作成します。accountsは StackSets を展開する AWS アカウントに置き換える必要があります。今回の場合は自アカウントです。

aws cloudformation create-stack-instances \
  --region ap-northeast-1 \
  --stack-set-name security-hub \
  --accounts 111122223333 \
  --regions us-east-1 ap-northeast-1 \
  --operation-preferences FailureToleranceCount=0,MaxConcurrentCount=1

実行結果例です。

$ aws cloudformation create-stack-instances \
>   --region ap-northeast-1 \
>   --stack-set-name security-hub \
>   --accounts 111122223333 \
>   --regions us-east-1 ap-northeast-1 \
>   --operation-preferences FailureToleranceCount=0,MaxConcurrentCount=1
{
    "OperationId": "4ffc3c5a-e7b3-4751-af06-20a8a0cafa4f"
}


オペレーションのステータスを確認したい場合は次のコマンドで確認できます。OperationIdの値は置き換える必要があります。

aws cloudformation describe-stack-set-operation \
  --region ap-northeast-1 \
  --stack-set-name security-hub \
  --operation-id 4ffc3c5a-e7b3-4751-af06-20a8a0cafa4 \
  --query 'StackSetOperation.Status'

実行結果例です。

$ aws cloudformation describe-stack-set-operation \
>   --region ap-northeast-1 \
>   --stack-set-name security-hub \
>   --operation-id 4ffc3c5a-e7b3-4751-af06-20a8a0cafa4f \
>   --query 'StackSetOperation.Status'
"SUCCEEDED"


マネジメントコンソールからスタックインスタンスを確認したところSUCCEEDEDステータスになっています。

CloudFormation 展開後の Security Hub 設定を確認してみます。

セキュリティ基準は AWS 基礎セキュリティのベストプラクティスのみ有効化されていました。

IAM.6 コントロールを確認したところ、無効化状態でした。コントロールの有効化設定があるため、現在は無効化状態です。有効化状態のコントロールではコントロールの無効化設定となります。

AWS CloudFormation で有効化するセキュリティ基準と無効化するコントロールの設定ができることを確認できました。

CloudFormation 実行時のエラー

検証しているときに、CloudFormation 実行時にAWS::SecurityHub::Standardタイプのリソース作成において次のエラーが出ることがありました。

ResourceLogicalId:Standard, ResourceType:AWS::SecurityHub::Standard, ResourceStatusReason:Resource handler returned message: "Internal Service Exception" (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: InternalFailure).

本エラーはDependsOnで Security Hub を有効化後にセキュリティ基準を有効化するように依存関係を指定することで出力されなくなりました。おそらく、Securty Hub が有効化されていないのにセキュリティ基準の設定をしようとしてエラーになったものと思われます。

さいごに

これまで、AWS アカウント発行時のベースライン設定などで AWS Security Hub の特定セキュリティ基準の有効化や特定コントロールの無効化をする場合は AWS CLI や Terraform を利用する方法がありましたが、これからは AWS CloudFormation も選択肢になる待望のアップデートでした。

以上、このブログがどなたかのご参考になれば幸いです。