【CloudTrail, Athena】パブリックアクセス可能なS3オブジェクトの投稿有無を調べてみる
今では S3のセキュリティを高める機能として ブロックパブリックアクセス があります。
そのため、これから新規に作成したバケットに対して、 誤って パブリックアクセス可能なS3オブジェクト(以降パブリックオブジェクト) を投稿することは未然に防げます。
もちろん既にあるバケットについても、 ブロックパブリックアクセスを有効にすることで パブリックオブジェクトの投稿を防げますが、 懸念は 本番稼働のアプリケーションへの影響 です。
例えば、あるアプリケーション(SDK)がパブリック読み取りの設定で S3の PutObject を行っていた場合です。
ブロックパブリックアクセスを有効にすると、このPutObjectが 403(Access Denied)
を返すようになります。
そのため、セキュリティ対策として 「とりあえず、ブロックパブリックアクセスをONに」 はリスクがあります。
今回は事前に「特定のS3バケット」に対して パブリックオブジェクトを投稿していないかを CloudTrail と Athena を使って調査する環境を作ってみます。
目次
概要
- 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
: リクエストしたユーザーのARNeventName
: リクエストされたアクション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に」 する前に本ブログの検証を行ってみると良いかと思います。
この記事が少しでもどなたかのお役に立てば幸いです。