CloudTrailのログをKMS暗号化&検証できるようになりました!

2015.10.04

地味なサービスを追い続けるのが趣味の森永です。

皆大好きCloudTrailにエンプラのお客様には非常に嬉しいアップデートが来ていました。

  • ログをKMS(AWS Key Management Service)で暗号化できるようになった
  • ログに手を加えられていないか、削除されていないかを検証できるようになった

KMSでの暗号化

CloudTrailは従来よりS3にログを吐き出す設計になっていたため、S3の暗号化をすることでためておくログを暗号化することはできました。
今回のアップデートで、CloudTrailにKMSでの暗号化を設定することができるようになりました!

従来と同様、権限さえあれば透過的に復号化されるので、ユーザやアプリ側での変更は不要です。

ログの検証

今まではCloudTrailで証跡を取っていても、ログファイル自体に手を加えられてはそれを検知することが困難でした。
今回のアップデートで、CloudTrailのログに加えられた変更、削除を検出することができるようになりました!

設定方法

暗号化するために、KMSの鍵を作成しましょう。
KMSはIAMのサービス画面で設定します。

cloudtrail_encryption02

既存の鍵にポリシーを追加することでも設定可能です。

{
  "Version": "2012-10-17",
  "Id": "key-consolepolicy-2",
  "Statement": [
    (既存の設定のため省略)
    {
      "Sid": "Enable CloudTrail log decrypt permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::アカウントID:user/復号化できるユーザ名"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "Null": {
          "kms:EncryptionContext:aws:cloudtrail:arn": "false"
        }
      }
    },
    {
      "Sid": "Allow CloudTrail to encrypt logs",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "kms:GenerateDataKey*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:cloudtrail:arn": "arn:aws:cloudtrail:*:アカウントID:trail/*"
        }
      }
    },
    {
      "Sid": "Allow CloudTrail access",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "kms:DescribeKey",
      "Resource": "*"
    }
  ]
}

CloudTrailのサービス画面から「Configuration」に行くと、「Encrypt log files?」と「Enable log file validation」が追加されていることが分かります。

cloudtrail_encryption01

右上の鉛筆マークをクリックして、「Advanced」をクリックすると詳細設定画面が表示されます。
「Encrypt log files?」を「Yes」にし、先ほど作成、設定したKMSキーを選択します。
「Enable log file validation」を「Yes」にし、「Save」を押すと設定完了です。

cloudtrail_encryption03

もちろん、どちらか片方だけ設定するのでも構いません。

ログの整合性確認

ログが変更された際に変更を検知できるかを確認してみます。
仕組みとしては1時間毎にハッシュ値を取得して、それを照合しているようです。
なので、設定直後はハッシュ値がないということで確認はできません。

暫く建ってから確認しますが、CLIからの検証のみ対応しているようです。
CLIを対応しているものにアップデートしてから行います。

# pip install --upgrade awscli

# aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:リージョン名:アカウント名:trail/Default --start-time 2015-10-4T04:00:00Z
Validating log files for trail arn:aws:cloudtrail:リージョン名:アカウント名:trail/Default between 2015-10-04T04:00:00Z and 2015-10-04T07:05:08Z

Results requested for 2015-10-04T04:00:00Z to 2015-10-04T07:05:08Z
Results found for 2015-10-04T05:13:01Z to 2015-10-04T06:13:01Z:

1/1 digest files valid
3/3 log files valid

validという文字が出力されたので、整合性に問題はないようです。
S3コンソールにて、CloudTrailのファイルを削除して、また1時間ほど経ってからコマンドを実行してみます。

# aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:リージョン名:アカウント名:trail/Default --start-time 2015-10-4T04:00:00Z
Validating log files for trail arn:aws:cloudtrail:リージョン名:アカウント名:trail/Default between 2015-10-04T04:00:00Z and 2015-10-04T07:25:08Z

Results requested for 2015-10-04T04:00:00Z to 2015-10-04T07:25:08Z
Results found for 2015-10-04T05:13:01Z to 2015-10-04T07:13:01Z:

1/1 digest files valid
2/3 log files valid, 1/3 log files INVALID

invalidと表示され、不整合が発生していることが分かります。

最後に

CloudTrailを監査のために有効にしている方は非常に多いと思います。
弊社でも運用サービスを提供するお客様では基本的に有効にするようにしています。

不整合が起きた際に通知するような仕組みを作って置くと更によいかもしれません。(公式対応待ち)

地味サービスもっと活躍しろ!