Amazon Verified Permissions 示例策略 - Amazon Verified Permissions

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Verified Permissions 示例策略

以下 “已验证权限” 策略示例基于为 Cedar 策略语言参考指南的 “示例架构” 部分中 PhotoFlash 描述的假设应用程序定义的架构。有关 Cedar 策略语法的更多信息,请参阅《Cedar 策略语言参考指南》中的 Cedar 中的基本策略构造

允许单个实体访问

以下示例说明如何创建允许用户alice查看照片的策略VacationPhoto94.jpg

permit( principal == User::"alice", action == Action::"view", resource == Photo::"VacationPhoto94.jpg" );

允许实体组访问

以下示例说明如何创建允许群组alice_friends中的任何人查看照片的策略VacationPhoto94.jpg

permit( principal in Group::"alice_friends", action == Action::"view", resource == Photo::"VacationPhoto94.jpg" );

以下示例说明如何创建允许用户alice查看相册中任何照片的策略alice_vacation

permit( principal == User::"alice", action == Action::"view", resource in Album::"alice_vacation" );

以下示例说明如何创建允许用户alice查看、编辑或删除相册中任何照片的策略alice_vacation

permit( principal == User::"alice", action in [Action::"view", Action::"edit", Action::"delete"], resource in Album::"alice_vacation" );

以下示例说明如何创建允许用户alice在相册中获得权限的策略alice_vacation,其中admin是在架构层次结构中定义的群组,其中包含查看、编辑和删除照片的权限。

permit( principal == User::"alice", action in PhotoflashRole::"admin", resource in Album::"alice_vacation" );

以下示例说明如何创建允许用户alice在相册中获得权限的策略alice_vacation,其中一个群组viewer是在架构层次结构中定义的,包含查看和评论照片的权限。策略中列出的第二个操作还会向用户 alice 授予 edit 权限。

permit( principal == User::"alice", action in [PhotoflashRole::"viewer", Action::"edit"], resource in Album::"alice_vacation" )

允许任何实体访问

以下示例说明如何创建允许任何经过身份验证的委托人查看相册的策略alice_vacation

permit( principal, action == Action::"view", resource in Album::"alice_vacation" );

以下示例说明如何创建允许用户alice列出jane账户中的所有相册、列出每个相册中的照片以及查看账户中的照片的策略。

permit( principal == User::"alice", action in [Action::"listAlbums", Action::"listPhotos", Action::"view"], resource in Account::"jane" );

以下示例说明如何创建允许用户alice对相册中的资源执行任何操作的策略jane_vaction

permit( principal == User::"alice", action, resource in Album::"jane_vacation" );

允许访问实体的属性 (ABAC)

基于属性的访问控制 (ABAC) 是一种基于属性定义权限的授权策略。Verified Permissions 允许将属性附加到主体、操作和资源。然后,可以在策略的 whenunless 子句中引用这些属性,这些策略会评估构成请求上下文的主体、操作和资源的属性。

以下示例使用了在 Cedar 策略语言参考指南的 “示例架构” 部分中 PhotoFlash 描述的假设应用程序中定义的属性。

以下示例说明如何创建一项政策,允许HardwareEngineering部门中任何工作级别大于或等于 5 的负责人查看和列出相册中的照片device_prototypes

permit( principal, action in [Action::"listPhotos", Action::"view"], resource in Album::"device_prototypes" ) when { principal.department == "HardwareEngineering" && principal.jobLevel >= 5 };

以下示例说明如何创建alice允许用户查看任何文件类型资源的策略JPEG

permit( principal == User::"alice", action == Action::"view", resource ) when { resource.fileType == "JPEG" };

操作具有上下文属性。您必须在授权请求context中传递这些属性。以下示例说明如何创建允许用户执行任何readOnly操作alice的策略。您也可以为架构中的操作设置appliesTo属性。例如,当您要确保用户只能尝试为该类型的资源进行授权时,这会ViewPhoto为资源指定有效的操作PhotoFlash::Photo

permit( principal == PhotoFlash::User::"alice", action, resource ) when { context has readOnly && context.readOnly == true };

