Upgrade to Pro — share decks privately, control downloads, hide ads and more …

超個人的な AWS CLI の使い所 - Amazon CloudTrail 編 -

超個人的な AWS CLI の使い所 - Amazon CloudTrail 編 -

2024年7月25日の JAWS-UG CLI 専門支部( https://jawsug-cli.connpass.com/event/324664/ )でお話しした内容です。
テクニカルサポートエンジニアとして、ちょっとした調査の際に CLI で lookup-evnets をした方が取り回しがしやすいので、CloudTrail の基本をお話しした上で、超個人的な使い方をまとめています。

kazzpapa3

July 25, 2024
Tweet

More Decks by kazzpapa3

Other Decks in Technology

Transcript

  1. 超個⼈的な AWS CLI の使い所 - Amazon CloudTrail 編 - [JAWS-UG

    CLI専⾨⽀部 #412 CloudShell⼊⾨] 株式会社サーバーワークス 市野 和明(JAWS-UG 神⼾) 2024-07-25
  2. 4 はじめまして 名前︓市野 和明(いちの かずあき) 所属︓株式会社サーバーワークス マネージドサクセス部 テクニカルサポート課 好きな AWS

    サービス︓ AWS CLI (テクサポとして) 嫌いな AWS サービス︓ Amazon FSx for Windows 趣味︓ミクが好き、酒を飲む @kazzpapa3
  3. 8 の、前に CLI 専⾨⽀部のおかげで、転職ができました。 現職への転職のきっかけとなったのは AWS に特化して仕事がしたい︕ だったのですが、転職活動中に CLI 専⾨⽀部に⼊り浸ってあれこれ学ばせてい

    ただきました。 ⾯接でも 「CLI 専⾨⽀部というところで、AWS API のレベルから学習してます感」 を全⾯に出して無事転職ができました。 その後、少し⾜が遠のいてしまったので、お礼もそこそこだったのですが、 あらためてありがとうございます。
  4. 10 無料利⽤枠もあり みなさま CloudTrail を使ってますか︖ CloudTrail ではデフォルトで 90⽇間、AWS サービスの管理イベントログを 無料で記録してくれています。

    管理イベントログ=コントロールプレーンオペレーションのログ データイベントログ=データプレーンオペレーションのログ インサイトイベントログ=API コールの総量や API エラー率が通常パターンから外れた場合に記録 ・・・データイベント、インサイトイベントは上記の無料での記録の対象外となるため要注意
  5. 11 データイベントと管理イベントで扱いが異なる みなさま CloudTrail を使ってますか︖ CloudTrail ではデフォルトで 90⽇間、AWS サービスの管理イベントログを 無料で記録してくれています。

    管理イベントログ=コントロールプレーンオペレーションのログ データイベントログ=データプレーンオペレーションのログ インサイトイベントログ=API コールの総量や API エラー率が通常パターンから外れた場合に記録 ・・・データイベント、インサイトイベントは上記の無料での記録の対象外となるため要注意 それぞれのイベントの違いやその他詳細は以下をご参照ください CloudTrail のデータイベントと管理イベントの違いは何ですか。 https://repost.aws/ja/knowledge-center/cloudtrail-data-management-events How CloudTrail works https://docs.aws.amazon.com/awscloudtrail/latest/userguide/how-cloudtrail-works.html Logging Insights events https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-insights-events-with-cloudtrail.html
  6. 13 必要に応じてデータイベントの記録も有効化する必要あり AWS CloudTrail の証跡を作成し、 S3 バケットへの保存(および意図しない削除や改ざんへの対策をする)や Amazon CloudWatch Logs

    や Amazon EventBridge との統合を⾏い セキュリティ監視や監査に役⽴てることが望ましいです。 また、前述の通りデータイベントやインサイトイベントの記録もデフォルトでは されていないため、それらの記録が必要な場合も、CloudTrail の証跡の作成が 必要です。
  7. 14 ちゃんと解析するなら Athena 連携などがより強⼒ AWS CloudTrail の証跡を作成し、 S3 バケットへの保存(および意図しない削除や改ざんへの対策をする)や Amazon

    CloudWatch Logs や Amazon EventBridge との統合を⾏い セキュリティ監視や監査に役⽴てることが望ましいです。 また、前述の通りデータイベントやインサイトイベントの記録もデフォルトでは されていないため、それらの記録が必要な場合も、CloudTrail の証跡の作成が 必要です。 ⾼度な解析が必要であれば Athena と連携しクエリを投げて抽出、がより強⼒
  8. 15 ただ、トラブルシュートには無料枠でも有⽤ AWS CloudTrail の証跡を作成し、 S3 バケットへの保存(および意図しない削除や改ざんへの対策をする)や Amazon CloudWatch Logs

    や Amazon EventBridge との統合を⾏い セキュリティ監視や監査に役⽴てることが望ましいです。 また、前述の通りデータイベントやインサイトイベントの記録もデフォルトでは されていないため、それらの記録が必要な場合も、CloudTrail の証跡の作成が 必要です。 ⾼度な解析が必要であれば Athena と連携しクエリを投げて抽出、がより強⼒ ただ、無料で 90⽇間の管理イベントが記録されているため トラブルシュートの際に有⽤と考えています。 IAM ポリシーの制限が影響していると思われるのに、何が原因か特定できない、 意図しないアクセスキーの使⽤が疑われる、などのケース
  9. 28 ここまで⾒た以上のフィルタリングができない 例えばルックアップ属性にない観点での検索・抽出 errorCode に 〇〇 を含むイベント あるいはアクセス元が xx.xx.xx.xx であるイベント

    あるいは、AND/OR のような論理演算を利⽤した絞り込み ユーザー名が 〇〇 かつ アクセス元が xx.xx.xx.xx であるイベント イベント名が SwitchRole かつ xx が failure であるイベント
  10. 30 基本的な構⽂(個⼈的によく使うオプションとともに) START=$(date +%s -d "2024-07-22 00:00:00") END=$(date +%s -d

    "2024-07-22 01:59:59") ATTR_KEY="EventSource" ATTR_VALUE="ec2.amazonaws.com" aws cloudtrail lookup-events ¥ --start-time "${START}" ¥ --end-time "${END}" ¥ --lookup-attributes AttributeKey="${ATTR_KEY}",AttributeValue="${ATTR_VALUE}" ¥ --max-items integer
  11. 31 基本的な構⽂(個⼈的によく使うオプションとともに) START=$(date +%s -d "2024-07-22 00:00:00") END=$(date +%s -d

    "2024-07-22 01:59:59") ATTR_KEY="EventSource" ATTR_VALUE="ec2.amazonaws.com" aws cloudtrail lookup-events ¥ --start-time "${START}" ¥ --end-time "${END}" ¥ --lookup-attributes AttributeKey="${ATTR_KEY}",AttributeValue="${ATTR_VALUE}" ¥ --max-items integer なお、lookup-events サブコマンドのすべてのオプションが必須ではない項⽬となっています。
  12. 32 出⼒例 { "Events": [ { "EventId": "86f82c29-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "EventName": "DescribeVolumes",

    "ReadOnly": "true", "EventTime": "2024-07-22T01:58:27+09:00", "EventSource": "ec2.amazonaws.com", "Username": "f397768c-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Resources": [], "CloudTrailEvent": "{¥"eventVersion¥":¥"1.09¥",¥"userIdentity¥":{¥"type¥":¥"AssumedRole¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX:f397768c- xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"arn¥":¥"arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSServiceRoleForApplicationMigrationService/f397768c-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"sessionContext¥":{¥"sessionIssuer¥":{¥"type¥":¥"Role¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX¥",¥" arn¥":¥"arn:aws:iam::XXXXXXXXXXXX:role/aws-service- role/mgn.amazonaws.com/AWSServiceRoleForApplicationMigrationService¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"userName¥":¥"AWSServiceRoleForApplicationMig rationService¥"},¥"attributes¥":{¥"creationDate¥":¥"2024-07- 21T16:58:26Z¥",¥"mfaAuthenticated¥":¥"false¥"}},¥"invokedBy¥":¥"mgn.amazonaws.com¥"},¥"eventTime¥":¥"2024-07- 21T16:58:27Z¥",¥"eventSource¥":¥"ec2.amazonaws.com¥",¥"eventName¥":¥"DescribeVolumes¥",¥"awsRegion¥":¥"ap-northeast- 1¥",¥"sourceIPAddress¥":¥"mgn.amazonaws.com¥",¥"userAgent¥":¥"mgn.amazonaws.com¥",¥"requestParameters¥":{¥"volumeSet¥":{},¥"filterSet¥":{¥"items¥":[ {¥"name¥":¥"tag:AWSApplicationMigrationServiceManaged¥",¥"valueSet¥":{¥"items¥":[{¥"value¥":¥"mgn.amazonaws.com¥"}]}},{¥"name¥":¥"tag:Name¥",¥"val ueSet¥":{¥"items¥":[{¥"value¥":¥"AWS Application Migration Service Replication Volume¥"},{¥"value¥":¥"AWS Application Migration Service Conversion Server Volume¥"}]}}]}},¥"responseElements¥":null,¥"requestID¥":¥"5292c075-xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"eventID¥":¥"86f82c29-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"readOnly¥":true,¥"eventType¥":¥"AwsApiCall¥",¥"managementEvent¥":true,¥"recipientAccountId¥":¥"XXXXXXXXXXXX¥",¥"vpcEndpointId¥":¥"v pce-xxxxxxxxxxxxxxxxxxxxx¥",¥"eventCategory¥":¥"Management¥"}” }, { … } ] }
  13. 33 出⼒例 { "Events": [ { "EventId": "86f82c29-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "EventName": "DescribeVolumes",

    "ReadOnly": "true", "EventTime": "2024-07-22T01:58:27+09:00", "EventSource": "ec2.amazonaws.com", "Username": "f397768c-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Resources": [], "CloudTrailEvent": "{¥"eventVersion¥":¥"1.09¥",¥"userIdentity¥":{¥"type¥":¥"AssumedRole¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX:f397768c- xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"arn¥":¥"arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSServiceRoleForApplicationMigrationService/f397768c-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"sessionContext¥":{¥"sessionIssuer¥":{¥"type¥":¥"Role¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX¥",¥" arn¥":¥"arn:aws:iam::XXXXXXXXXXXX:role/aws-service- role/mgn.amazonaws.com/AWSServiceRoleForApplicationMigrationService¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"userName¥":¥"AWSServiceRoleForApplicationMig rationService¥"},¥"attributes¥":{¥"creationDate¥":¥"2024-07- 21T16:58:26Z¥",¥"mfaAuthenticated¥":¥"false¥"}},¥"invokedBy¥":¥"mgn.amazonaws.com¥"},¥"eventTime¥":¥"2024-07- 21T16:58:27Z¥",¥"eventSource¥":¥"ec2.amazonaws.com¥",¥"eventName¥":¥"DescribeVolumes¥",¥"awsRegion¥":¥"ap-northeast- 1¥",¥"sourceIPAddress¥":¥"mgn.amazonaws.com¥",¥"userAgent¥":¥"mgn.amazonaws.com¥",¥"requestParameters¥":{¥"volumeSet¥":{},¥"filterSet¥":{¥"items¥":[ {¥"name¥":¥"tag:AWSApplicationMigrationServiceManaged¥",¥"valueSet¥":{¥"items¥":[{¥"value¥":¥"mgn.amazonaws.com¥"}]}},{¥"name¥":¥"tag:Name¥",¥"val ueSet¥":{¥"items¥":[{¥"value¥":¥"AWS Application Migration Service Replication Volume¥"},{¥"value¥":¥"AWS Application Migration Service Conversion Server Volume¥"}]}}]}},¥"responseElements¥":null,¥"requestID¥":¥"5292c075-xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"eventID¥":¥"86f82c29-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"readOnly¥":true,¥"eventType¥":¥"AwsApiCall¥",¥"managementEvent¥":true,¥"recipientAccountId¥":¥"XXXXXXXXXXXX¥",¥"vpcEndpointId¥":¥"v pce-xxxxxxxxxxxxxxxxxxxxx¥",¥"eventCategory¥":¥"Management¥"}” }, { … } ] } あとは --query オプションで絞り込むなり、 ⼀旦すべて取得してから grep するなり jq を利⽤して CSV 形式にして、みんな⼤好き Excel で確認するなり…
  14. 34 AttributeKey について AttributeKey として指定できる値 指定できる値 AttributeValue として取りうる値 例 AccessKeyId

    IAM ユーザーのアクセスキー ID AKIAIOSFODNN7EXAMPLE EventId 特定の CloudTrail イベント ID b5cc8c40-12ba-4d08-a8d9- 2bceb9a3e002 のような UUID EventName 特定の AWS API イベント名 RunInstances EventSource 検索対象とする AWS サービスの名前空間(サービ スプリンシパル) iam.amazonaws.com ReadOnly API 呼び出しが 読み取り専⽤操作であったか否か true/false ResourceName 対象の AWS リソース名 CloudTrail_CloudWatchLogs_Role ResourceType AWS CloudFormation でサポートされている AWS リソースタイプ AWS::S3::Bucket Username ユーザー名 root, IAM ユーザー名 https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-cli.html
  15. 37 AttributeKey、AttributeValue について AttributeKey の値として指定する⽂字列は⼤⽂字⼩⽂字の区別がある また、AttributeKey と AttributeValue の組み合わせは⼀対のみ指定が可能 AttributeValue

    の制限 最⼤⻑は 2000 ⽂字まで。 次の⽂字 (ʻ _ʼ、ʻ ʼ、ʻ ,ʼ、ʻ ¥¥nʼ) は、2000 ⽂字の制限に対して 2 ⽂字としてカウントされる。
  16. 38 AttributeKey、AttributeValue について AttributeKey の値として指定する⽂字列は⼤⽂字⼩⽂字の区別がある また、AttributeKey と AttributeValue の組み合わせは⼀対のみ指定が可能 AttributeValue

    の制限 最⼤⻑は 2000 ⽂字まで。 次の⽂字 (ʻ _ʼ、ʻ ʼ、ʻ ,ʼ、ʻ ¥¥nʼ) は、2000 ⽂字の制限に対して 2 ⽂字としてカウントされる。 詳細についてはドキュメントで lookup-events ̶ AWS CLI 1.33.28 Command Reference https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/lookup-events.html
  17. 39 AttributeKey、AttributeValue について AttributeKey の値として指定する⽂字列は⼤⽂字⼩⽂字の区別がある また、AttributeKey と AttributeValue の組み合わせは⼀対のみ指定が可能 AttributeValue

    の制限 最⼤⻑は 2000 ⽂字まで。 次の⽂字 (ʻ _ʼ、ʻ ʼ、ʻ ,ʼ、ʻ ¥¥nʼ) は、2000 ⽂字の制限に対して 2 ⽂字としてカウントされる。 各属性の詳細についてはドキュメントで lookup-events ̶ AWS CLI 1.33.28 Command Reference https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/lookup-events.html 結局、複雑なことはできないのでは︖
  18. 40 結局のところ… { "Events": [ { "EventId": "86f82c29-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "EventName": "DescribeVolumes",

    "ReadOnly": "true", "EventTime": "2024-07-22T01:58:27+09:00", "EventSource": "ec2.amazonaws.com", "Username": "f397768c-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Resources": [], "CloudTrailEvent": "{¥"eventVersion¥":¥"1.09¥",¥"userIdentity¥":{¥"type¥":¥"AssumedRole¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX:f397768c- xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"arn¥":¥"arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSServiceRoleForApplicationMigrationService/f397768c-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"sessionContext¥":{¥"sessionIssuer¥":{¥"type¥":¥"Role¥",¥"principalId¥":¥"ARXXXXXXXXXXXXXXXXXXX¥",¥" arn¥":¥"arn:aws:iam::XXXXXXXXXXXX:role/aws-service- role/mgn.amazonaws.com/AWSServiceRoleForApplicationMigrationService¥",¥"accountId¥":¥"XXXXXXXXXXXX¥",¥"userName¥":¥"AWSServiceRoleForApplicationMig rationService¥"},¥"attributes¥":{¥"creationDate¥":¥"2024-07- 21T16:58:26Z¥",¥"mfaAuthenticated¥":¥"false¥"}},¥"invokedBy¥":¥"mgn.amazonaws.com¥"},¥"eventTime¥":¥"2024-07- 21T16:58:27Z¥",¥"eventSource¥":¥"ec2.amazonaws.com¥",¥"eventName¥":¥"DescribeVolumes¥",¥"awsRegion¥":¥"ap-northeast- 1¥",¥"sourceIPAddress¥":¥"mgn.amazonaws.com¥",¥"userAgent¥":¥"mgn.amazonaws.com¥",¥"requestParameters¥":{¥"volumeSet¥":{},¥"filterSet¥":{¥"items¥":[ {¥"name¥":¥"tag:AWSApplicationMigrationServiceManaged¥",¥"valueSet¥":{¥"items¥":[{¥"value¥":¥"mgn.amazonaws.com¥"}]}},{¥"name¥":¥"tag:Name¥",¥"val ueSet¥":{¥"items¥":[{¥"value¥":¥"AWS Application Migration Service Replication Volume¥"},{¥"value¥":¥"AWS Application Migration Service Conversion Server Volume¥"}]}}]}},¥"responseElements¥":null,¥"requestID¥":¥"5292c075-xxxx-xxxx-xxxx-xxxxxxxxxxxx¥",¥"eventID¥":¥"86f82c29-xxxx-xxxx-xxxx- xxxxxxxxxxxx¥",¥"readOnly¥":true,¥"eventType¥":¥"AwsApiCall¥",¥"managementEvent¥":true,¥"recipientAccountId¥":¥"XXXXXXXXXXXX¥",¥"vpcEndpointId¥":¥"v pce-xxxxxxxxxxxxxxxxxxxxx¥",¥"eventCategory¥":¥"Management¥"}” }, { … } ] } あとは --query オプションで絞り込むなり、 ⼀旦すべて取得してから grep するなり jq を利⽤して CSV 形式にして、みんな⼤好き Excel で確認するなり… CLI が万能選⼿っていうわけではなく、 取得後の検索や加⼯が GUI よりは容易︖かなっていう印象
  19. 42 AttributeKey について AttributeKey として指定できる値 指定できる値 AttributeValue として取りうる値 例 AccessKeyId

    IAM ユーザーのアクセスキー ID AKIAIOSFODNN7EXAMPLE EventId 特定の CloudTrail イベント ID b5cc8c40-12ba-4d08-a8d9- 2bceb9a3e002 のような UUID EventName 特定の AWS API イベント名 RunInstances EventSource 検索対象とする AWS サービスの名前空間(サービ スプリンシパル) iam.amazonaws.com ReadOnly API 呼び出しが 読み取り専⽤操作であったか否か true/false ResourceName 対象の AWS リソース名 CloudTrail_CloudWatchLogs_Role ResourceType AWS CloudFormation でサポートされている AWS リソースタイプ AWS::S3::Bucket Username ユーザー名 root, IAM ユーザー名 https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-cli.html
  20. 43 AttributeKey について AttributeKey として指定できる値 指定できる値 AttributeValue として取りうる値 例 AccessKeyId

    IAM ユーザーのアクセスキー ID AKIAIOSFODNN7EXAMPLE EventId 特定の CloudTrail イベント ID b5cc8c40-12ba-4d08-a8d9- 2bceb9a3e002 のような UUID EventName 特定の AWS API イベント名 RunInstances EventSource 検索対象とする AWS サービスの名前空間(サービ スプリンシパル) iam.amazonaws.com ReadOnly API 呼び出しが 読み取り専⽤操作であったか否か true/false ResourceName 対象の AWS リソース名 CloudTrail_CloudWatchLogs_Role ResourceType AWS CloudFormation でサポートされている AWS リソースタイプ AWS::S3::Bucket Username ユーザー名 root, IAM ユーザー名 https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-cli.html これらをどう知るか︖
  21. 53 EventSource … EventSource についても⾮公式ながら以下のような収集をしている⽅も List of AWS Service Principals

    https://gist.github.com/shortjared/4c1e3fe52bdfa47522cfe5b41e5d6f22 リスト化されているけど、 ⾮公式だしな…
  22. 54 EventSource … 先ほどのドキュメントの AWS service topics for CloudTrail セクションから対

    応している AWS サービスを知る 該当サービスのドキュメント内の「Understanding Cloud Directory Log File Entries」セクションの ログの出⼒例から知る︖
  23. 59 マネージメントコンソールの URL について 今回取り上げた CloudTrail や CloudWatch などのコンソール画⾯は、 AWS

    テクニカルサポート担当者では⾒られないとのこと。 (そもそもマネコンに⼊れないらしい) そのため、ケース起票時にコンソールの URL をそのまま送っても、 サポートエンジニアで⾒られず、問い合わせ側の真意が伝わりにくいそうです。 CloudTrail であれば イベント ID を共有する CloudWatch であれば URL とキャプチャ画像をそえる
  24. 60 マネージメントコンソールの URL について 今回取り上げた CloudTrail や CloudWatch などのコンソール画⾯は、 AWS

    テクニカルサポート担当者では⾒られないとのこと。 (そもそもマネコンに⼊れないらしい) そのため、ケース起票時にコンソールの URL をそのまま送っても、 サポートエンジニアで⾒られず、問い合わせ側の真意が伝わりにくいそうです。 CloudTrail であれば イベント ID を共有する CloudWatch であれば URL とキャプチャ画像をそえる 「サポートから回答で CloudWatch メトリクスの URL が返ってくるじゃないか︖」 これは、AWS 内部のツールでエンドユーザー側が⾒た時の URL として組み⽴てられるツールがあるかららしいです。