[アップデート] AWS Security Hub で有効化するセキュリティ基準と無効化するコントロールを AWS CloudFormation で設定できるようになりました
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 も選択肢になる待望のアップデートでした。
以上、このブログがどなたかのご参考になれば幸いです。