Slide 1

Slide 1 text

CloudTrail を見つめ直してみる クラメソおおさか IT 勉強会 Midosuji Tech 〜年度始め宣言LT大会〜 (April 22, 2026) Speaker : @kazzpapa3(ICHINO Kazuaki) / JAWS-UG 神戸

Slide 2

Slide 2 text

Biography { "Bio": { "Name": "ICHINO Kazuaki a.k.a. kazzpapa3", "Organization": "A certain AWS partner company", "Role": "Technical Support Engineer", "Favorite AWS Services": [ "AWS CLI", "AWS CloudTrail", "Kiro CLI" ], "Less Favorite AWS Service (as a Support Engineer)": [ "AWS Billing (請求ロジックが難解すぎる)" ], "Personal Interest": "初音ミク", "Socials": { "Twitter/X": "@kazzpapa3", "LinkedIn": "https://www.linkedin.com/in/kazzpapa3/" } } }

Slide 3

Slide 3 text

このところの悩み @kazzpapa3 / #midosuji_tech 3 / 25

Slide 4

Slide 4 text

アクセスキーが割と漏れる ここ半年以上、リセールアカウントでのアクセスキーの流出に悩まされ てきました お客様の管理不足や知識のアップデートが追いついていないことが多そ うですが、やはり漏れるべくして漏れている気がしています 漏れたキーに対してローテーションしてもらうとともに、不審な行動が ないか確認してもらうが、割と話が通じない場面が多い @kazzpapa3 / #midosuji_tech 4 / 25

Slide 5

Slide 5 text

今一度 CloudTrail をちゃんと理解しよう @kazzpapa3 / #midosuji_tech 5 / 25

Slide 6

Slide 6 text

そして啓蒙しよう! @kazzpapa3 / #midosuji_tech 6 / 25

Slide 7

Slide 7 text

概念は大きく 3 つ 2 つ 機能 概要 イベント履歴 AWS リージョン 内の過去 90 日間の管理イベントをデフォルトで記録 CloudTrail Lake 行ベースの JSON 形式の既存のイベントを Apache ORC 形式に変換した上で、料金プランにより最 大 3,653 日(約 10 年)の保存が可能なマネージドデータレイク SQL で手軽にイベントを検索・分析することができるが 2026 年 5 月 31 日以降、新規受付停止 証跡 S3 バケットに JSON形式 で出力でき、保持期間は S3 のライフサイクルで任意で設定可能 シンプルにログを保存しておきたい用途に向いている 分析や検索方法は別途講じる必要がある 過去 90 日間の管理イベントのデフォルト記録は無料 証跡での管理イベントの1つ目の配信は無料 ただし、S3 バケットでの保管にかかる費用は必要 明示的に「証跡を作成する」という手順が必要 @kazzpapa3 / #midosuji_tech 7 / 25

Slide 8

Slide 8 text

つまり誰でも管理イベントは 90 日は記録されている 明示的な証跡の出力や CloudTrail Lake の使用をしていなくても、管理 イベントは 90 日間記録されている そのためどのようなお客様でも権限さえあれば、問題が発生した時に管 理イベントを確認することができる 不正利用を働いた攻撃者が どのようなリソースを作ろうとした のか そのリソースの作成が 成功したのかエラーだったのか 成功していれば、意図しないリソースが作られているとわかる これにより 高額請求につながる恐れがある、と判断できる @kazzpapa3 / #midosuji_tech 8 / 25

Slide 9

Slide 9 text

はず @kazzpapa3 / #midosuji_tech 9 / 25

Slide 10

Slide 10 text

(たぶん)検索しにくい、見にくい 新規受付は停止するものの CloudTrail Lake というサービスが用意され ていたくらいなので、デフォルト無料で使えるイベント履歴は、マネジ メントコンソールで検索しにくい、見にくい 日付指定で範囲可能 イベント名やイベントソースなどの「ルックアップ属性」とその属性に 呼応する値の 1 対しか検索条件に含めることができない @kazzpapa3 / #midosuji_tech 10 / 25

Slide 11

Slide 11 text

こんな悩みを解決 @kazzpapa3 / #midosuji_tech 11 / 25

Slide 12

Slide 12 text

みんな大好き黒い画面 AWS CLI を利用して抽出すると後処理がやりやすいのではないかとい う所感 AWS マネジメントコンソールに備わっている CloudShell には AWS CLI や JSON を抽出・加工を容易にする jq パッケージが導入済み @kazzpapa3 / #midosuji_tech 12 / 25

Slide 13

Slide 13 text

