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.
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'User
entità 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_flag
attributo è associato all'User
entità 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
. Alice
ha 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
. SampleData
ha TenantA
come entità principale.
In base alla prima politica nell'archivio delle <DATAMICROSERVICE_POLICYSTOREID>
politiche, Alice
può eseguire l'updateData
azione sulla risorsa, presupponendo che siano soddisfatte le condizioni nella when
clausola della politica. La prima condizione richiede l'principal.Tenant
attributo su cui eseguire la valutazione. TenantA
La seconda condizione richiede che l'account_lockout_flag
attributo 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" } ] } ] } }