はじめに
皆様、CloudTrailをうまく活用出来てますか?
CloudTrail解説編の第三弾はIAMに関する操作ログです!
ご要望にお応えできるナレッジ提供を続けられたら良いなと思っています。
以下は、過去の記事になります。
【参考】
・ 【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になります。
requestParameters
とresponseElements
以外のフィールドはどのイベントにも存在します。
{
"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要素
各イベントごとのログ内容
ここからは、シナリオごとに出力された証跡ログの中でも
個々に異なるrequestParameters
とresponseElements
に絞って解説します。
1. IAMユーザを新規作成する
test_user
というIAMユーザを新規作成した時に出力されたログになります。
"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に書き込まれます)
"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を更新する動作になります。
"requestParameters": {
"userName": "test_user"
},
"responseElements": null
3. IAMユーザのアクセスキーを発行する
IAMユーザであるtest_user
でアクセスキーを発行した時に出力されたログになります。
アクセスキーは、アクセスキーID(ここではAKIA6BYSTFHIHTUPIP4U
)と
シークレットアクセスキーで構成されます。
"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を有効化した時に出力されたログになります。
"requestParameters": {
"path": "/",
"virtualMFADeviceName": "test_user"
},
"responseElements": {
"virtualMFADevice": {
"serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
}
}
仮想MFAを生成後、MFAデバイスを有効化するという2種類のログが出力されます。
"requestParameters": {
"userName": "test_user",
"serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
},
"responseElements": null
5. IAMユーザをIAMグループに追加する
IAMユーザであるtest_user
をtest_group
というIAMグループに
追加した時に出力されたログになります。
"requestParameters": {
"groupName": "test_group",
"userName": "test_user"
},
"responseElements": null
6. IAMユーザにインラインポリシーを付与する
IAMユーザであるtest_user
にinline_policy1
というインラインポリシーを
割り当てた時に出力されたログになります。
"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_user
にtest_policy
というIAMポリシーを
割り当てた時に出力されたログになります。
"requestParameters": {
"userName": "test_user",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy"
},
"responseElements": null
8. IAMユーザのアクセスキーを無効化する
IAMユーザであるtest_user
で発行したアクセスキーを無効化した時に
出力されたログになります。
9. IAMユーザでMFAを無効化する
IAMユーザであるtest_user
で仮想MFAを無効化した時に出力されたログになります。
"requestParameters": {
"serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
},
"responseElements": null
MFA有効化時と同様に無効化じも2種類のログが出力されます。
"requestParameters": {
"userName": "test_user",
"serialNumber": "arn:aws:iam::123456789012:mfa/test_user"
},
"responseElements": null
10. IAMユーザをIAMグループから削除する
IAMユーザであるtest_user
をtest_group
のIAMグループから
削除した時に出力されたログになります。
"requestParameters": {
"groupName": "test_group",
"userName": "test_user"
},
"responseElements": null
11. IAMユーザのインラインポリシーを削除する
IAMユーザであるtest_user
からinline_policy1
というインラインポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"userName": "test_user",
"policyName": "inline_policy1"
},
"responseElements": null
12. IAMユーザのIAMポリシーを削除する
IAMユーザであるtest_user
からtest_policy
というIAMポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"userName": "test_user",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy"
},
"responseElements": null
13. IAMユーザを削除する
IAMユーザであるtest_user
を削除すると3種類のログが出力されます。
アクセスキーの削除、LoginProfileの削除、ユーザの削除の3種類です。
"requestParameters": {
"userName": "test_user",
"accessKeyId": "AKIA6BYSTFHIHTUPIP4U"
},
"responseElements": null
"requestParameters": {
"userName": "test_user"
},
"responseElements": null
"requestParameters": {
"userName": "test_user"
},
"responseElements": null
14. IAMグループを新規作成する
test_group
というIAMグループを新規作成した時に出力されたログになります。
"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_group
にinline_policy2
というインラインポリシーを
割り当てた時に出力されたログになります。
"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_group
にtest_policy2
というIAMポリシーを
割り当てた時に出力されたログになります。
"requestParameters": {
"groupName": "test_group",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy2"
},
"responseElements": null
17. IAMグループのインラインポリシーを削除する
IAMグループであるtest_group
からinline_policy2
というインラインポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"groupName": "test_group",
"policyName": "inline_policy2"
},
"responseElements": null
18. IAMグループのIAMポリシーを削除する
IAMグループであるtest_group
からtest_policy2
というIAMポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"groupName": "test_group",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy2"
},
"responseElements": null
19. IAMグループを削除する
test_group
というIAMグループを削除した時に出力されたログになります。
"requestParameters": {
"groupName": "test_group"
},
"responseElements": null
20. IAMロールを新規作成する
test_role
というIAMロールを新規作成した時に出力されたログになります。
"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_role
にinline_policy3
というインラインポリシーを
割り当てた時に出力されたログになります。
"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ポリシーを付与する
"requestParameters": {
"roleName": "test_role",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy3"
},
"responseElements": null
23. IAMロールとIAMユーザの信頼関係を結ぶ
IAMロールであるtest_role
とIAMユーザであるtest_user
で
信頼関係を結んだ時に出力されたログになります。
"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
というインラインポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"roleName": "test_role",
"policyName": "inline_policy3"
},
"responseElements": null
25. IAMロールのIAMポリシーを削除する
IAMロールであるtest_role
からtest_policy3
というIAMポリシーを
削除した時に出力されたログになります。
"requestParameters": {
"roleName": "test_role",
"policyArn": "arn:aws:iam::123456789012:policy/test_policy3"
},
"responseElements": null
26. IAMロールとIAMユーザの信頼関係を削除する
IAMロールであるtest_role
とIAMユーザであるtest_user
で
結んだ信頼関係を解除した時に出力されたログになります。
"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ロールを削除した時に出力されたログになります。
"requestParameters": {
"roleName": "test_role"
},
"responseElements": null
28. IAMポリシーを新規作成する
test_policy
というIAMポリシーを新規作成した時に出力されたログになります。
"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に権限が追加されています。
"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の権限だけに戻っています。
"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ポリシーを削除した時に出力されたログになります。
"userAgent": "console.amazonaws.com",
"requestParameters": {
"policyArn": "arn:aws:iam::123456789012:policy/test_policy"
},
"responseElements": null
まとめ
さて、いかがでしたでしょうか?
不正アクセスによってAWS環境が乗っ取られた際、不正にIAMユーザが作成されたり
権限昇格が行われたりされていないか、見張ることが重要になります。
そのためには、CloudTrailの証跡ログでIAMに関する操作内容を理解しておくと良いでしょう。
自分も誰かがIAMユーザを新規で作成したり、アクセスキーを発行したりするタイミングで
自分のSlackに通知が来るようにしています。
知らないうちにIAMユーザやアクセスキーが不用意に増えていることを防止するには大事な対応ですね!
AWS環境をクリーンに維持する上で皆様のお役に立てる内容になっていることを願うばかりです^^
では、また。