AWSをいじり倒す(9.CroudTrail、Athena)

前回からの引き続きで、CroudTrailを使ってVPCエンドポイントを使ったS3へのアクセス証跡を確認してみる

参考にしたのはこれ

S3のVPC Endpoint経由でアクセス出来ているか否かの確認 – Publicサブネット編 – サーバーワークスエンジニアブログ

 

CroudTrailは有効化しないとログ残らないのかな、と思っていたが

特に設定の必要はなく常時ONになっているようだ。

画面を開いてみると早速今までいじくりまわしてきた形跡が見えた。

f:id:Messerarche:20200507074006p:plain

 

 

 

 

一部切り取って確認してみる。

f:id:Messerarche:20200507074853p:plain

眺めていて気付いたのは

バケットにオブジェクトをアップロードしたログ、というのは残ってない。

・EC2上でCLIによるBucket操作を行うと、ユーザ名はEC2のインスタンスIDになる。

(黒塗りのところはAWSコンソールから操作したので自分のユーザIDが表示されている)

という点。つまり、何でもかんでもCroudTrailに残るわけではないので、事前に目的のログが保存されるかどうかは確認しておかないといけないし、EC2に誰がアクセスしたかを別途把握する仕組みがないと追えなくなる。

 

具体的には、S3のオブジェクト操作ログは、

S3オブジェクトレベルのログ記録+監視方法 - Qiita

のようにオブジェクトレベルのログの記録を有効にする必要がある。

また、EC2のログはClowdWatch logsと連携させてログ記録+監視できる。

AWS構成パターン(CloudWatch Logs/EC2ログ管理)

 

このように調べたら何らかの対処法は出てくるけど、この辺は手探りで設定していくと検討漏れが出ること間違いなしなので、構築ノウハウを記載した書籍等を読んで所謂ベストプラクティスなやり方を身に付けた方が良さそうだ。

資格対策本ではこの辺はカバーできないなぁ。

 

 

さて改めて、

・S3にエンドポイント経由のアクセスができているかどうか

・ついでにオブジェクトレベルのログ記録ができるかどうか

の2点を確認することにする。

 

 

 S3にエンドポイント経由のアクセスができているかどうか

エンドポイントのない状態でバケット作成・削除→エンドポイント作成→バケット作成・削除のログ。

f:id:Messerarche:20200516222552p:plain



エンドポイント作成前のCroudTrailのイベント情報

f:id:Messerarche:20200516222840p:plain

ログ詳細を頑張って見なくても、発信元IPがパブリックIPになっているので、

これでもう十分インターネット経由ってわかりそう

エンドポイント作成後

f:id:Messerarche:20200516223426p:plain

発信元IPアドレスがローカルになっている。 

やはりこれだけでちゃんと機能しているとわかってしまった。

 

寂しいのでログ詳細も見てみると

エンドポイントなし

f:id:Messerarche:20200516224018p:plain

エンドポイントあり

f:id:Messerarche:20200516224036p:plain
 vpnEndpointIdってのが増えていることがわかる。

 

通信時間に大した差がないのは前記事の通りだが、

エンドポイント経由かどうかで料金が変わってくるので、

エンドポイント設定後は一度ぐらいこのログを見て安心した方が良いと思う。

 

オブジェクトレベルのログの記録

このオブジェクトレベルのログというのは

今まで見ていたイベント履歴にログが増えるわけではなく、

証跡情報として指定したS3バケットに保存される形式になるようだ。

 

まずはログ保存用のバケットをサクッと作る

f:id:Messerarche:20200517150721p:plain

 

そしてログ保存の設定。

CroudTrailの証跡の作成から

f:id:Messerarche:20200517150817p:plain

 

証跡情報の作成

f:id:Messerarche:20200517150958p:plain

証跡名は適当に。

別リージョンからアクセスすることはないので、

全てのリージョンに→いいえ

 

管理イベントはとりあえず全部記録したいので「すべて」「はい」

 

Insightsイベント

f:id:Messerarche:20200517151201p:plain

書き込み管理APIの異常な呼び出しボリュームとはいったい

CloudTrail Insights の発表: 異常な API アクティビティの特定とそれへの対応 | Amazon Web Services ブログ

スムーズに実行されている場合のログエントリは、さながら工場で安定して響く安心感のある機械音のようなものです。しかし不具合が発生した際には、その音が邪魔になりどの機器に不具合があるのかが聞き取りにくくなります。ログデータの量が膨大になる可能性があるような大規模なソフトウェアシステムでも、同じことが言えます。その記録を精査して実用的な情報を見つけるのは骨が折れる仕事です

ぐうわかる・・・

 

で、その中から異常なアクティビティを発見してくれる機能ってことらしい。

お値段安かったら有効にしてもいいと思うけど

CloudTrail Insights では、Insight タイプごとに分析された書き込み管理イベントについて、100,000 イベントごとに 0.35 USD の料金が請求されます。

100000イベント・・・が多いかどうかはシステムの規模にも依るのでなんとも。

 

データイベント

f:id:Messerarche:20200517152256p:plain

記録したいS3バケットを指定することができる。

てっきりS3の設定画面からログ記録の有効化するのかと思ったけど、

CroudTrail側から設定できるみたいだ。

 

S3バケットの追加からバケットを選択

f:id:Messerarche:20200517152444p:plain

 

ストレージの場所

f:id:Messerarche:20200517153420p:plain

ログの保存先S3。さっき作ったS3バケットを指定。

