AWS S3へのアクセスに使用するSDKが古いと、署名バージョンが2となっていますが、バージョン4以降でないとS3へのアクセスができなくなるようです(2019年6月24日予定)。
あまり大々的に告知されていないので、予定通り進むと2019/6/24は世界的に大規模なシステム障害が発生するかもしれません。
巻き込まれないために、きちんと対応しておくことが大切です。
調査や対応後の検証をスムーズかつ確実に行えるよう、S3サーバログとAthenaを使用して抽出する方法を紹介します。
S3サーバログ保存用バケット作成
まず、***-s3-logのような名前のバケットを作成します。
無駄に課金されないよう、ライフサイクル設定で3日程度(調査範囲に応じて)で消えるようにした方が良いと思います。
S3サーバログ設定
ログ採取したいバケットに対し、サーバログを有効化します(プロパティから設定)。
保存バケットは前段の保存用バケットを指定し、ディレクトリは「Server/」とします。
※「Server/ログ採取バケット名」のようにして仕分けしやすくしても良いですが、後続のAthenaとの整合性をとってください。
Athena
データベース作成
CREATE DATABASE s3_accesslogsdb;
テーブル作成
CREATE EXTERNAL TABLE IF NOT EXISTS s3_accesslogsdb.accesslogs(
BucketOwner string,
Bucket string,
RequestDateTime string,
RemoteIP string,
Requester string,
RequestID string,
Operation string,
Key string,
RequestURI_operation string,
RequestURI_key string,
RequestURI_httpProtoversion string,
HTTPstatus string,
ErrorCode string,
BytesSent string,
ObjectSize string,
TotalTime string,
TurnAroundTime string,
Referrer string,
UserAgent string,
VersionId string,
HostId string,
SingnatureVersion string,
Encrypt string,
AuthType string,
HostHeader string,
Tls string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)$'
) LOCATION 's3://ログ保存バケット名/Server/'
対象抽出
以下のSELECTを実行し、最新のものの時間が対処後に発生していなければOK、
発生していたら対処を見直す必要があります。
結果として抽出されるものは、SigV2(署名バージョン2)でアクセスされたリクエストなので、対象がある場合は対処しないとアクセス不能になるおそれがあります。
SELECT * FROM "s3_accesslogsdb"."accesslogs" WHERE singnatureversion LIKE '%SigV2%' ORDER BY requestdatetime DESC limit 10;