但是,在架构中设置操作属性的更好方法是将它们排列到功能操作组中。例如,您可以创建一个名为ReadOnlyPhotoAccess并设置PhotoFlash::Action::"ViewPhoto"为操作组成员的ReadOnlyPhotoAccess动作。以下示例说明如何创建策略,授予 Alice 访问该组中只读操作的权限。

permit( principal == PhotoFlash::User::"alice", action, resource ) when { action in PhotoFlash::Action::"ReadOnlyPhotoAccess" };

以下示例说明如何创建允许所有委托人对其拥有owner属性的资源执行任何操作的策略。

permit( principal, action, resource ) when { principal == resource.owner };

以下示例说明如何创建一个策略,允许任何委托人查看任何资源,前提是委托人的department属性与资源的department属性相匹配。

注意

如果某个实体没有在策略条件中提及的属性,则在做出授权决策时,该策略将被忽略,而对该实体的策略评估将会失败。例如,此策略不能向任何没有 department 属性的主体授予对任何资源的访问权限。

permit( principal, action == Action::"view", resource ) when { principal.department == resource.owner.department };

以下示例说明如何创建一个策略,允许任何委托人对资源执行任何操作,前提是委托人是该owner资源的委托人或者委托人是该资源admins组的一部分。

permit( principal, action, resource, ) when { principal == resource.owner || resource.admins.contains(principal) };

拒绝访问

如果某个策略的效果是 forbid,则它会限制权限,而不是授予权限。

重要

在授权期间,如果同时执行 permitforbid 策略,则 forbid 优先。

以下示例使用了在 Cedar 策略语言参考指南的 “示例架构” 部分中 PhotoFlash 描述的假设应用程序中定义的属性。

以下示例说明如何创建策略,拒绝用户执行alicereadOnly对任何资源之外的所有操作。

forbid ( principal == User::"alice", action, resource ) unless { action.readOnly };

以下示例说明如何创建拒绝访问所有具有private属性的资源的策略,除非委托人拥有该资源的owner属性。

forbid ( principal, action, resource ) when { resource.private } unless { principal == resource.owner };

使用方括号表示法来引用代币属性

以下示例说明如何创建使用方括号表示法来引用令牌属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit ( principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup", action, resource ) when { principal["cognito:username"] == "alice" && principal["custom:employmentStoreCode"] == "petstore-dallas" && principal has email && principal.email == "alice@example.com" && context["ip-address"] like "192.0.2.*" };

使用点符号来引用属性

以下示例说明如何创建使用点符号来引用属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit(principal, action, resource) when { principal.cognito.username == "alice" && principal.custom.employmentStoreCode == "petstore-dallas" && principal.tenant == "x11app-tenant-1" && principal has email && principal.email == "alice@example.com" };

反映亚马逊 Cognito ID 令牌属性

以下示例展示了如何创建引用 Amazon Cognito 中的 ID 令牌属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit ( principal in MyCorp::UserGroup::"us-west-2_EXAMPLE|MyUserGroup", action, resource ) when { principal["cognito:username"] == "alice" && principal["custom:employmentStoreCode"] == "petstore-dallas" && principal.tenant == "x11app-tenant-1" && principal has email && principal.email == "alice@example.com" };

反映 OIDC ID 令牌属性

以下示例说明如何创建引用OIDC提供商的 ID 令牌属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit ( principal in MyCorp::UserGroup::"MyOIDCProvider|MyUserGroup", action, resource ) when { principal.email_verified == true && principal.email == "alice@example.com" && principal.phone_number_verified == true && principal.phone_number like "+1206*" };

反映亚马逊 Cognito 访问令牌的属性

以下示例显示了如何创建引用 Amazon Cognito 访问令牌属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit(principal, action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"], resource) when { context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" && context.token.scope.contains("MyAPI/mydata.write") };

反映OIDC访问令牌属性

以下示例说明如何创建引用OIDC提供商提供的访问令牌属性的策略。

有关在已验证权限中的策略中使用令牌属性的更多信息,请参阅 将身份提供者令牌映射到架构

permit( principal, action in [MyApplication::Action::"Read", MyApplication::Action::"GetStoreInventory"], resource ) when { context.token.client_id == "52n97d5afhfiu1c4di1k5m8f60" && context.token.scope.contains("MyAPI-read") };