Exemplo 4: Controle de acesso multilocatário com RBAC e ABAC - AWS Orientação prescritiva

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á.

Exemplo 4: Controle de acesso multilocatário com RBAC e ABAC

Para aprimorar o exemplo de RBAC na seção anterior, você pode adicionar atributos aos usuários para criar uma abordagem híbrida RBAC-ABAC para controle de acesso multilocatário. Esse exemplo inclui as mesmas funções do exemplo anterior, mas adiciona o atributo de usuário account_lockout_flag e o parâmetro de contextouses_mfa. O exemplo também adota uma abordagem diferente para implementar o controle de acesso multilocatário usando o RBAC e o ABAC, e usa um repositório de políticas compartilhado em vez de um armazenamento de políticas diferente para cada inquilino.

Exemplo de controle de acesso multilocatário com RBAC, ABAC, Amazon Verified Permissions e Cedar

Este exemplo representa uma solução SaaS multilocatária na qual você precisa fornecer decisões de autorização para o Locatário A e o Locatário B, semelhante ao exemplo anterior.

Para implementar o recurso de bloqueio de usuário, o exemplo adiciona o account_lockout_flag atributo à User entidade principal na solicitação de autorização. Esse sinalizador bloqueia o acesso do usuário ao sistema e concede DENY todos os privilégios ao usuário bloqueado. O account_lockout_flag atributo está associado à User entidade e está em vigor User até que o sinalizador seja revogado ativamente em várias sessões. O exemplo usa a when condição para avaliaraccount_lockout_flag.

O exemplo também adiciona detalhes sobre a solicitação e a sessão. As informações de contexto especificam que a sessão foi autenticada usando a autenticação multifatorial. Para implementar essa validação, o exemplo usa a when condição para avaliar o uses_mfa sinalizador como parte do campo de contexto. Para obter mais informações sobre as melhores práticas para adicionar contexto, consulte a documentação do Cedar.

permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

Essa política impede o acesso aos recursos, a menos que o recurso esteja no mesmo grupo que o Tenant atributo do principal solicitante. Essa abordagem para manter o isolamento de inquilinos é conhecida como abordagem de um repositório de políticas compartilhado para vários locatários. Para obter mais informações sobre as considerações de design de permissões verificadas para aplicativos SaaS multilocatários, consulte a seção Considerações sobre design de permissões verificadas para vários locatários.

A política também garante que o diretor seja membro allAccessRole e restringe as ações de viewData e. updateData Além disso, essa política verifica se account_lockout_flag é false e se o valor do contexto de é uses_mfa avaliado como. true

Da mesma forma, a política a seguir garante que o principal e o recurso estejam associados ao mesmo inquilino, o que impede o acesso entre inquilinos. Essa política também garante que o diretor seja membro viewDataRole e restringe as ações a. viewData Além disso, verifica se o account_lockout_flag é false e se o valor do contexto para é uses_mfa avaliado como. true

permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

A terceira política é semelhante à anterior. A política exige que o recurso seja membro do grupo que corresponde à entidade representada porprincipal.Tenant. Isso garante que tanto o principal quanto o recurso estejam associados ao Locatário B, o que impede o acesso entre inquilinos. Essa política garante que o diretor seja membro updateDataRole e restringe as ações a. updateData Além disso, essa política verifica se o account_lockout_flag é false e se o valor do contexto para é uses_mfa avaliado como. true

permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };

A solicitação de autorização a seguir é avaliada pelas três políticas discutidas anteriormente nesta seção. Nessa solicitação de autorização, o principal do tipo User e com um valor de Alice faz uma updateData solicitação com a funçãoallAccessRole. Alicetem o atributo Tenant cujo valor éTenant::"TenantA". A ação Alice que está tentando executar é updateData, e o recurso ao qual ela será aplicada é SampleData do tipoData. SampleDatatem TenantA como entidade controladora.

De acordo com a primeira <DATAMICROSERVICE_POLICYSTOREID> política no repositório de políticas, Alice pode executar a updateData ação no recurso, supondo que as condições na when cláusula da política sejam atendidas. A primeira condição exige que o principal.Tenant atributo seja avaliadoTenantA. A segunda condição exige que o account_lockout_flag atributo do principal sejafalse. A condição final exige que uses_mfa o contexto sejatrue. Como todas as três condições foram atendidas, a solicitação retorna uma ALLOW decisão.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "context": { "contextMap": { "uses_mfa": { "boolean": true } } }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": { { "account_lockout_flag": { "boolean": false }, "Tenant": { "entityIdentifier": { "entityType":"MultitenantApp::Tenant", "entityId":"TenantA" } } } }, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Tenant", "entityId": "TenantA" } ] } ] } }