コンテンツにスキップ

audit pattern

概要

audit patternモジュールでは、AWSアカウントのアクティビティや運用監査を行うためのログを保存します。

このpatternで保存されたアクティビティログは、監査のための証跡として使用します。

想定する適用対象環境

audit patternは、Delivery環境およびRuntime環境のいずれでも使用されることを想定しています。

依存するpattern

audit patternは、他のpatternの実行結果に依存しません。 独立して実行できます。

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
AWS CloudTrail 入力変数で指定された設定で、AWSアカウントのアクティビティや監査ログを保存します
Amazon S3 入力変数で指定したbucketに対して、CloudTrailが収集したログを保存します
AWS Key Management Service (KMS) 入力変数で指定したCloudTrailのログを暗号化するための、カスタマーマスターキー(CMK)を作成します

モジュールの理解に向けて

AWS CloudTrail(以降、CloudTrail)は、AWSアカウントで構築されたマネージドサービスのアクティビティログを収集し、保存します。
CloudTrailが記録するAWSサービスとイベントは、以下のドキュメントを参照してください。

CloudTrail サポートされるサービスと統合 - AWS CloudTrail

Eponaでは、audit patternのインスタンスは各環境のリージョン内に1つ作成し、対象環境のAWSアカウントにおけるアクティビティログを保存する運用を想定しています。

ℹ️ audit patternを適用することで、証跡が1つ作成されます。

audit patternを用いることで、以下のメリットが生まれることを想定しています。

  • セキュリティ監査に用いるためのログ収集
  • AWSアカウントに対する不審な操作の記録

CloudTrailで収集したログは、データに対して高いセキュリティ機能を設定できるAmazon S3(以降、S3)に格納しています。

また、audit patternで構築したCloudTrailでは、デフォルトで収集したログをAWS KMSで管理するカスタマーマスターキー(CMK)を用いて暗号化しています。 audit patternが構築されたアカウントのIAMエンティティがS3への参照権限を持っている場合、復号化されたログを参照できます。

その他のCloudTrailを用いたセキュリティのプラクティスは以下を参照してください。

CloudTrailで記録されるイベントを理解する

CloudTrailで記録するイベントは3種類あり、autit patternと課金の関係は以下のようになっています。

CloudTrailイベント名 概要 audit patternのデフォルト設定 課金
管理イベント AWSアカウントのリソースで実行される管理オペレーション 全て記録する 2つ目の証跡から、記録される管理イベントに応じて課金
データイベント リソース上またはリソース内部で実行されるリソースオペレーション 記録されない 記録されたイベント数に応じて課金
インサイトイベント AWSアカウント内の異常なアクティビティを記録 記録されない 記録されたイベント数に応じて課金

それぞれのイベントの詳細は、CloudTrailの概念 - AWS CloudTrailのドキュメントを参照してください。

これらのイベントのうち、特にデータイベントはS3へのデータ操作やLambda関数の呼び出しなどが対象となります。
よって、データイベントの記録を有効にすると大量のイベントが記録される傾向にあります。

ℹ️ データイベントの記録できる対象は、Amazon S3、AWS Lambda、Amazon DynamoDBです。

データイベントはこの性質のため思わぬ課金の原因となる可能性があり、audit patternではデフォルトで記録しない設定としています。

一方で以下のpatternでは、CloudTrailでS3へのデータイベントが記録されることを前提としています。

これらCDパイプラインのpatternと組み合わせる場合は、S3のデータイベントを記録するように設定する必要があります。

データイベントを記録する場合、入力パラメータevent_data_resourcesを設定します。
設定方法については、入出力リファレンスを参照してください。

また、AWSリソースではAWS Key Management Service(以降、KMS)を使用した暗号化がよく行われます。
CloudTrailではKMSの暗号化、複合化も記録するため、特にS3をKMSを使用して暗号化を行った場合などに多数の管理イベントが発生します。

CloudTrailの証跡は1つのリージョンに1つ作成すれば十分ですが、なんらかの理由で複数作成する場合はKMSの管理イベントの課金が問題になることがあります。

KMSによる暗号化と複合化のログを除外する場合は、マネジメントコンソールからAWS KMSイベントの除外のチェックボックスを有効にしてください。

証跡からの AWS KMS イベントの除外

ℹ️
現時点のTerraform AWS Provider(3.15.0)では、KMSの管理イベントを除外できません。
マネジメントコンソールからの操作が必要になります。

多要素認証によるS3バケットのバージョン保護を有効にする

audit patternで構築されたCloudTrailでは、悪意のある第三者による不正なアクセスや オペレーションミス等によるログの変更/削除に対して整合性が検証できるようになっています。

