CreateUser した人を Steampipe × AbuseIPDB で abuser チェックする

Steampipe でお宝発見できるかな
2022.07.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

本記事は、先日ご紹介した 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 キーを作成しておきます。

AbuseIPDB

前準備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 アドレスの調査にも応用がきくかと思います。ご興味あればぜひお試しください。