Adicionando contexto - Amazon Verified Permissions

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Adicionando contexto

O contexto é a informação relevante para as decisões políticas, mas não faz parte da identidade de seu diretor, ação ou recurso. Talvez você queira permitir uma ação somente de um conjunto de endereços IP de origem ou somente se o usuário tiver feito login com o MFA. Seu aplicativo tem acesso a esses dados contextuais da sessão e deve preenchê-los para solicitações de autorização. Os dados de contexto em uma solicitação de autorização de permissões verificadas devem ser formatados em JSON em um elemento. contextMap

Os exemplos que ilustram esse conteúdo vêm de um exemplo de armazenamento de políticas. Para acompanhar, crie o repositório DigitalPetStorede políticas de amostra em seu ambiente de teste.

O objeto de contexto a seguir declara um de cada tipo de dados do Cedar para um aplicativo com base no exemplo de armazenamento de DigitalPetStorepolíticas.

"context": { "contextMap": { "MfaAuthorized": { "boolean": true }, "AccountCodes": { "set": [ { "long": 111122223333 }, { "long": 444455556666 }, { "long": 123456789012 } ] }, "UserAgent": { "string": "My UserAgent 1.12" }, "RequestedOrderCount": { "long": 4 }, "NetworkInfo": { "record": { "IPAddress": { "string": "192.0.2.178" }, "Country": { "string": "United States of America" }, "SSL": { "boolean": true } } }, "approvedBy": { "entityIdentifier": { "entityId": "Bob", "entityType": "DigitalPetStore::User" } } } }
Tipos de dados no contexto de autorização
Booleano

Um binário true ou false valor. No exemplo, o valor booleano de true for MfaAuthenticated indica que o cliente realizou a autenticação multifatorial antes de solicitar a visualização do pedido.

Defina

Uma coleção de elementos de contexto. Os membros do conjunto podem ser todos do mesmo tipo, como neste exemplo, ou de tipos diferentes, incluindo um conjunto aninhado. No exemplo, o cliente está associado a três contas diferentes.

String

Uma sequência de letras, números ou símbolos, entre " caracteres. No exemplo, a UserAgent string representa o navegador que o cliente usou para solicitar a visualização do pedido.

Longo

Um valor inteiro. No exemplo, RequestedOrderCount indica que essa solicitação faz parte de um lote que resultou da solicitação do cliente para visualizar quatro de seus pedidos anteriores.

Registro

Uma coleção de atributos. Você deve declarar esses atributos no contexto da solicitação. Um repositório de políticas com um esquema deve incluir essa entidade e os atributos da entidade no esquema. No exemplo, o NetworkInfo registro contém informações sobre o IP de origem do usuário, a geolocalização desse IP conforme determinado pelo cliente e a criptografia em trânsito.

EntityIdentifier

Uma referência a uma entidade e atributos declarados no entities elemento da solicitação. No exemplo, o pedido do usuário foi aprovado pelo funcionárioBob.

Para testar esse contexto de exemplo no DigitalPetStoreaplicativo de exemplo, você deve atualizar sua solicitaçãoentities, seu esquema de armazenamento de políticas e a política estática com a descrição Customer Role - Get Order.

Modificando DigitalPetStore para aceitar o contexto de autorização

Inicialmente, não DigitalPetStoreé um repositório de políticas muito complexo. Ele não inclui nenhuma política ou atributo de contexto pré-configurado para dar suporte ao contexto que apresentamos. Para avaliar um exemplo de solicitação de autorização com essas informações de contexto, faça as seguintes modificações em seu repositório de políticas e em sua solicitação de autorização.

Schema

Aplique as seguintes atualizações ao esquema do repositório de políticas para oferecer suporte aos novos atributos de contexto. Atualize GetOrder da actions seguinte forma.

"GetOrder": { "memberOf": [], "appliesTo": { "resourceTypes": [ "Order" ], "context": { "type": "Record", "attributes": { "UserAgent": { "required": true, "type": "String" }, "approvedBy": { "name": "User", "required": true, "type": "Entity" }, "AccountCodes": { "type": "Set", "required": true, "element": { "type": "Long" } }, "RequestedOrderCount": { "type": "Long", "required": true }, "MfaAuthorized": { "type": "Boolean", "required": true } } }, "principalTypes": [ "User" ] } }

