[AWS][CFn]CloudTrailの設定

## はじめに

こんにちは。なじむです。
前回に引き続き、クラスメソッドさんのブログ記事、[AWSアカウントを作ったら最初にやるべきこと ～令和元年版～](https://dev.classmethod.jp/cloud/aws/aws-1st-step-new-era-reiwa/)を参考にさせていただき、AWSでの初期設定をCloudFormationで実施していきます。
今回は「CloudTrailの有効化」をCloudFormationで実施していきます。CloudTrailは言わずもがなですが監査ログに関する設定です。企業でAWSを使用する場合、こちらは有無を言わさず設定することをお勧めします。

## 前提

サンプルコードで実施しているのは以下です。
本来であればCloudwatchLogsへの出力も実施し、特定のAPIが実行された場合にSNS通知するように設定した方が良いのかもしれません。

- CloudTrailを有効化する
- CloudTrailをS3に保存する
- S3に保存したログは13ヶ月(400日)経過後、削除する
- S3に保存したログはKMSで暗号化し、特定のユーザでしか複合できないようにする
- CloudTrail InsightはまだCFnに対応していないため、手動で設定する ※対応したら追記します

## サンプルコード
```yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: CloudTrail

#------------------------------
# Resources: Your resource list
#------------------------------
Resources:
  # CloudTrailをS3に保存するためのバケットを作成する。ライフサイクルは13ヶ月(400日)。
  ## Logs bucket
  CloudTrailBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: LogDeliveryWrite
      BucketEncryption:
        ServerSideEncryptionConfiguration:
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: AES256
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      LifecycleConfiguration:
        Rules: 
        - Id: 13months(400days)
          Status: Enabled
          ExpirationInDays: 400
          NoncurrentVersionExpirationInDays: 400
    DeletionPolicy: Retain

  ## Logs bucket policy
  CloudTrailBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref CloudTrailBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
        - Sid: AWSCloudTrailAclCheck
          Effect: Allow
          Principal:
            Service: cloudtrail.amazonaws.com
          Action: s3:GetBucketAcl
          Resource: !Sub "arn:aws:s3:::${CloudTrailBucket}"
        - Sid: AWSCloudTrailWrite
          Effect: Allow
          Principal:
            Service: cloudtrail.amazonaws.com
          Action: s3:PutObject
          Resource: !Sub "arn:aws:s3:::${CloudTrailBucket}/AWSLogs/${AWS::AccountId}/*"
          Condition:
            StringEquals:
              s3:x-amz-acl: bucket-owner-full-control

  # S3に保存したログはKMSで暗号化し、特定のユーザでしか復号できないようにする
  ## KMS
  myKey:
    Type: AWS::KMS::Key
    Properties:
      Description: for CloudTrail log files
      Enabled: True
      KeyPolicy:
        Version: 2012-10-17
        Id: CloudTrailEncryptKey
        Statement:
        - Sid: Allow administration of the key
          Effect: Allow
          Principal:
            AWS: !Sub "arn:aws:iam::${AWS::AccountId}:user/NaGym_t" #ここは任意のroleやuserに変更してください。
          Action:
          - kms:Create*
          - kms:Describe*
          - kms:Enable*
          - kms:List*
          - kms:Put*
          - kms:Update*
          - kms:Revoke*
          - kms:Disable*
          - kms:Get*
          - kms:Delete*
          - kms:TagResource
          - kms:UntagResource
          - kms:ScheduleKeyDeletion
          - kms:CancelKeyDeletion
          Resource: "*"
        - Sid: Allow use of the key
          Effect: Allow
          Principal:
            Service: cloudtrail.amazonaws.com
            AWS: !Sub "arn:aws:iam::${AWS::AccountId}:user/NaGym_t" #ここは任意のroleやuserに変更してください。
          Action:
          - kms:Encrypt
          - kms:Decrypt
          - kms:ReEncrypt
          - kms:GenerateDataKey*
          - kms:DescribeKey
          Resource: "*"
        - Sid: Allow attachment of persistent resources
          Effect: Allow
          Principal:
            AWS: !Sub "arn:aws:iam::${AWS::AccountId}:user/NaGym_t" #ここは任意のroleやuserに変更してください。
          Action:
          - kms:CreateGrant
          - kms:ListGrants
          - kms:RevokeGrant
          Resource: "*"
          Condition:
            Bool:
              kms:GrantIsForAWSResource: True
    DeletionPolicy: Retain

  # CloudTrailを有効化する
  ## CloudTrail
  CloudTrail:
    Type: AWS::CloudTrail::Trail
    Properties:
      S3BucketName: !Ref CloudTrailBucket
      IncludeGlobalServiceEvents: true
      IsLogging: true
      KMSKeyId: !Ref myKey
      IsMultiRegionTrail: true
      EnableLogFileValidation: true
      TrailName: cloudtraillog
```

## 実行結果

- CloudTrailを有効化する
![20191207_175122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/7ca24c51-d593-58a2-a59a-dbfc93b3fa52.jpeg)

- CloudTrailをS3に保存する
![20191207_175326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/34b93f36-c765-1833-8136-2607a18aea05.jpeg)

- S3に保存したログは13ヶ月(400日)経過後、削除する
![20191207_175339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/ddcdbce2-63e3-8746-5023-0048335008c4.jpeg)

- CloudTrail InsightはまだCFnに対応していないため、手動で設定する ※対応したら追記します
こちらは[CloudTrail]→[証跡情報]→[設定]から変更ができます。
![20191207_175816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396510/6df08562-11e2-b648-fa71-aee87c9c4f09.jpeg)

## まとめ
今回はCloudFormationでCloudTrailを有効にしようお届けしました。
CloudTrailは、取得するのはいいものの活用できているかと言われると私自身もできていない自信があります…
CloudTrail Insightがそれに役立ってくれると良いなと思いつつ、動作を確認してはいないので有効性は確認できていません。
ですが監査証跡としては取得しておいた方が絶対に良いので、まずは設定するようにしましょう。
何かのお役に立てれば幸いですノシ