[アップデート] Amazon Verified Permissions で複数のポリシー内容を一括で取得出来るようになりました

[アップデート] Amazon Verified Permissions で複数のポリシー内容を一括で取得出来るようになりました

Clock Icon2024.11.12

いわさです。

先日、Amazon Verified Permissions の API にアップデートがあり複数のポリシーステートメントを一括取得するための API が追加されました。

https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-verified-permissions-api-multiple-policies/

Verified Permissions ではポリシーストアとコンテキストさえ入力すれば、複数のポリシーからそれだけで認可判定を行うことが出来ました。
ただし、認可判定以外でポリシーステートメントを取得したい場合は、ポリシー ID ごとに API を呼び出す必要があり、複数のポリシーを管理したい場合などは毎回複数の API 呼び出しをしなければなりませんでした。

例えば以下のようなポリシーストアの場合、すべてのポリシー内容を取得するためには 1 回 ListPolicies API を呼び出し、さらに 4 回の GetPolicy API を呼び出す必要があります。

50D3C26B-DC36-4E14-A48C-7ADA07F7B4D3.png

今回のアップデートでは BatchGetPolicy という一括取得用の API が追加され、必要なポリシー ID をまとめて指定して一度の API 呼び出しで詳細を取得出来るようになっています。
上記の例であれば、ListPolicies API を呼び出した後に、BatchGetPolicy API を一度呼び出すだけで全ポリシー内容が取得出来ます。

ユースケースとしてはアプリケーション上に権限管理機能を組み込む必要がある場合など、ポリシーステートメント情報を参照・編集したい場合で役立ちそうです。

ListPolicies と GetPolicy

これまでは GetPolicy か ListPolicies を駆使してポリシー内容を取得する必要がありました。

https://docs.aws.amazon.com/cli/latest/reference/verifiedpermissions/list-policies.html

https://docs.aws.amazon.com/cli/latest/reference/verifiedpermissions/get-policy.html

まず、ListPolicies API を使うと指定したポリシーストアのポリシー一覧を取得することが出来ます。

% aws-v1 verifiedpermissions list-policies --policy-store-id PiHdv8r7eojZ6v23LKvBMT
{
    "policies": [
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "L54TdwLAExACB5jx44soJz",
            "policyType": "STATIC",
            "principal": {
                "entityType": "DigitalPetStore::Role",
                "entityId": "Store-Owner"
            },
            "resource": {
                "entityType": "DigitalPetStore::Application",
                "entityId": "PetStore"
            },
            "actions": [
                {
                    "actionType": "DigitalPetStore::Action",
                    "actionId": "GetStoreInventory"
                },
                {
                    "actionType": "DigitalPetStore::Action",
                    "actionId": "ListOrders"
                }
            ],
            "definition": {
                "static": {
                    "description": "Store Owner Role - Get Inventory and List Orders"
                }
            },
            "createdDate": "2024-11-11T21:05:11.116347Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.116347Z",
            "effect": "Permit"
        },

:

        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "UHUNf4VZd6K46KLv8S95cf",
            "policyType": "STATIC",
            "principal": {
                "entityType": "DigitalPetStore::Role",
                "entityId": "Customer"
            },
            "actions": [
                {
                    "actionType": "DigitalPetStore::Action",
                    "actionId": "GetOrder"
                }
            ],
            "definition": {
                "static": {
                    "description": "Customer Role - Get Order"
                }
            },
            "createdDate": "2024-11-11T21:05:11.553681Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.553681Z",
            "effect": "Permit"
        }
    ]
}

一見上記のみで完結しそうにも見えるのですが、よく見てみるとdefinition.staticにはdescriptionのみでstatementが含まれていません。
Verified Permissions では Cedar を使ってポリシーを記述するのですがその内容が上記 API では取得出来ません。

そこで GetPolicy API を使います。
上記で取得したポリシー ID を使って呼び出しを行います。

% aws-v1 verifiedpermissions get-policy --policy-store-id PiHdv8r7eojZ6v23LKvBMT --policy-id LpcTE6Gfi5htLSubDdwPuP
{
    "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
    "policyId": "LpcTE6Gfi5htLSubDdwPuP",
    "policyType": "STATIC",
    "principal": {
        "entityType": "DigitalPetStore::Role",
        "entityId": "Customer"
    },
    "resource": {
        "entityType": "DigitalPetStore::Application",
        "entityId": "PetStore"
    },
    "actions": [
        {
            "actionType": "DigitalPetStore::Action",
            "actionId": "SearchPets"
        }
    ],
    "definition": {
        "static": {
            "description": "Customer Role - Search Pets",
            "statement": "permit (\n    principal in DigitalPetStore::Role::\"Customer\",\n    action == DigitalPetStore::Action::\"SearchPets\",\n    resource == DigitalPetStore::Application::\"PetStore\"\n);"
        }
    },
    "createdDate": "2024-11-11T21:05:11.434372Z",
    "lastUpdatedDate": "2024-11-11T21:05:11.434372Z",
    "effect": "Permit"
}

definition.static.statementが取得出来ましたね。これがポリシーのメイン部分になります。
アプリケーション側でユーザーに Cedar を触らせることはほぼ無いと思いますが、権限管理 UI を独自で作成する場合などにポリシー内容まで参照が必要な場合があります。

上記で実現自体は出来るのですがポリシーごとに API 呼び出しが必要で、ポリシーの数が多くなると一覧表示ごとにたくさんの API 呼び出しが必要になります。

