AWS CLI で Amazon GuardDuty のメンバーアカウントを招待する

2023.08.15

下記のブログを執筆した際に、メンバーアカウントの関連付けに関する 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 の数が多いと感じましたが、手順を追って試してみることで理解が深まりました。

このブログがご参考になれば幸いです。