最低限必要な権限 最低限、以下の権限がある状態でマネジメントコンソール抜いサインイ ンしている IAM エンティティであれば操作可能 cloudshell:CreateEnvironment : 環境の作成 cloudshell:CreateSession : コンソールからの接続 cloudshell:GetEnvironmentStatus : 環境ステータスの取得 cloudshell:StartEnvironment : 停止中の環境の起動 cloudtrail:LookupEvents : 過去90日間の管理イベント / Insights イ ベントの検索 @kazzpapa3 / #midosuji_tech 13 / 25

Slide 14

Slide 14 text

とはいえ、みんな苦手な黒い画面 黒い画面がとっつきにくい方も多そう なので research-via-cloudtrail として作ってみました @kazzpapa3 / #midosuji_tech 14 / 25

Slide 15

Slide 15 text

research-via-cloudtrail 基本的には ./research.sh [OPTIONS] の要領で実行するだけ 引数に渡したオプション項目に応じて cloudtrail:LookupEvents を実行 して CSV ファイルに出力可能 オプトインしている全リージョンに対して cloudtrail:LookupEvents し てくれるので、普段使わないリージョンに何か悪さをされていても網羅 的に把握可能 もちろん、特定のリージョンに限定することも可能 @kazzpapa3 / #midosuji_tech 15 / 25

Slide 16

Slide 16 text

とはいえ、AWS API いっぱいあるじゃないか サービスも多く、各サービス内でもさまざまな API がある 狙い撃ちして検索するのも一苦労じゃないか @kazzpapa3 / #midosuji_tech 16 / 25

Slide 17

Slide 17 text

そこで AWS サービスリファレンス情報 https://servicereference.us-east-1.amazonaws.com/ として「参照 情報」が利用できるサービスと公開 URL の情報が提供されている どのようなサービスがあるかは、上記にアクセスすることで判断可能 その上で、上記で見つかったサービスごとの参照情報 URL にアクセス することで、どのような API アクションがあるかを網羅的に把握可能 @kazzpapa3 / #midosuji_tech 17 / 25

Slide 18

Slide 18 text

AWS サービスの一覧の出力例 curl -s http://servicereference.us-east-1.amazonaws.com/ { "service" : "a2c", "url" : "https://servicereference.us-east-1.amazonaws.com/v1/a2c/a2c.json", "modified" : 1774454984 } # 〜中略〜 , { "service" : "iam", "url" : "https://servicereference.us-east-1.amazonaws.com/v1/iam/iam.json", "modified" : 1774454982 }, # 〜中略〜 , { "service" : "xray", "url" : "https://servicereference.us-east-1.amazonaws.com/v1/xray/xray.json", "modified" : 1774454960 } ] @kazzpapa3 / #midosuji_tech 18 / 25

Slide 19

Slide 19 text

IAM にアクセスした場合の例 curl -s https://servicereference.us-east-1.amazonaws.com/v1/iam/iam.json { "Name" : "iam", "Actions" : [ { "Name" : "AcceptDelegationRequest", "Annotations" : { "Properties" : { "IsList" : false, "IsPermissionManagement" : false, "IsTaggingOnly" : false, "IsWrite" : true } }, "Resources" : [ { "Name" : "delegation-request" } ], "SupportedBy" : { "IAM Access Analyzer Policy Generation" : false, "IAM Action Last Accessed" : false } }, { # 〜以下略〜 19 / 25

Slide 20

Slide 20 text

個人的に AWS サービス情報の取得を関数化している cat ~/.zshrc # 〜中略〜 awsservice() { curl -s https://servicereference.us-east-1.amazonaws.com/ | jq -r ".[] | select(.service | contains(\"$1\")).$2" } servicereference() { curl -s $1 | jq -r '.Actions[].Name' } @kazzpapa3 / #midosuji_tech 20 / 25

Slide 21

Slide 21 text

これにより まずはサービスの URL を取得する awsservice iam url https://servicereference.us-east-1.amazonaws.com/v1/iam/iam.json 次に、上記で得られた URL にアクセスする servicereference https://servicereference.us-east-1.amazonaws.com/v1/iam/iam.json AcceptDelegationRequest AddClientIDToOpenIDConnectProvider # 〜中略〜 UploadServerCertificate UploadSigningCertificate @kazzpapa3 / #midosuji_tech 21 / 25

Slide 22

Slide 22 text

たぶんアクセスキー流出は止まらない CloudTrail 自体の使い方と何観点で見ればいいか ちょっとしたお役立ちツールを作って API アクション名を調べやすくして 漏れたとしても調査が容易になる お客様との会話のプロトコルが合う そんな啓蒙をしていこうという所存 @kazzpapa3 / #midosuji_tech 22 / 25

Slide 23

Slide 23 text

Security is job zero. Thank you.

Slide 24

Slide 24 text

Appendix 24 / 25

Slide 25

Slide 25 text

参考資料 What Is AWS CloudTrail? - AWS CloudTrail CloudTrail Lake availability change - AWS CloudTrail research-via-cloudtrail 25 / 25