ℹ️ ログに対する変更、削除の整合性検証は、AWS CLIやAWS SDKを用いたカスタム実装により検証できます。

それに加えて、予防的な対策としてAmazon S3に記録しているログ(オブジェクト)のバージョンに対して多要素認証(MFA)を用いた保護をかけることがセキュリティ観点で推奨されています。

MFAを用いたS3バケットの保護を設定することで、S3バケットのバージョンやオブジェクトのバージョンを削除する際に、rootユーザーによる追加の認証を求めることができます。 S3バケットのMFAによるバージョン保護はTerraformやAWSマネジメントコンソールで設定ができないため、設定を有効にする場合は以下の手順を実施してください。 ℹ️ この設定を有効にする場合、S3のログをアーカイブできません。

⚠️ ここで示す手順はrootユーザーのcredential情報(アクセスキー)を用います。注意して実行してください。

設定に必要なrootユーザーのセキュリティ設定情報は以下です。

  • 多要素認証(MFA)の設定と、設定後に表示されるシリアル番号(ARN)
  • AWS CLIを実行するためのアクセスキー(アクセスキーIDとシークレットアクセスキー)

  1. audit patternをTerraformで構築する

    適切に入力変数を設定して、audit patternを実行してください。

    この設定を有効にする場合はbucket_transitionsを設定しないでください。 audit patternで構築されたS3にライフサイクル設定がされている場合、以下のコマンドで削除してください。

    ```bash
    $ aws s3api delete-bucket-lifecycle --bucket [audit patternで設定したS3バケット名]
    ```
    
  2. rootユーザーで必要なセキュリティ設定情報を取得する

    AWS Management Consoleにアクセスし、rootユーザーでコンソールにログインをしてください。

    [アカウント認証情報]のページにアクセスし、MFAデバイスが登録されていない場合は登録してください。
    登録完了後、シリアルナンバーの項目に表示されるARNを記録しておきます。

    [アカウント認証情報]のページでAWS CLIを利用するためのアクセスキーを発行してください。
    ⚠️ rootユーザーのアクセスキーを発行することは、一般的にはバッドプラクティスと言われています。設定が完了したら、即座にアクセスキーを"削除"もしくは"無効化"してください。

  3. AWS CLIを用いて、s3バケットのバージョニングに対してのMFA保護を有効化する

    rootユーザーで発行したアクセスキーを利用して、以下のコマンドを実行してください。

    ```bash
    $ aws s3api put-bucket-versioning --bucket [audit patternで設定したS3バケット名] \
    --versioning-configuration Status=Enabled,MFADelete=Enabled \
    --mfa '[MFAデバイスのARN] [MFAデバイスで発行されたトークン]'  # ARNとトークンの間は半角スペースが必要
    ```
    
  4. S3バケットの設定を確認する

    ℹ️ 以下のコマンドは、rootユーザーので実施する必要はありません。

    S3へアクセスできる認証情報を用いて、以下のコマンドを実行してください。

    ```bash
    $ aws s3api get-bucket-versioning --bucket [audit patternで設定したS3バケット名]
    # 出力結果
    {
    "Status": "Enabled",
    "MFADelete": "Enabled"
    }
    ```
    

    上記のMFADeleteの項目が "Enabled" となっていた場合、正しく設定できていますので即座に次の手順を参考にrootユーザーのアクセスキーを削除してください。

  5. rootユーザーのアクセスキーを削除する

    ⚠️ アクセスキーが悪意のある第三者へ漏洩し不正に利用された場合、対象のAWSアカウントに甚大な被害をもたらす恐れがあります。

    特にrootユーザーのアクセスキーは非常に強い権限を持っています。rootユーザーのアクセスキーは必要になった場合のみ発行し、不要になったら、即座に削除してください。

    AWS Management Consoleにアクセスし、rootユーザーでコンソールにログインをしてください。

    [アカウント認証情報]のページで、2の手順で発行したアクセスキーの"削除"をしてください。

多要素認証によるS3バケットのバージョン保護を無効にする

S3バケットのバージョン保護を無効化する場合は、以下の手順を実施してください。

  1. rootユーザーで必要なセキュリティ設定情報を取得する

    有効化手順の"rootユーザーで必要なセキュリティ設定情報を取得する"の手順を参考にrootユーザーのアクセスキーを発行する。

  2. AWS CLIを用いて、s3バケットのバージョニングに対してのMFA保護を無効にする

    ```bash
    $ aws s3api put-bucket-versioning --bucket [audit patternで設定したS3バケット名] \
    --versioning-configuration Status=Enabled,MFADelete=Disabled \
    --mfa '[MFAデバイスのARN] [MFAデバイスで発行されたトークン]'  # ARNとトークンの間は半角スペースが必要
    ```
    
  3. rootユーザーのアクセスキーを削除する

    ⚠️ アクセスキーが悪意のある第三者へ漏洩し不正に利用された場合、対象のAWSアカウントに甚大な被害をもたらす恐れがあります。

    特にrootユーザーのアクセスキーは非常に強い権限を持っています。rootユーザーのアクセスキーは必要になった場合のみ発行し、不要になったら、即座に削除してください。

    有効化手順の"rootユーザーのアクセスキーを削除する"の手順を参考にrootユーザーのアクセスキーを削除する。

