【CloudTrail, Athena】パブリックアクセス可能なS3オブジェクトの投稿有無を調べてみる

2020.02.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今では S3のセキュリティを高める機能として ブロックパブリックアクセス があります。

S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました

そのため、これから新規に作成したバケットに対して、 誤って パブリックアクセス可能なS3オブジェクト(以降パブリックオブジェクト) を投稿することは未然に防げます。

もちろん既にあるバケットについても、 ブロックパブリックアクセスを有効にすることで パブリックオブジェクトの投稿を防げますが、 懸念は 本番稼働のアプリケーションへの影響 です。

例えば、あるアプリケーション(SDK)がパブリック読み取りの設定で S3の PutObject を行っていた場合です。 ブロックパブリックアクセスを有効にすると、このPutObjectが 403(Access Denied) を返すようになります。

そのため、セキュリティ対策として 「とりあえず、ブロックパブリックアクセスをONに」 はリスクがあります。

今回は事前に「特定のS3バケット」に対して パブリックオブジェクトを投稿していないかを CloudTrailAthena を使って調査する環境を作ってみます。

目次

  1. 概要
  2. やってみる
  3. おわりに

概要

  • S3バケット(データ格納用)に対して パブリックオブジェクトを投稿します
  • S3操作(投稿)のログは CloudTrailを介して S3バケット(ログ格納用) に格納されます
  • Athena を使ってパブリックオブジェクト投稿の証拠を確認します

やってみる

データ投稿用のS3バケットは作成済みとして、 以降で CloudTrail, Athena を触っていきます。

CloudTrail: 証跡の作成

CloudTrail > 証跡情報 から「証跡の作成」を選択します。

今回は特定(東京リージョン)のS3バケットに対象を絞るので、 証跡情報を全てのリージョンに適用 はしません。

管理イベント、Insights イベントは取得しません。 (※ 各イベントの内容については AWS: CloudTrail イベントとは を参照)

本題の データーイベントの設定 を行います。 (+) S3バケットの追加 から対象のバケットを選択します。 今回は「パブリックオブジェクトを投稿していないか」を調べる目的なので、 書き込み にチェックを入れます。

今回はログ格納用 S3バケットを新規に作成します。 S3バケット名を指定、他はデフォルト設定です。

作成後、マネジメントコンソールから証跡を確認します。

Athena: ログの分析

証跡作成後、あらかじめ データ格納用S3バケットに適当にオブジェクトを投稿しておきます。

Athenaを使った CloudTrailログの分析は AWS CloudTrail ログのクエリ が参考になります。

▼ テーブルの作成

CloudTrailのコンソール画面からお手軽にテーブルを作成 できます。

CloudTrailのコンソール画面の 「イベント履歴」 から Amazon Athena で高度なクエリを実行します を選択します。

保存場所に CloudTrailログが格納されている S3バケットを指定して テーブルの作成 します。

Athenaのコンソール画面で、テーブルを確認できました。

▼ クエリ実行

以下の内容のクエリを実行して、パブリックオブジェクト投稿のログを探してみます。 (SELECTできる内容については AWS: CloudTrail レコードの内容 、 S3バケット・オブジェクトの ACLについては AWS: アクセスコントロールリスト (ACL) の概要 が参考になります)

  • SELECT
    • eventTime:リクエストが作成された日付
    • userIdentity.arn: リクエストしたユーザーのARN
    • eventName: リクエストされたアクション
    • userAgent リクエストが行われたエージェント
    • sourceIPAddress: リクエストが行われたIPアドレス
    • requestParameters: リクエストとともに送信されたパラメータ
  • FROM
    • 先程作成したテーブル
  • WHERE
    • PutObjectのリクエスト
    • かつ パブリックアクセスのACLを付与している (x-amz-acl リクエストヘッダーに public-read/public-read-write/authenticated-read のいずれかがある)

以下のクエリを実行します。

SELECT eventTime,
         userIdentity.arn,
         eventName,
         sourceIPAddress,
         userAgent,
         requestParameters
FROM cloudtrail_logs_trail_cm_kawahara_test_123456789
WHERE eventName = 'PutObject' AND
      (requestParameters LIKE '%x-amz-acl%public-read%' OR
      requestParameters LIKE '%x-amz-acl%authenticated-read%');

結果がでてきました。CSVで結果をダウンロードできます。

1行の内容を見てみます。

  • eventTime: 2020-02-03T15:34:11Z
  • arn: arn:aws:sts::74xxxxxx:assumed-role/aaaa.bbbb/ar-cred-proc
  • sourceIPAddress: xx.xx.xx.xx
  • userAgent: [aws-cli/1.17.9 Python/3.7.3 Darwin/19.3.0 botocore/1.14.9]
  • eventName: PutObject
  • requestParameters: {"bucketName":…,"Host":…, "x-amz-acl":"public-read" ,"key":"20200204_00-34-10.log"}

public-read ACLを付与して PutObjectを行っているログの情報を確認できました。

おわりに

パブリックオブジェクト投稿の有無を CloudTrailと Athenaを使って調査してみました。

今回は 1バケットを対象としましたが、網羅的に調査したい場合は「全てのバケット」 の設定を入れて証跡を作成します。

昔々に作成した S3バケットのセキュリティ対策として 「とりあえず、ブロックパブリックアクセスをONに」 する前に本ブログの検証を行ってみると良いかと思います。

この記事が少しでもどなたかのお役に立てば幸いです。