LoginSignup
5
5

More than 1 year has passed since last update.

【CloudTrail解説編】IAM操作ってどんなログ出るの?

Last updated at Posted at 2021-04-20

はじめに

皆様、CloudTrailをうまく活用出来てますか?
CloudTrail解説編の第三弾はIAMに関する操作ログです!

image.png

ご要望にお応えできるナレッジ提供を続けられたら良いなと思っています。
以下は、過去の記事になります。

【参考】
【CloudTrail解説編】AWSマネージメントコンソールのログイン監視
【CloudTrail解説編】VPC操作ってどんなログ出るの?

今回実施したこと

マネージメントコンソールでのIAMに関する操作に特化した内容になっています。
よく利用する下記のサービスを中心に解説したいと思います。

  • IAMユーザ
  • IAMグループ
  • IAMロール
  • IAMポリシー

テストシナリオ

具体的には以下の31個のシナリオで動作テストしてみました。

# サービス名 分類 テストシナリオ eventName (=API名)
01 IAMユーザ 作成 IAMユーザを新規作成する CreateUser, CreateLoginProfile
02 IAMユーザ 変更 IAMユーザのパスワードを変更する UpdateLoginProfile
03 IAMユーザ 変更 IAMユーザのアクセスキーを発行する CreateAccessKey
04 IAMユーザ 変更 IAMユーザでMFAを有効化する CreateVirtualMFADevice, EnableMFADevice
05 IAMユーザ 変更 IAMユーザをIAMグループに追加する AddUserToGroup
06 IAMユーザ 変更 IAMユーザにインラインポリシーを付与する PutUserPolicy
07 IAMユーザ 変更 IAMユーザにIAMポリシーを付与する AttachUserPolicy
08 IAMユーザ 変更 IAMユーザのアクセスキーを無効化する UpdateAccessKey
09 IAMユーザ 変更 IAMユーザでMFAを無効化する DeleteVirtualMFADevice, DeactivateMFADevice
10 IAMユーザ 変更 IAMユーザをIAMグループから削除する RemoveUserFromGroup
11 IAMユーザ 変更 IAMユーザのインラインポリシーを削除する DeleteUserPolicy
12 IAMユーザ 変更 IAMユーザのIAMポリシーを削除する DetachUserPolicy
13 IAMユーザ 削除 IAMユーザを削除する DeleteAccessKey, DeleteLoginProfile, DeleteUser
14 IAMグループ 作成 IAMグループを新規作成する CreateGroup
15 IAMグループ 変更 IAMグループのインラインポリシーを付与する PutGroupPolicy
16 IAMグループ 変更 IAMグループのIAMポリシーを付与する AttachGroupPolicy
17 IAMグループ 変更 IAMグループのインラインポリシーを削除する DeleteGroupPolicy
18 IAMグループ 変更 IAMグループのIAMポリシーを削除する DetachGroupPolicy
19 IAMグループ 削除 IAMグループを削除する DeleteGroup
20 IAMロール 作成 IAMロールを新規作成する CreateRole
21 IAMロール 変更 IAMロールのインラインポリシーを付与する PutRolePolicy
22 IAMロール 変更 IAMロールのIAMポリシーを付与する AttachRolePolicy
23 IAMロール 変更 IAMロールとIAMユーザの信頼関係を結ぶ UpdateAssumeRolePolicy
24 IAMロール 変更 IAMロールのインラインポリシーを削除する DeleteRolePolicy
25 IAMロール 変更 IAMロールのIAMポリシーを削除する DetachRolePolicy
26 IAMロール 変更 IAMロールとIAMユーザの信頼関係を削除する UpdateAssumeRolePolicy
27 IAMロール 削除 IAMロールを削除する DeleteRole
28 IAMポリシー 作成 IAMポリシーを新規作成する CreatePolicy
29 IAMポリシー 変更 IAMポリシーにポリシーを追加する CreatePolicyVersion
30 IAMポリシー 変更 IAMポリシーからポリシーを削除する CreatePolicyVersion
31 IAMポリシー 削除 IAMポリシーを削除する DeletePolicy

セキュリティ観点で理解しておいた方が良い内容

以下の内容については、CloudTrailでIAM操作を見張ることをお勧めします。

  • IAMユーザを新規作成する (No.01)
  • IAMユーザのパスワードを変更する (No.02)
  • IAMユーザのアクセスキーを発行する (No.03)
  • IAMユーザにインラインポリシーを付与する (No.06)
  • IAMロールを新規作成する (No.20)
  • IAMロールとIAMユーザの信頼関係を結ぶ (No.23)

