[AWS][CFn]SecurityHubの設定

## はじめに

こんにちは。なじむです。
今回もクラスメソッドさんのブログ記事、[AWSアカウントを作ったら最初にやるべきこと ～令和元年版～](https://dev.classmethod.jp/cloud/aws/aws-1st-step-new-era-reiwa/)を参考にさせていただき、AWSでの初期設定をCloudFormationで実施していこうという記事を書いていこうと思います。
今回は「Security Hubの有効化」です。

## 前提

サンプルコードで実行しているのは以下です。

- SecurityHubを有効にする
- SNSを設定する（今回はメール通知）
- SecurityHubでイベントを検知した際にCloudwatchイベントを通じてSNSに通知する。

ここまで記事を書いていて思ったのですが、SecurityHubで通知を有効にしておけば、GuardDuryで通知しなくてもよくなるのですねきっと。。。
これはConfigやMacieでも同じことが言えるので、GuardDutyやConfig、Macieを有効化にし、通知はSecurityHubからというのが良いのですね。きっと。

## サンプルコード

```yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: Security Hub

#------------------------------
# Parameters: Your resource list
#------------------------------
Parameters:
  EMailAddress: # スタック作成時に任意のメールアドレスを指定してください。
    Type: String
    Description: Specifies your E-Mail for notify SecurityHubAlert.

#------------------------------
# Resources: Your resource list
#------------------------------
Resources:
  # IAM
  ## Service Role
  ServiceLinkedRoleForSecurityHub:
    Type: AWS::IAM::ServiceLinkedRole
    Properties:
      AWSServiceName: securityhub.amazonaws.com
      Description: A service-linked role required for AWS Security Hub to access your resources.

  # SecurityHub
  SecurityHub:
    Type: AWS::SecurityHub::Hub

  # SNSを作成する（今回はメール通知）
  ## Topic
  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: SwcurityHubTopic #任意の名前に変更してください
      Subscription:
      - Endpoint: !Ref EMailAddress
        Protocol: email

  ## Topic Policy
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: default_policy_ID
        Version: 2012-10-17
        Statement:
        - Sid: default_statement_ID
          Effect: Allow
          Principal:
            AWS: "*"
          Action:
          - SNS:GetTopicAttributes
          - SNS:SetTopicAttributes
          - SNS:AddPermission
          - SNS:RemovePermission
          - SNS:DeleteTopic
          - SNS:Subscribe
          - SNS:ListSubscriptionsByTopic
          - SNS:Publish
          - SNS:Receive
          Resource: !Ref SNSTopic
          Condition:
            StringEquals:
              AWS:SourceOwner: !Ref AWS::AccountId
        - Sid: AWSEvents_AlertSecurityHubFindings_Id123
          Effect: Allow
          Principal:
            Service:
            - events.amazonaws.com
          Action: sns:Publish
          Resource: !Ref SNSTopic
      Topics:
      - !Ref SNSTopic

  # CloudWatch Events for SecurityHub
  SecurityHubCWERule:
    Type: AWS::Events::Rule
    Properties:
      Name: AlertSecurityHubFindings
      Description: Alert to SNS topic when find threats by SecurityHub
      EventPattern: {
                      "source": [
                        "aws.securityhub"
                      ],
                      "detail-type": [
                        "Security Hub Findings - Imported"
                      ]
                    }
      Targets:
      - Arn: !Ref SNSTopic
        Id: Id123
```

## 実行結果

- SecurityHubを有効にする
![20200201_175905.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/11427bd7-cdee-9c90-0ba7-00feef57933a.jpeg)

- SNSを設定する（今回はメール通知）
- SecurityHubでイベントを検知した際にCloudwatchイベントを通じてSNSに通知する。

GuardDuryの時と同じため省略します。

## まとめ

SecurityHubはあくまでもGuardDutyやCondigなどの結果をまとめて表示してれる機能のため、有効にしたからと言って特別何かが起きるわけではありません。情報をまとめて見れるだけです。
次回以降はSecurityHubと連携しているConfig、Inspector、Macieについて記載していこうと思います。