サンプルコード

audit patternを使用したサンプルコードを、以下に記載します。

module "audit" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/audit?ref=v0.2.6"

  trail_name = "my-trail-name"
  trail_tags = {
    # 任意のタグ
    Environment        = "runtime"
    RuntimeEnvironment = "production"
    ManagedBy          = "epona"
  }

  bucket_name          = "my-trail-bucket"
  bucket_mfa_delete    = false

  kms_key_management_arns = [
    # CMKを参照/変更/削除する権限が必要なIAMエンティティのARN
    "arn:aws:iam::[AWS Account ID]:role/TerraformExecutionRole",
  ]
}

関連するpattern

audit patternに関連するpatternを、以下に記載します。

pattern名 説明
cd_pipeline_frontend_trigger pattern パイプラインの起動のためには、autit patternでS3のデータイベントを記録する必要があります
cd_pipeline_backend_trigger pattern パイプラインの起動のためには、autit patternでS3のデータイベントを記録する必要があります

ログの集約

audit patternでは、AWS Lambda関数のログをAmazon CloudWatch Logsに出力します。

このログは、datadog_log_trigger patternを使用することでDatadogに集約できます。

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
bucket_name 証跡を保存するS3 bucket名 string n/a yes
kms_key_management_arns KMSキーの管理をするIAMエンティティのARN一覧 list(string) n/a yes
trail_name Trailの名称 string n/a yes
bucket_force_destroy bucketとともに保存されているデータを強制的に削除可能にする。証跡は監査上重要なものであるため、削除可能にする(trueを設定する)のは開発用途に限定すること bool false no
bucket_mfa_delete 証跡が保存されているS3 Bucketを削除するとき、ルートアカウントのMFAを要求する([Reserved for future] terraform単体では設定できないため、設定手順はpatternドキュメントを参照のこと) bool false no
bucket_transitions 証跡の移行に対するポリシー設定 list(map(string)) [] no
event_data_resources CloudTrailで監視可能な、データイベントを設定する。データイベントとして設定できるのは、S3とLambdaに関するイベントのみ。
ただし、デフォルトではどちらも記録されない。
記録するように設定する場合は、それぞれ以下のように設定すること。

S3のイベントをロギングする場合、以下を本パラメータのmapに追加すること。
"s3_event" = {
type = "AWS::S3::Object"
values = ["arn:aws:s3:::"]
}
Lambdaのイベントをロギングする場合、以下を本パラメータのmapに追加すること。
"lambda_event" = {
type = "AWS::Lambda::Function"
values = ["arn:aws:lambda"]
}
(typeおよびvaluesの意味については、DataResource - AWS CloudTrailを参照。
また、mapのキーについては任意の名称を指定)
map(object({
type = string
values = list(string)
}))
{} no
event_read_write_type 管理イベントのうち読み取りイベント、書き込みイベントを証跡として残すかどうかの設定。読み取りイベントのみを証跡とする場合は"ReadOnly"、書き込みイベントのみの場合は "WriteOnly"、双方の場合は "All" を指定する string "All" no
is_multi_region_trail 全リージョンの証跡を記録するか否か。https://aws.amazon.com/jp/cloudtrail/faqs/ を参照 bool true no
kms_custom_key_policy CloudTrailのログを暗号化に用いるKMSのキーポリシーに、追加のキーポリシーを指定する。 string null no
kms_key_alias_name CloudTrailのログを暗号化するためのKMSキーのエイリアス名。 string "alias/trail-encryption-key" no
kms_key_deletion_in_days CloudTrailを暗号化するKMSキーを削除する際の待機日数。7以上30以下で設定してください。(https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html#KMS-ScheduleKeyDeletion-request-PendingWindowInDays を参照) number 30 no
kms_key_tags CloudTrailのログを暗号化するKMSキーに付与するタグ。 map(string) {} no
trail_tags Trailに付与するタグ map(string) {} no

Outputs

Name Description
bucket 証跡用bucket名
bucket_arn 証跡用bucketのARN
bucket_id 証跡用bucketのID
cloudtrail_arn TrailのARN

※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.