Amazon S3にストリーミングした監査ログをAmazon Athenaアクションで検索する
以下の手順でAmazon S3にストリーミングした監査ログをAmazon Athenaアクションで検索できます。
事前準備
監査ログストリーミングに設定するバケットをAmazon S3で作成し、作成したバケットをベースマキナで監査ログのストリーミング先として設定します。
監査ログストリーミングの設定方法の詳細は監査ログのAmazon S3へのストリーミングをご参照ください。
1. Amazon Athenaデータソースを設定する
Amazon Athenaでデータベースを作成し、作成したデータベースをベースマキナのデータソースとして設定します。
データソースの設定方法の詳細はAmazon Athenaデータソースの設定をご参照ください。
2. Amazon Athenaでテーブルを作成する
Amazon Athenaで、2で作成したデータベースに1で作成したAmazon S3のバケットを使ってテーブルを作成します。
テーブルの例はテーブルの例をご参照ください。
テーブルの作成方法の詳細はAmazon AthenaのドキュメントのAthena でテーブルを作成する (opens in a new tab)をご参照ください。
3. Amazon Athenaアクションを設定する
1で設定したデータソースと、2で作成したテーブルに対してクエリを実行するSQL文を設定したアクションを作成します。
SELECT * FROM `your_table_name` LIMIT 5;
アクションの設定方法の詳細はAmazon Athenaアクションの設定をご参照ください。
4. アクションを実行する
アクションを実行すると、設定したSQL文が実行され、監査ログのデータが取得できます。
※以下の画像はアクション実行のログのテーブルを取得した例です。
さらに{id=aaabbbcccdddeee, name=開発環境}
のような文字列のAthenaのMAP
やARRAY
型の列の値は、
以下のようにCAST関数でJSON型に変換するとJavaScriptのオブジェクトや配列などに変換できます。
SELECT
CAST(action AS JSON) AS action,
CAST(environment AS JSON) AS environment
FROM `your_table_name`
LIMIT 5;
詳細はARRAY
,ROW
,MAP
型の列の値をJavaScriptの配列やオブジェクトに変換するをご参照ください。
テーブルの例
以下は監査ログの形式に合わせたテーブルの例です。
アクション実行のログ
-- your_bucket_nameには監査ログストリーミングに設定したAmazon S3のバケットの名前を指定してください。
-- your_database_nameには1で作成したデータベースの名前を指定してください。
-- your_table_nameは任意の名前を指定してください。
CREATE EXTERNAL TABLE IF NOT EXISTS `your_database_name`.`your_table_name` (
`timestamp` string,
`message` string,
`arguments` array<struct<name:string,value:string,type:string>>,
`bmrn` struct<resource:string,class:string,classid:string>,
`action` struct<id:string,name:string,display_id:string,created_at:string,updated_at:string>,
`tenant_id` string,
`client_ip` string,
`context_id` string,
`user` struct<id:string,name:string,email:string>,
`project` struct<id:string,name:string>,
`environment` struct<id:string,name:string>
)
PARTITIONED BY (
`partition_date` string
)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'ignore.malformed.json' = 'FALSE',
'dots.in.keys' = 'FALSE',
'case.insensitive' = 'TRUE',
'mapping' = 'TRUE'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://your_bucket_name/'
TBLPROPERTIES (
'classification' = 'json',
'projection.enabled' = 'true',
'projection.partition_date.format' = 'yyyy-MM-dd',
'projection.partition_date.interval' = '1',
'projection.partition_date.interval.unit' = 'DAYS',
'projection.partition_date.type' = 'date',
'projection.partition_date.range' = '2023-01-01,NOW',
'storage.location.template' = 's3://your_bucket_name/${partition_date}/execute_action/'
);