共通するフィールド

以下、CloudTrail証跡ログのサンプルになります。形式はJSONになります。
requestParametersresponseElements以外のフィールドはどのイベントにも存在します。

共通するフィールド
{
    "eventVersion": "<ログイベント形式のバージョン>",
    "userIdentity": {
        "type": "<イベントの種類>",
        "principalId": "<呼び出しを行ったエンティティの一意の識別子>",
        "arn": "<操作したIAMユーザのARN>",
        "accountId": "<AWSアカウント(12桁)>",
        "accessKeyId": "<AWSアクセスキー>",
        "userName": "<操作したIAMユーザ名>",
        "sessionContext": {
            "sessionIssuer": {"<認証情報がどのように取得されたかに関する情報>"},
            "webIdFederationData": {"<IDプロバイダーに関する情報>"},
            "attributes": {
                "mfaAuthenticated": "<MFAデバイスによる認証有無(true/false)>",
                "creationDate": "<一時的セキュリティ認証情報が発行された時刻(ISO8601形式)>"
            }
        }
    },
    "eventTime": "<イベント発生時刻(ISO8601形式)>",
    "eventSource": "<リクエストが行われたAWSサービス>",
    "eventName": "<イベント名(=API名)>",
    "awsRegion": "<ログインしたAWSリージョン>",
    "sourceIPAddress": "<送信元IPアドレス>",
    "userAgent": "<接続元のユーザーエージェント(マネージメントコンソール操作だとconsole.amazonaws.comになる)",
    "requestParameters": {
        "<リクエストとともに送信されたパラメータ(後述しますが、APIに応じて内容が異なる)>"
    },
    "responseElements": {
        "<変更を行うアクションのレスポンスの要素(後述しますが、APIに応じて内容が異なる)>"
    },
    "requestID": "<リクエストを識別するID>",
    "eventID": "<CloudTrail証跡ログの中で一意となるイベントID>",
    "readOnly": <読み取り専用の操作であるかどうか(falseになる)>,
    "eventType": "<イベントレコードを生成したイベントのタイプ(AwsApiCallになる)>",
    "managementEvent": <管理用イベントかどうか(trueになる)>,
    "eventCategory": "<イベントのカテゴリ(Managementになる)>",
    "recipientAccountId": "<イベントを受信したAWSアカウント(12桁)>"
}

【参考】
CloudTrail レコードの内容
CloudTrail userIdentity要素

各イベントごとのログ内容

ここからは、シナリオごとに出力された証跡ログの中でも
個々に異なるrequestParametersresponseElementsに絞って解説します。

1. IAMユーザを新規作成する

test_userというIAMユーザを新規作成した時に出力されたログになります。

CreateUser
    "requestParameters": {
        "userName": "test_user",
        "tags": []
    },
    "responseElements": {
        "user": {
            "path": "/",
            "userName": "test_user",
            "userId": "AIDA6BYSTFHIOKMWQZPQK",
            "arn": "arn:aws:iam::123456789012:user/test_user",
            "createDate": "Apr 19, 2021 3:49:02 PM"
        }
    }

このIAMユーザはマネージメントコンソールのログインを許可したため
同時にパスワードが生成されています。(パスワードは、LoginProfileに書き込まれます)

CreateLoginProfile
    "requestParameters": {
        "userName": "test_user",
        "passwordResetRequired": false
    },
    "responseElements": {
        "loginProfile": {
            "userName": "test_user",
            "createDate": "Apr 19, 2021 3:49:03 PM",
            "passwordResetRequired": false
        }
    }

2. IAMユーザのパスワードを変更する

IAMユーザであるtest_userのパスワードを変更した時に出力されたログになります。
パスワード作成時に生成されたLoginProfileを更新する動作になります。

UpdateLoginProfile
    "requestParameters": {
        "userName": "test_user"
    },
    "responseElements": null

3. IAMユーザのアクセスキーを発行する

IAMユーザであるtest_userでアクセスキーを発行した時に出力されたログになります。
アクセスキーは、アクセスキーID(ここではAKIA6BYSTFHIHTUPIP4U)と
シークレットアクセスキーで構成されます。

CreateAccessKey
    "requestParameters": {
        "userName": "test_user"
    },
    "responseElements": {
        "accessKey": {
            "userName": "test_user",
            "accessKeyId": "AKIA6BYSTFHIHTUPIP4U",
            "status": "Active",
            "createDate": "Apr 19, 2021 3:53:13 PM"
        }
    }

