Exemple 4 : Contrôle d'accès multi-locataires avec RBAC et ABAC - AWS Conseils prescriptifs

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exemple 4 : Contrôle d'accès multi-locataires avec RBAC et ABAC

Pour améliorer l'exemple RBAC présenté dans la section précédente, vous pouvez ajouter des attributs aux utilisateurs afin de créer une approche hybride RBAC-ABAC pour le contrôle d'accès multi-locataires. Cet exemple inclut les mêmes rôles que dans l'exemple précédent, mais ajoute l'attribut user account_lockout_flag et le paramètre de contexteuses_mfa. L'exemple adopte également une approche différente pour mettre en œuvre le contrôle d'accès multi-locataires en utilisant à la fois le RBAC et l'ABAC, et utilise un magasin de politiques partagé au lieu d'un magasin de politiques différent pour chaque locataire.

Exemple de contrôle d'accès multi-locataires avec RBAC, ABAC, Amazon Verified Permissions et Cedar

Cet exemple représente une solution SaaS multi-locataires dans laquelle vous devez fournir des décisions d'autorisation pour le locataire A et le locataire B, comme dans l'exemple précédent.

Pour implémenter la fonctionnalité de verrouillage utilisateur, l'exemple ajoute l'attribut account_lockout_flag au principal de l'Userentité dans la demande d'autorisation. Ce drapeau verrouille l'accès des utilisateurs au système et DENY octroie tous les privilèges à l'utilisateur bloqué. L'account_lockout_flagattribut est associé à l'Userentité et est actif User jusqu'à ce que le drapeau soit activement révoqué au cours de plusieurs sessions. L'exemple utilise la when condition pour évalueraccount_lockout_flag.

L'exemple ajoute également des détails sur la demande et la session. Les informations contextuelles indiquent que la session a été authentifiée à l'aide de l'authentification multifactorielle. Pour implémenter cette validation, l'exemple utilise la when condition pour évaluer l'uses_mfaindicateur dans le cadre du champ de contexte. Pour plus d'informations sur les meilleures pratiques en matière d'ajout de contexte, consultez la documentation de 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 };

Cette politique empêche l'accès aux ressources à moins que celles-ci ne soient dans le même groupe que l'Tenantattribut du principal demandeur. Cette approche visant à maintenir l'isolement des locataires est appelée approche One Shared Multi-Tenant Policy Store. Pour plus d'informations sur les considérations relatives à la conception des autorisations vérifiées pour les applications SaaS multi-locataires, consultez la section Considérations relatives à la conception multi-locataires des autorisations vérifiées.

La politique garantit également que le directeur est membre de allAccessRole et limite les actions à viewData etupdateData. En outre, cette politique vérifie que account_lockout_flag c'est le cas false et que la valeur de contexte de est uses_mfa évaluée à. true

De même, la politique suivante garantit que le principal et la ressource sont associés au même locataire, ce qui empêche l'accès entre locataires. Cette politique garantit également que le directeur est membre viewDataRole et limite les actions àviewData. En outre, il vérifie que la valeur de contexte account_lockout_flag est false et que la valeur de contexte de est uses_mfa évaluée à. 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 };

La troisième politique est similaire à la précédente. La politique exige que la ressource soit membre du groupe correspondant à l'entité représentée parprincipal.Tenant. Cela garantit que le principal et la ressource sont associés au locataire B, ce qui empêche l'accès entre locataires. Cette politique garantit que le directeur est membre updateDataRole et limite les actions àupdateData. En outre, cette politique vérifie que la valeur de contexte account_lockout_flag est false et que la valeur de contexte de est uses_mfa évaluée à. 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 };

La demande d'autorisation suivante est évaluée selon les trois politiques décrites plus haut dans cette section. Dans cette demande d'autorisation, le principal de type User et avec une valeur de Alice fait une updateData demande avec le rôleallAccessRole. Alicepossède l'attribut Tenant dont la valeur estTenant::"TenantA". L'action Alice que vous essayez d'exécuter est updateData, et la ressource à laquelle elle sera appliquée est SampleData du typeData. SampleDataa TenantA comme entité mère.

Selon la première politique du magasin de <DATAMICROSERVICE_POLICYSTOREID> politiques, Alice vous pouvez effectuer l'updateDataaction sur la ressource, en supposant que les conditions de la when clause de la politique sont remplies. La première condition exige que l'principal.Tenantattribut soit évalué àTenantA. La deuxième condition exige que l'attribut account_lockout_flag du principal soitfalse. La dernière condition exige que le contexte uses_mfa soittrue. Les trois conditions étant remplies, la demande renvoie une ALLOW décision.

{ "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" } ] } ] } }