[New] BatchGetPolicy

そこで、今回新たに登場した BatchGetPolicy API を使うことが出来ます。

https://docs.aws.amazon.com/cli/latest/reference/verifiedpermissions/batch-get-policy.html

必要なポリシー ID を複数指定してポリシー内容を取得することが出来るようになりました。
ただし、一度に最大 100 件までとういう上限がありますので、それを超える場合は 2 回以上の呼び出しに分けましょう。

使い方ですが、requetsパラメータに複数のポリシーストア ID とポリシー ID を指定します。
実行してみましょう。

% cat hoge.json
{
    "requests": [
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "LpcTE6Gfi5htLSubDdwPuP"
        },
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "R9deVVMMT5LaZV2uM82JRF"
        },
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "UHUNf4VZd6K46KLv8S95cf"
        }
    ]
}
% aws-v1 verifiedpermissions batch-get-policy --cli-input-json file://hoge.json
{
    "results": [
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "LpcTE6Gfi5htLSubDdwPuP",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Customer Role - Search Pets",
                    "statement": "permit (\n    principal in DigitalPetStore::Role::\"Customer\",\n    action == DigitalPetStore::Action::\"SearchPets\",\n    resource == DigitalPetStore::Application::\"PetStore\"\n);"
                }
            },
            "createdDate": "2024-11-11T21:05:11.434372Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.434372Z"
        },
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "R9deVVMMT5LaZV2uM82JRF",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Customer Role - Place Order",
                    "statement": "permit(\n    principal in DigitalPetStore::Role::\"Customer\",\n    action in [DigitalPetStore::Action::\"PlaceOrderForDigitalPet\"],\n    resource\n);"
                }
            },
            "createdDate": "2024-11-11T21:05:11.3008Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.3008Z"
        },
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "UHUNf4VZd6K46KLv8S95cf",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Customer Role - Get Order",
                    "statement": "permit (\n    principal in DigitalPetStore::Role::\"Customer\",\n    action in [DigitalPetStore::Action::\"GetOrder\"],\n    resource\n) when {\n    principal == resource.owner\n};"
                }
            },
            "createdDate": "2024-11-11T21:05:11.553681Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.553681Z"
        }
    ],
    "errors": []
}

おぉ、複数のポリシーを一発で取得出来ました。素晴らしいです。

また、パラメータの中でポリシーストア ID も指定していまして、ポリシーストアを跨った取得も可能です。これは便利ですね。
マイクロサービス的にポリシーストアを分けたい時があるのですがそういった時にも都合が良さそうです。

複数のポリシーストアからの一括取得も試してみましょう。

% cat hoge.json
{
    "requests": [
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "LpcTE6Gfi5htLSubDdwPuP"
        },
        {
            "policyStoreId": "QnWg6D7tPr1cZU3U57b9vm",
            "policyId": "NrpzUwc8nxcaZgMUU1T1ot"
        },
        {
            "policyStoreId": "XBYUkBDfYb4myyisscdwiD",
            "policyId": "MNiXogAecRB34jjWeT1pmx"
        }
    ]
}
% aws-v1 verifiedpermissions batch-get-policy --cli-input-json file://hoge.json
{
    "results": [
        {
            "policyStoreId": "PiHdv8r7eojZ6v23LKvBMT",
            "policyId": "LpcTE6Gfi5htLSubDdwPuP",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Customer Role - Search Pets",
                    "statement": "permit (\n    principal in DigitalPetStore::Role::\"Customer\",\n    action == DigitalPetStore::Action::\"SearchPets\",\n    resource == DigitalPetStore::Application::\"PetStore\"\n);"
                }
            },
            "createdDate": "2024-11-11T21:05:11.434372Z",
            "lastUpdatedDate": "2024-11-11T21:05:11.434372Z"
        },
        {
            "policyStoreId": "QnWg6D7tPr1cZU3U57b9vm",
            "policyId": "NrpzUwc8nxcaZgMUU1T1ot",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Users can create task lists and list their lists",
                    "statement": "permit (\n    principal,\n    action in [\n        TinyTodo::Action::\"CreateList\",\n        TinyTodo::Action::\"ListLists\",\n        TinyTodo::Action::\"ListSharedLists\"\n    ],\n    resource == TinyTodo::Application::\"app\"\n);"
                }
            },
            "createdDate": "2024-11-11T21:05:48.855258Z",
            "lastUpdatedDate": "2024-11-11T21:05:48.855258Z"
        },
        {
            "policyStoreId": "XBYUkBDfYb4myyisscdwiD",
            "policyId": "MNiXogAecRB34jjWeT1pmx",
            "policyType": "STATIC",
            "definition": {
                "static": {
                    "description": "Users have full control over their own accounts",
                    "statement": "permit (\n    principal,\n    action,\n    resource\n)\nwhen { resource in principal.Account };"
                }
            },
            "createdDate": "2024-11-11T21:04:51.946815Z",
            "lastUpdatedDate": "2024-11-11T21:04:51.946815Z"
        }
    ],
    "errors": []
}

こちらも取得することが出来ました。

さいごに

本日は Amazon Verified Permissions で複数のポリシー内容を一括で取得出来るようになったので試してみました。

Verified Permissions を使った上でさらにポリシー内容を全取得、複数取得するケースはそこまで多くない気もしますが、権限のメンテナンス機能などを開発する際には必要なこともありそうです。
こちらの API の存在だけでも覚えておくと良さそうです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.