4. IAMユーザでMFAを有効化する

IAMユーザであるtest_userで仮想MFAを有効化した時に出力されたログになります。

CreateVirtualMFADevice
    "requestParameters": {
        "path": "/",
        "virtualMFADeviceName": "test_user"
    },
    "responseElements": {
        "virtualMFADevice": {
            "serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
        }
    }

仮想MFAを生成後、MFAデバイスを有効化するという2種類のログが出力されます。

EnableMFADevice
    "requestParameters": {
        "userName": "test_user",
        "serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
    },
    "responseElements": null

5. IAMユーザをIAMグループに追加する

IAMユーザであるtest_usertest_groupというIAMグループに
追加した時に出力されたログになります。

AddUserToGroup
    "requestParameters": {
        "groupName": "test_group",
        "userName": "test_user"
    },
    "responseElements": null

6. IAMユーザにインラインポリシーを付与する

IAMユーザであるtest_userinline_policy1というインラインポリシーを
割り当てた時に出力されたログになります。

PutUserPolicy
    "requestParameters": {
        "userName": "test_user",
        "policyName": "inline_policy1",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"VisualEditor0\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": [\n
                                    \"access-analyzer:ListAnalyzers\",\n 
                                    \"access-analyzer:ListAccessPreviews\",\n
                                    \"access-analyzer:ListArchiveRules\"\n
                                 ],\n
                              \"Resource\": \"*\"\n
                             }\n
                           ]\n
        }"
    },
    "responseElements": null

inline_policy1には、IAM Access Analyzerの権限を付与しています。

7. IAMユーザにIAMポリシーを付与する

IAMユーザであるtest_usertest_policyというIAMポリシーを
割り当てた時に出力されたログになります。

AttachUserPolicy
    "requestParameters": {
        "userName": "test_user",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy"
    },
    "responseElements": null

8. IAMユーザのアクセスキーを無効化する

IAMユーザであるtest_userで発行したアクセスキーを無効化した時に
出力されたログになります。

UpdateAccessKey

9. IAMユーザでMFAを無効化する

IAMユーザであるtest_userで仮想MFAを無効化した時に出力されたログになります。

DeleteVirtualMFADevice
    "requestParameters": {
        "serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
    },
    "responseElements": null

MFA有効化時と同様に無効化じも2種類のログが出力されます。

DeactivateMFADevice
    "requestParameters": {
        "userName": "test_user",
        "serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
    },
    "responseElements": null

10. IAMユーザをIAMグループから削除する

IAMユーザであるtest_usertest_groupのIAMグループから
削除した時に出力されたログになります。

RemoveUserFromGroup
    "requestParameters": {
        "groupName": "test_group",
        "userName": "test_user"
    },
    "responseElements": null

11. IAMユーザのインラインポリシーを削除する

IAMユーザであるtest_userからinline_policy1というインラインポリシーを
削除した時に出力されたログになります。

DeleteUserPolicy
    "requestParameters": {
        "userName": "test_user",
        "policyName": "inline_policy1"
    },
    "responseElements": null

12. IAMユーザのIAMポリシーを削除する

IAMユーザであるtest_userからtest_policyというIAMポリシーを
削除した時に出力されたログになります。

DetachUserPolicy
    "requestParameters": {
        "userName": "test_user",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy"
    },
    "responseElements": null

13. IAMユーザを削除する

IAMユーザであるtest_userを削除すると3種類のログが出力されます。
アクセスキーの削除、LoginProfileの削除、ユーザの削除の3種類です。

DeleteAccessKey
    "requestParameters": {
        "userName": "test_user",
        "accessKeyId": "AKIA6BYSTFHIHTUPIP4U"
    },
    "responseElements": null
DeleteLoginProfile
    "requestParameters": {
        "userName": "test_user"
    },
    "responseElements": null
DeleteUser
    "requestParameters": {
        "userName": "test_user"
    },
    "responseElements": null

14. IAMグループを新規作成する

test_groupというIAMグループを新規作成した時に出力されたログになります。

CreateGroup
    "requestParameters": {
        "groupName": "test_group"
    },
    "responseElements": {
        "group": {
            "path": "/",
            "groupName": "test_group",
            "groupId": "AGPA6BYSTFHIGYL72W2SC",
            "arn": "arn:aws:iam::123456789012:group/test_group",
            "createDate": "Apr 19, 2021 3:55:39 PM"
        }
    }

15. IAMグループのインラインポリシーを付与する

