Esempio 4: controllo degli accessi multi-tenant con RBAC e ABAC - AWS Guida prescrittiva

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esempio 4: controllo degli accessi multi-tenant con RBAC e ABAC

Per migliorare l'esempio RBAC della sezione precedente, è possibile aggiungere attributi agli utenti per creare un approccio ibrido RBAC-ABAC per il controllo degli accessi multi-tenant. Questo esempio include gli stessi ruoli dell'esempio precedente, ma aggiunge l'attributo user e il parametro context. account_lockout_flag uses_mfa L'esempio adotta inoltre un approccio diverso all'implementazione del controllo degli accessi multi-tenant utilizzando sia RBAC che ABAC e utilizza un archivio di politiche condiviso anziché un archivio di politiche diverso per ogni tenant.

Esempio di controllo degli accessi multi-tenant con RBAC, ABAC, Amazon Verified Permissions e Cedar

Questo esempio rappresenta una soluzione SaaS multi-tenant in cui è necessario fornire decisioni di autorizzazione per il Tenant A e il Tenant B, in modo simile all'esempio precedente.

Per implementare la funzionalità di blocco degli utenti, l'esempio aggiunge l'attributo account_lockout_flag all'Userentità principale nella richiesta di autorizzazione. Questo flag blocca l'accesso dell'utente al sistema e assegna DENY tutti i privilegi all'utente bloccato. L'account_lockout_flagattributo è associato all'Userentità ed è valido User fino a quando il flag non viene revocato attivamente in più sessioni. L'esempio utilizza la when condizione per valutareaccount_lockout_flag.

L'esempio aggiunge anche dettagli sulla richiesta e sulla sessione. Le informazioni di contesto specificano che la sessione è stata autenticata utilizzando l'autenticazione a più fattori. Per implementare questa convalida, l'esempio utilizza la when condizione per valutare il uses_mfa flag come parte del campo di contesto. Per ulteriori informazioni sulle migliori pratiche per l'aggiunta di contesto, consulta la documentazione 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 };

Questa politica impedisce l'accesso alle risorse a meno che la risorsa non sia nello stesso gruppo dell'attributo del Tenant principale richiedente. Questo approccio per mantenere l'isolamento dei tenant è denominato approccio One Shared Multi-Tenant Policy Store. Per ulteriori informazioni sulle considerazioni sulla progettazione di autorizzazioni verificate per applicazioni SaaS multi-tenant, consulta la sezione Considerazioni sulla progettazione multi-tenant delle autorizzazioni verificate.

La politica garantisce inoltre che il preside sia membro e limita le azioni a e. allAccessRole viewData updateData Inoltre, questa politica verifica che lo account_lockout_flag sia false e che il valore di contesto uses_mfa valuti a. true

Analogamente, la seguente politica garantisce che sia il principale che la risorsa siano associati allo stesso tenant, impedendo l'accesso tra tenant. Questa politica garantisce inoltre che il preside sia membro di viewDataRole e limita le azioni a. viewData Inoltre, verifica che il valore account_lockout_flag è false e che il valore di contesto di sia uguale auses_mfa. 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 terza politica è simile alla precedente. La politica richiede che la risorsa sia un membro del gruppo che corrisponde all'entità rappresentata daprincipal.Tenant. Ciò garantisce che sia il principale che la risorsa siano associati al Tenant B, il che impedisce l'accesso tra tenant. Questa politica garantisce che il committente sia membro di updateDataRole e limita le azioni a. updateData Inoltre, questo criterio verifica che il valore di account_lockout_flag is false e il valore di contesto uses_mfa valuti a. 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 seguente richiesta di autorizzazione viene valutata in base alle tre politiche illustrate in precedenza in questa sezione. In questa richiesta di autorizzazione, il principale di tipo User e con valore di Alice effettua una updateData richiesta con il ruoloallAccessRole. Aliceha l'attributo Tenant il cui valore èTenant::"TenantA". L'azione Alice che si sta tentando di eseguire è updateData, e la risorsa a cui verrà applicata è SampleData del tipoData. SampleDataha TenantA come entità principale.

In base alla prima politica nell'archivio delle <DATAMICROSERVICE_POLICYSTOREID> politiche, Alice può eseguire l'updateDataazione sulla risorsa, presupponendo che siano soddisfatte le condizioni nella when clausola della politica. La prima condizione richiede l'principal.Tenantattributo su cui eseguire la valutazione. TenantA La seconda condizione richiede che l'account_lockout_flagattributo principale siafalse. L'ultima condizione richiede che uses_mfa il contesto siatrue. Poiché tutte e tre le condizioni sono soddisfatte, la richiesta restituisce una ALLOW decisione.

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