Para referenciar o tipo de record dados nomeado NetworkInfo em seu contexto de solicitação, crie uma construção CommonType em seu esquema da seguinte maneira. Uma commonType construção é um conjunto compartilhado de atributos que você pode aplicar a diferentes entidades.

nota

Atualmente, o editor de esquema visual de Permissões Verificadas não oferece suporte a commonType construções. Ao adicioná-los ao seu esquema, você não pode mais visualizá-lo no modo Visual.

"commonTypes": { "NetworkInfo": { "attributes": { "IPAddress": { "type": "String", "required": true }, "SSL": { "required": true, "type": "Boolean" }, "Country": { "required": true, "type": "String" } }, "type": "Record" } }
Policy

A política a seguir configura condições que devem ser atendidas por cada um dos elementos de contexto fornecidos. Ele se baseia na política estática existente com a descrição Customer Role - Get Order. Inicialmente, essa política exige apenas que o principal que faz a solicitação seja o proprietário do recurso.

permit ( principal in DigitalPetStore::Role::"Customer", action in [DigitalPetStore::Action::"GetOrder"], resource ) when { principal == resource.owner && context.MfaAuthorized == true && context.UserAgent like "*My UserAgent*" && context.RequestedOrderCount <= 4 && context.AccountCodes.contains(111122223333) && context.NetworkInfo.Country like "*United States*" && context.NetworkInfo.SSL == true && context.NetworkInfo.IPAddress like "192.0.2.*" && context.approvedBy in DigitalPetStore::Role::"Employee" };

Agora exigimos que a solicitação para recuperar um pedido atenda às condições de contexto adicionais que adicionamos à solicitação.

  1. O usuário deve ter feito login com o MFA.

  2. O navegador da web do usuário User-Agent deve conter a stringMy UserAgent.

  3. O usuário deve ter solicitado a visualização de 4 ou menos pedidos.

  4. Um dos códigos de conta do usuário deve ser111122223333.

  5. O endereço IP do usuário deve ser originário dos Estados Unidos, ele deve estar em uma sessão criptografada e seu endereço IP deve começar com192.0.2..

  6. Um funcionário deve ter aprovado seu pedido. No entities elemento da solicitação de autorização, declararemos um usuário Bob que tem a função deEmployee.

Request body

Depois de configurar seu repositório de políticas com o esquema e a política apropriados, você pode apresentar essa solicitação de autorização à operação IsAuthorizedda API de permissões verificadas. Observe que o entities segmento contém uma definição deBob, um usuário com uma função deEmployee.

{ "principal": { "entityType": "DigitalPetStore::User", "entityId": "Alice" }, "action": { "actionType": "DigitalPetStore::Action", "actionId": "GetOrder" }, "resource": { "entityType": "DigitalPetStore::Order", "entityId": "1234" }, "context": { "contextMap": { "MfaAuthorized": { "boolean": true }, "UserAgent": { "string": "My UserAgent 1.12" }, "RequestedOrderCount":{ "long": 4 }, "AccountCodes": { "set": [ {"long": 111122223333}, {"long": 444455556666}, {"long": 123456789012} ] }, "NetworkInfo": { "record": { "IPAddress": {"string": "192.0.2.178"}, "Country": {"string": "United States of America"}, "SSL": {"boolean": true} } }, "approvedBy": { "entityIdentifier": { "entityId": "Bob", "entityType": "DigitalPetStore::User" } } } }, "entities": { "entityList": [ { "identifier": { "entityType": "DigitalPetStore::User", "entityId": "Alice" }, "attributes": { "memberId": { "string": "801b87f2-1a5c-40b3-b580-eacad506d4e6" } }, "parents": [ { "entityType": "DigitalPetStore::Role", "entityId": "Customer" } ] }, { "identifier": { "entityType": "DigitalPetStore::User", "entityId": "Bob" }, "attributes": { "memberId": { "string": "49d9b81e-735d-429c-989d-93bec0bcfd8b" } }, "parents": [ { "entityType": "DigitalPetStore::Role", "entityId": "Employee" } ] }, { "identifier": { "entityType": "DigitalPetStore::Order", "entityId": "1234" }, "attributes": { "owner": { "entityIdentifier": { "entityType": "DigitalPetStore::User", "entityId": "Alice" } } }, "parents": [] } ] }, "policyStoreId": "PSEXAMPLEabcdefg111111" }