IAMグループであるtest_groupinline_policy2というインラインポリシーを
割り当てた時に出力されたログになります。

PutGroupPolicy
    "requestParameters": {
        "groupName": "test_group",
        "policyName": "inline_policy2",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"Stmt1618848610000\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": [\n
                                    \"aws-portal:*\"\n
                                 ],\n
                                \"Resource\": [\n
                                  \"*\"\n
                                 ]\n
                               }\n
                             ]\n
                           }"
    },
    "responseElements": null

inline_policy2には、AWS Portalの権限を付与しています。

16. IAMグループのIAMポリシーを付与する

IAMグループであるtest_grouptest_policy2というIAMポリシーを
割り当てた時に出力されたログになります。

AttachGroupPolicy
    "requestParameters": {
        "groupName": "test_group",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy2"
    },
    "responseElements": null

17. IAMグループのインラインポリシーを削除する

IAMグループであるtest_groupからinline_policy2というインラインポリシーを
削除した時に出力されたログになります。

DeleteGroupPolicy
    "requestParameters": {
        "groupName": "test_group",
        "policyName": "inline_policy2"
    },
    "responseElements": null

18. IAMグループのIAMポリシーを削除する

IAMグループであるtest_groupからtest_policy2というIAMポリシーを
削除した時に出力されたログになります。

DetachGroupPolicy
    "requestParameters": {
        "groupName": "test_group",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy2"
    },
    "responseElements": null

19. IAMグループを削除する

test_groupというIAMグループを削除した時に出力されたログになります。

DeleteGroup
    "requestParameters": {
        "groupName": "test_group"
    },
    "responseElements": null

20. IAMロールを新規作成する

test_roleというIAMロールを新規作成した時に出力されたログになります。

CreateRole
    "requestParameters": {
        "roleName": "test_role",
        "assumeRolePolicyDocument": "{
                                      \"Version\":\"2012-10-17\",
                                      \"Statement\":[
                                         {
                                          \"Effect\":\"Allow\",
                                          \"Action\":[
                                            \"sts:AssumeRole\"
                                           ],
                                          \"Principal\":{
                                            \"Service\":[
                                              \"ec2.amazonaws.com\"
                                             ]
                                           }
                                         }
                                       ]
                                     }",
        "description": "Allows EC2 instances to call AWS services on your behalf.",
        "tags": []
    },
    "responseElements": {
        "role": {
            "path": "/",
            "roleName": "test_role",
            "roleId": "AROA6BYSTFHIJ2S6TFRFT",
            "arn": "arn:aws:iam::123456789012:role/test_role",
            "createDate": "Apr 19, 2021 4:17:06 PM",
            "assumeRolePolicyDocument": "%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22sts%3AAssumeRole%22%5D%2C%22Principal%22%3A%7B%22Service%22%3A%5B%22ec2.amazonaws.com%22%5D%7D%7D%5D%7D"
        }
    }

※ 適当にEC2用のIAMロールとして作成しています。

21. IAMロールのインラインポリシーを付与する

IAMロールであるtest_roleinline_policy3というインラインポリシーを
割り当てた時に出力されたログになります。

PutRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyName": "inline_policy3",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"VisualEditor0\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": \"glue:GetMLTaskRuns\",\n
                                \"Resource\": \"*\"\n
                               }\n
                             ]\n
                           }"
    },
    "responseElements": null

inline_policy2には、適当にglue:GetMLTaskRunsの権限を付与しています。

22. IAMロールのIAMポリシーを付与する

AttachRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy3"
    },
    "responseElements": null

23. IAMロールとIAMユーザの信頼関係を結ぶ

IAMロールであるtest_roleとIAMユーザであるtest_user
信頼関係を結んだ時に出力されたログになります。

UpdateAssumeRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Effect\": \"Allow\",\n
                                \"Principal\": {\n
                                  \"AWS\": \"arn:aws:iam::123456789012:user/test_user\"\n
                                 },\n
                                \"Action\": \"sts:AssumeRole\"\n
                               }\n
                             ]\n
                           }"
    },
    "responseElements": null

24. IAMロールのインラインポリシーを削除する

IAMロールであるtest_roleからinline_policy3というインラインポリシーを
削除した時に出力されたログになります。

DeleteRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyName": "inline_policy3"
    },
    "responseElements": null

25. IAMロールのIAMポリシーを削除する

IAMロールであるtest_roleからtest_policy3というIAMポリシーを
削除した時に出力されたログになります。

DetachRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy3"
    },
    "responseElements": null