プレフィックスで指定した場所にたまっていく模様

ログファイルの検証とは、ログの改竄がないかどうかをチェックする仕組み。

 

できた。

f:id:Messerarche:20200517153850p:plain

 

 

S3の設定を見に行くと、オブジェクトレベルのログ記録が有効になっている

f:id:Messerarche:20200517154000p:plain

 

さっそくオブジェクト操作をしてみる

f:id:Messerarche:20200517154506p:plain

確認、削除、アップロードを行った。

 念の為、S3のGUIから手動でも適当なファイルをアップロードダウンロードを行っておく

 

〜10分後〜

ログの生成を確認。保存先の階層が結構深い

f:id:Messerarche:20200517160202p:plain

json形式が.gzで保存されているので、ローカルに落として解凍し

中身を見てみる

f:id:Messerarche:20200517161329p:plain

わかりにくっ!

これはこうやって読むものじゃないな

 

これによるとAthenaで読むのが良いみたい。

CloudTrailでS3オブジェクトレベルのログを取得してAthenaで閲覧してみた | Developers.IO

 

そもそもAthenaってなんだ

Amazon Athena とは - Amazon Athena

標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) でのデータの直接分析を簡易化するインタラクティブなクエリサービスです。

めちゃめちゃ限定的ィ!

それだけS3のログはよく利用されるってことなのかな。

 

早速、CroudTrailのイベント履歴からAmazon Athenaで高度なクエリを実行

f:id:Messerarche:20200517161955p:plain

 

保存場所を選ぶ。この時のSQLのクエリは自動で作ってくれている。

ここで自動生成されるAthenaテーブル名は後で使う。

f:id:Messerarche:20200517162108p:plain

 

できたようなのでAthenaに移動

f:id:Messerarche:20200517162211p:plain

 

 

Athenaの画面。

f:id:Messerarche:20200517162346p:plain

 

まずはSettingsで、Athenaクエリ実行結果を保存するS3バケットを指定。

f:id:Messerarche:20200517162631p:plain

 

クエリを作成。

f:id:Messerarche:20200518114503p:plain

参考記事からコピペしたものをベースに、日付とテーブル名を変更。

テーブル名はさきほど表示されていたものを使用。

左のメニューにも表示されてるけどね。

 

ところでこのクエリの書き方って、どうやって学ぶんだろう・・・。

自動生成する方法は見当たらないので、いじくってたらだんだん覚えていく系かしら

 

 Save asでクエリを保存。

f:id:Messerarche:20200517163740p:plain

 

Run queryで実行してみると・・・

f:id:Messerarche:20200518114751p:plain


あれ?GUIから出し入れしたログのみが出てきて、

EC2からCLIで操作したログがでてこない・・・。

 

仕方ないのでログファイルを直接頑張って読んでみることにする

f:id:Messerarche:20200518120017p:plain

eventNameがDeleteObject・・・これはrmしたときのログだろう。

 

一方でcpしたときは

f:id:Messerarche:20200518124039p:plain

UploadPartに
 

f:id:Messerarche:20200518125650p:plain

CreateMultipartUploadに

 

f:id:Messerarche:20200518125742p:plain

CompleteMultipartUpload

という3種類が出てきている。
 

みるべきキーワードが分かってきたので、クエリを変更してみる。

f:id:Messerarche:20200518130830p:plain


GetObject,DeleteObjectに加えて上記の3種イベントを追加。

また、ログに

f:id:Messerarche:20200518130512p:plain

と書いてあったので、

and useridentity.type = 'IAMUser';

の条件では引っ掛からなくなると思い、削除した。

 

このクエリの実行結果はこちら。

f:id:Messerarche:20200518131411p:plain


で、このUploadpartとは、

つまるところ適当に30MBのファイルをアップロードしてしまったせいで

図らずしもこのマルチパートアップロードを行ってしまったらしい

Amazon S3 マルチパートアップロード CLI

大きなファイルをアップロードするときに分割する機能。

cpコマンドを使うと自動でマルチパートになるんだと。

 

 これは1パートあたり5MB以上、最大10000パートまでという仕様。

Amazon S3 マルチパートアップロードの制限 - Amazon Simple Storage Service

 

今回30Mのアップロードは4分割されてるっぽいので、8M前後に勝手に分けられたと推測。ログをよく読むとそれも書いてあった。

これが1つと

f:id:Messerarche:20200518132257p:plain

これが3つ。

f:id:Messerarche:20200518132236p:plain

いい具合に分割して送ってくれてたのね。

 

順番としては

CreateMultipartUpload→Uploadpart*4→CompleteMultipartUpload

なんだろうけど、順番通りログがでてないのは謎。

ログはコンマ0秒以下は残ってないので、仕方ないのかなぁ。

 

で、小さいファイルならCLIでもPutObjectになるんだよね?

ってことで1KBのファイルを作ってcpしてみる

f:id:Messerarche:20200518140242p:plain

 

結果。

f:id:Messerarche:20200518140159p:plain

無事PutObjectになった。

 

S3に複数人でファイルやりとりするとなったら、

やっぱ出し入れの情報は見たいし、オブジェクトレベルでのログ確認は必須だろうなぁ

 

 

ということでS3の操作から始まって、AWS CLIVPCエンドポイント、CroudTrail、Amazon Athena、マルチパートアップロードと色々話が広がって勉強になった。

 

進捗

f:id:Messerarche:20200518142525p:plain