AWS CLI で Amazon GuardDuty のメンバーアカウントを招待する
下記のブログを執筆した際に、メンバーアカウントの関連付けに関する API の種類が多かったため、AWS CLI でメンバーアカウントを招待する一連の流れを確認することで API の理解に務めました。その際に試したことを自身の備忘録も兼ねてブログにしたいと思います。
AWS CLI でメンバーアカウントの関連付け
AWS CLI によるメンバーアカウントの招待は次のユーザーガイドに記載があります。
招待による GuardDuty アカウントの管理 - Amazon GuardDuty
以降では下記のアカウント ID に置換して記載しています。
- 管理者アカウント ID
111122223333
- メンバーアカウント ID
444455556666
管理者アカウントからメンバーアカウントを招待
管理者アカウントにおいてcreate-members
コマンドでメンバーアカウントを登録します。
$ aws guardduty create-members \ > --detector-id exampledabff5bb568a3aaa1b82ec068 \ > --account-details AccountId="444455556666",Email="hostname@example.net" { "UnprocessedAccounts": [] }
create-members
コマンド実行後にメンバーアカウントとして登録されます。この時点ではまだ招待はしていません。
次に、invite-members
コマンドで登録したメンバーアカウントを招待します。
$ aws guardduty invite-members --detector-id exampledabff5bb568a3aaa1b82ec068 --account-ids 444455556666 { "UnprocessedAccounts": [] }
この状態で管理者アカウントにおいてlist-members
コマンドを実行してもメンバーアカウントは表示されない状態です。
$ aws guardduty list-members --detector-id exampledabff5bb568a3aaa1b82ec068 { "Members": [] }
メンバーアカウントで招待を承認・拒否・削除
メンバーアカウントにおいてlist-invitations
コマンドで招待を確認できます。
$ aws guardduty list-invitations { "Invitations": [ { "AccountId": "111122223333", "InvitationId": "02c4fa5bce52ad75711a8922da94f768", "RelationshipStatus": "Invited", "InvitedAt": "2023-08-14T15:43:41.221Z" } ] }
get-invitations-count
コマンドで招待の数を取得することもできます。
$ aws guardduty get-invitations-count { "InvitationsCount": 1 }
マネジメントコンソールで招待を確認すると下記状態です。
メンバーアカウントでは招待について次の 3 つの対応ができます。
- 招待を承認
accept-administrator-invitation
- 招待を拒否
decline-invitations
- 招待を削除
delete-invitations
招待を承認
メンバーアカウントで招待を承認する場合はaccept-administrator-invitation
コマンドで実行します。
$ aws guardduty accept-administrator-invitation --detector-id exampleba4cb4bcfb9f6bf74f3560103 --administrator-id 111122223333 --invitation-id 02c4fa5bce52ad75711a8922da94f768
承認した後の招待のステータス確認です。招待はなくなっています。
$ aws guardduty list-invitations{ "Invitations": [] }
$ aws guardduty get-invitations-count { "InvitationsCount": 0 }
招待を承認した場合の管理者アカウントとメンバーアカウントのマネジメントコンソールの画面です。上段が管理者アカウントの画面、下段がメンバーアカウントの画面です。メンバーアカウントにおいて招待が ACCEPT されています。
管理者アカウントの情報をget-administrator-account
コマンドで取得することもできます。
$ aws guardduty get-administrator-account --detector-id exampleba4cb4bcfb9f6bf74f3560103 { "Administrator": { "AccountId": "111122223333", "InvitationId": "02c4fa5bce52ad75711a8922da94f768", "RelationshipStatus": "Enabled", "InvitedAt": "2023-08-14T15:43:41.221Z" } }
招待を拒否
メンバーアカウントで招待を拒否する場合はdecline-invitations
コマンドで実行します。
$ aws guardduty decline-invitations --account-ids 111122223333 { "UnprocessedAccounts": [] }
招待を拒否した後の招待のステータス確認です。Resigned ステータスになっていることが分かります。
$ aws guardduty list-invitations { "Invitations": [ { "AccountId": "111122223333", "InvitationId": "2ec4fa564a2b2807ee20ca6641c584fd", "RelationshipStatus": "Resigned", "InvitedAt": "2023-08-14T15:31:38.198Z" } ] }
$ aws guardduty get-invitations-count { "InvitationsCount": 1 }
招待を拒否した場合の管理者アカウントとメンバーアカウントのマネジメントコンソールの画面です。上段が管理者アカウントの画面、下段がメンバーアカウントの画面です。
招待を削除
メンバーアカウントで招待を削除する場合はdelete-invitations
コマンドを実行します。
$ aws guardduty delete-invitations --account-ids 111122223333 { "UnprocessedAccounts": [] }
招待はなくなります。
$ aws guardduty list-invitations{ "Invitations": [] }
$ aws guardduty get-invitations-count { "InvitationsCount": 0 }
招待を削除した場合は、管理者アカウントとメンバーアカウントでアカウント情報がなくなります。上段が管理者アカウントの画面、下段がメンバーアカウントの画面です。
再度、招待する場合は管理者アカウントにおいてcreate-members
コマンドからやり直す必要があります。
管理者アカウントで承認されたメンバーアカウントを確認
以降では、メンバーアカウントが承認した前提で進めます。
承認後のメンバーアカウントをlist-members
コマンドで確認してみます。Enabled ステータスになっていることが分かります。
$ aws guardduty list-members --detector-id exampledabff5bb568a3aaa1b82ec068 { "Members": [ { "AccountId": "444455556666", "DetectorId": "exampleba4cb4bcfb9f6bf74f3560103", "MasterId": "111122223333", "Email": "host@example.net", "RelationshipStatus": "Enabled", "InvitedAt": "2023-08-14T15:43:41.221Z", "UpdatedAt": "2023-08-14T15:45:38.379Z", "AdministratorId": "111122223333" } ] }
特定の複数のメンバーアカウントの情報をget-members
コマンドで取得できます。
$ aws guardduty get-members --detector-id exampledabff5bb568a3aaa1b82ec068 --account-ids 444455556666 { "Members": [ { "AccountId": "444455556666", "DetectorId": "exampleba4cb4bcfb9f6bf74f3560103", "MasterId": "111122223333", "Email": "host@example.net", "RelationshipStatus": "Enabled", "InvitedAt": "2023-08-14T15:43:41.221Z", "UpdatedAt": "2023-08-14T15:45:38.379Z", "AdministratorId": "111122223333" } ], "UnprocessedAccounts": [] }
また、特定の複数のメンバーアカウントの設定の詳細をget-member-detectors
コマンドで取得することもできます。オプション保護の設定情報などが確認できます。
$ aws guardduty get-member-detectors --detector-id exampledabff5bb568a3aaa1b82ec068 --account-ids 444455556666 { "MemberDataSourceConfigurations": [ { "AccountId": "444455556666", "DataSources": { "CloudTrail": { "Status": "ENABLED" }, "DNSLogs": { "Status": "ENABLED" }, "FlowLogs": { "Status": "ENABLED" }, "S3Logs": { "Status": "ENABLED" }, "Kubernetes": { "AuditLogs": { "Status": "ENABLED" } }, "MalwareProtection": { "ScanEc2InstanceWithFindings": { "EbsVolumes": { "Status": "ENABLED" } } } }, "Features": [ { "Name": "CLOUD_TRAIL", "Status": "ENABLED", "UpdatedAt": "2023-08-14T16:01:11+00:00" }, { "Name": "DNS_LOGS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T16:01:11+00:00" }, { "Name": "FLOW_LOGS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T16:01:11+00:00" }, { "Name": "S3_DATA_EVENTS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" }, { "Name": "EKS_AUDIT_LOGS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" }, { "Name": "EBS_MALWARE_PROTECTION", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" }, { "Name": "RDS_LOGIN_EVENTS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" }, { "Name": "EKS_RUNTIME_MONITORING", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00", "AdditionalConfiguration": [ { "Name": "EKS_ADDON_MANAGEMENT", "Status": "DISABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" } ] }, { "Name": "LAMBDA_NETWORK_LOGS", "Status": "ENABLED", "UpdatedAt": "2023-08-14T15:08:23+00:00" } ] } ], "UnprocessedAccounts": [] }
メンバーアカウントから管理者アカウントとの関連付けを解除
メンバーアカウントにおいてdisassociate-from-administrator-account
コマンドにより管理者アカウントとの関連付けを解除できます。
$ aws guardduty disassociate-from-administrator-account --detector-id exampleba4cb4bcfb9f6bf74f3560103
関連付け解除後の招待のステータスです。Resigned ステータスになっています。
$ aws guardduty list-invitations { "Invitations": [ { "AccountId": "111122223333", "InvitationId": "02c4fa5bce52ad75711a8922da94f768", "RelationshipStatus": "Resigned", "InvitedAt": "2023-08-14T15:43:41.221Z" } ] }
$ aws guardduty get-invitations-count { "InvitationsCount": 1 }
メンバーアカウントから関連付けを解除した場合の管理者アカウントとメンバーアカウントのマネジメントコンソールの画面です。上段が管理者アカウントの画面、下段がメンバーアカウントの画面です。
管理者アカウントからメンバーアカウントとの関連付けを解除
次は、管理者アカウントからメンバーアカウントとの関連付けを解除してみます。
管理者アカウントにおいてdisassociate-members
コマンドで関連付けを解除できます。
$ aws guardduty disassociate-members --detector-id exampledabff5bb568a3aaa1b82ec068 --account-ids 444455556666 { "UnprocessedAccounts": [] }
関連付けを解除した後のメンバーアカウントにおける招待のステータスです。メンバーアカウント側では招待がなくなっています。
$ aws guardduty list-invitations { "Invitations": [] }
$ aws guardduty get-invitations-count { "InvitationsCount": 0 }
管理者アカウントからメンバーアカウントとの関連付けを解除した場合のマネジメントコンソールの画面です。上段が管理者アカウントの画面、下段がメンバーアカウントの画面です。
管理者アカウントでメンバーアカウントを削除
関連付けの解除では、管理者アカウント上でメンバーアカウントの情報は残ります。ステータスは削除済み (関連付け削除)
となります。
delete-members
コマンドでメンバーアカウントを削除できます。
$ aws guardduty delete-members --detector-id exampledabff5bb568a3aaa1b82ec068 --account-ids 444455556666 { "UnprocessedAccounts": [] }
メンバーアカウント削除後は、メンバーアカウント一覧には表示されなくなります。
$ aws guardduty list-members --detector-id exampledabff5bb568a3aaa1b82ec068 { "Members": [] }
以上で、AWS CLI によるメンバーアカウントとの関連付けの確認は終わります。
さいごに
Amazon GuardDuty のメンバーアカウトの関連付けに関する API を理解するため、AWS CLI でメンバーアカウトの関連付けの一連の流れと試してみました。一見すると API の数が多いと感じましたが、手順を追って試してみることで理解が深まりました。
このブログがご参考になれば幸いです。