26. IAMロールとIAMユーザの信頼関係を削除する

IAMロールであるtest_roleとIAMユーザであるtest_user
結んだ信頼関係を解除した時に出力されたログになります。

UpdateAssumeRolePolicy
    "requestParameters": {
        "roleName": "test_role",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Effect\": \"Allow\",\n
                                \"Principal\": {\n
                                  \"Service\": \"ec2.amazonaws.com\"\n
                                 },\n
                                \"Action\": \"sts:AssumeRole\"\n
                               }\n
                             ]\n
                           }"
    },
    "responseElements": null

27. IAMロールを削除する

test_roleというIAMロールを削除した時に出力されたログになります。

DeleteRole
    "requestParameters": {
        "roleName": "test_role"
    },
    "responseElements": null

28. IAMポリシーを新規作成する

test_policyというIAMポリシーを新規作成した時に出力されたログになります。

CreatePolicy
    "requestParameters": {
        "policyName": "test_policy",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"VisualEditor0\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": \"aws-portal:*\",\n
                                \"Resource\": \"*\"\n
                               }\n
                             ]\n
                           }",
        "tags": []
    },
    "responseElements": {
        "policy": {
            "policyName": "test_policy",
            "policyId": "ANPA6BYSTFHIFEULOJK27",
            "arn": "arn:aws:iam::123456789012:policy/test_policy",
            "path": "/",
            "defaultVersionId": "v1",
            "attachmentCount": 0,
            "permissionsBoundaryUsageCount": 0,
            "isAttachable": true,
            "createDate": "Apr 19, 2021 3:59:03 PM",
            "updateDate": "Apr 19, 2021 3:59:03 PM",
            "tags": []
        }
    }

test_policyには、AWS Portalの権限を付与しています。

29. IAMポリシーにポリシーを追加する

test_policyというIAMポリシーに追加でポリシーを追加した時に出力されたログになります。
MQサービスに関する権限を追加しています。これまで付与されていた権限と合わせて
Actionに権限が追加されています。

CreatePolicyVersion
    "requestParameters": {
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"VisualEditor0\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": [\n
                                    \"mq:ListConfigurationRevisions\",\n
                                    \"mq:ListBrokers\",\n
                                    \"mq:ListTags\",\n
                                    \"aws-portal:*\",\n
                                    \"mq:ListConfigurations\",\n
                                    \"mq:ListUsers\"\n
                                 ],\n
                                \"Resource\": \"*\"\n
                               }\n
                             ]\n
                           }",
        "setAsDefault": true
    },
    "responseElements": {
        "policyVersion": {
            "versionId": "v2",
            "isDefaultVersion": true,
            "createDate": "Apr 19, 2021 4:15:01 PM"
        }
    }

30. IAMポリシーからポリシーを削除する

test_policyというIAMポリシーから追加したポリシーを
削除した時に出力されたログになります。
再度、AWS Portalの権限だけに戻っています。

CreatePolicyVersion
    "requestParameters": {
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy",
        "policyDocument": "{\n
                            \"Version\": \"2012-10-17\",\n
                            \"Statement\": [\n
                               {\n
                                \"Sid\": \"VisualEditor0\",\n
                                \"Effect\": \"Allow\",\n
                                \"Action\": \"aws-portal:*\",\n
                                \"Resource\": \"*\"\n
                               }\n
                             ]\n
                           }",
        "setAsDefault": true
    },
    "responseElements": {
        "policyVersion": {
            "versionId": "v3",
            "isDefaultVersion": true,
            "createDate": "Apr 19, 2021 4:36:19 PM"
        }
    }

31. IAMポリシーを削除する

test_policyというIAMポリシーを削除した時に出力されたログになります。

DeletePolicy
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "policyArn": "arn:aws:iam::123456789012:policy/test_policy"
    },
    "responseElements": null

まとめ

さて、いかがでしたでしょうか?

不正アクセスによってAWS環境が乗っ取られた際、不正にIAMユーザが作成されたり
権限昇格が行われたりされていないか、見張ることが重要になります。

そのためには、CloudTrailの証跡ログでIAMに関する操作内容を理解しておくと良いでしょう。

自分も誰かがIAMユーザを新規で作成したり、アクセスキーを発行したりするタイミングで
自分のSlackに通知が来るようにしています。

知らないうちにIAMユーザやアクセスキーが不用意に増えていることを防止するには大事な対応ですね!
AWS環境をクリーンに維持する上で皆様のお役に立てる内容になっていることを願うばかりです^^

では、また。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5