CreateUser した人を Steampipe × AbuseIPDB で abuser チェックする
はじめに
本記事は、先日ご紹介した Steampipe の活用例です。
みんな大好き CloudTrail には AWS 内外からの API コールのログが残る(残らないものもある)ので、システム障害や重大なインシデントが発生した際に調査することが多いかと思います。
例えばアクセスキーが abuser (攻撃者)の手に渡った場合、ほぼ 100 パー IAM と EC2 が狙われます。攻撃者が IAM に対して行った操作は us-east-1 の CloudTrail に、EC2 に対して行った操作は該当リージョンの CloudTrail に記録されているはずです。攻撃で使われやすい API については以下の記事で触れています。
かたや Steampipe には AWS プラグインのほか、AbuseIPDB プラグインが用意されています。
CloudTrail には API コール元の IP アドレスも残るので、本記事では AbuseIPDB と突き合わせて abuser チェックするクエリをご紹介したいと思います。CloudTrail は IAM だけなら調査対象リージョンは us-east-1 のみに絞れますので、本記事のタイトル通り今回は CreateUser を例に試していきます。
前準備1:AbuseIPDB の API キーを作る
AbuseIPDB のサイトでサインインします。アカウントを持っていない場合は先にサインアップしてください。ユーザーアカウント画面で API キーを作成しておきます。
前準備2:CloudTrail の証跡を作る
Steampipe の AWS プラグインで用意されている aws_cloudtrail_trail_event というテーブルで CloudTrail のログが参照できますが、実はこれ CloudTrail から直接ではなく CloudWatch Logs から読み取られています。そのため us-east-1 の CloudTrail のダッシュボードから CloudWatch Logs 有効、かつ "管理イベント" にチェックを入れた証跡を作成しておきます。
ロググループ名は 'CloudTrail/GlobalServiceEvents' としておきます。後でクエリの条件に使います。
前準備3:Steampipe の config を設定する
~/.steampipe/config/aws.spc
regions = ["us-east-1"]
~/.steampipe/config/abuseipdb.spc
前準備1 で作った API キーを指定します。
connection "abuseipdb" { plugin = "abuseipdb" # Sign up for a free API key at https://www.abuseipdb.com/account/api api_key = "xxxxxx" }
クレデンシャルの設定は前回と同様です。
CreateUser した人を abuser チェックする一発クエリはこちら
select ip_address, abuse_confidence_score, country_code, last_reported_at from abuseipdb_check_ip where ip_address in (select distinct(inet(source_ip_address)) from aws_cloudtrail_trail_event where log_group_name = 'CloudTrail/GlobalServiceEvents' and event_name = 'CreateUser' and source_ip_address != 'AWS Internal') +-------------+------------------------+--------------+---------------------------+ | ip_address | abuse_confidence_score | country_code | last_reported_at | +-------------+------------------------+--------------+---------------------------+ | xx.xx.xx.xx | 0 | JP | <null> | +-------------+------------------------+--------------+---------------------------+
スコア、国コード、直近で abuse 報告された日時が表示されます。上記の例は筆者の IP アドレスなのでスコアがカウントされてなくて何よりです。ちなみに IP アドレスが abuser だった場合は以下のように表示されます。
+-------------+------------------------+--------------+---------------------------+ | ip_address | abuse_confidence_score | country_code | last_reported_at | +-------------+------------------------+--------------+---------------------------+ | xx.xx.xx.xx | 100 | LU | 2022-07-14T13:00:30+09:00 | +-------------+------------------------+--------------+---------------------------+
クエリの惜しいところは苦しまぎれの IN 句である点です。Steampipe は SaaS 間の情報をジョインできるのが醍醐味と思うのですが、私が試した限りでは abuseipdb_check_ip テーブルの ip_address と aws_cloudtrail_trail_event テーブルの source_ip_address をイコールでつなごうとしても以下のようなエラーが出て実行できず。親切な方教えてください。
Error: rpc error: code = Internal desc = 'List' call for table 'abuseipdb_check_ip' is missing 1 required qual: column:'ip_address' operator: = (SQLSTATE HV000)
おわりに
だからなんだと言われればそれまでですが、Steampipe の活用例をご紹介しました。クエリはスクリプトで回すこともできるので、CloudTrail に限らず他の IP アドレスの調査にも応用がきくかと思います。ご興味あればぜひお試しください。