Ejemplo 4: Control de acceso multiusuario con RBAC y ABAC - AWS Guía prescriptiva

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejemplo 4: Control de acceso multiusuario con RBAC y ABAC

Para mejorar el ejemplo del RBAC de la sección anterior, puede añadir atributos a los usuarios para crear un enfoque híbrido RBAC-ABAC para el control de acceso de varios usuarios. Este ejemplo incluye las mismas funciones del ejemplo anterior, pero añade el atributo de usuario y el parámetro de contexto. account_lockout_flag uses_mfa El ejemplo también adopta un enfoque diferente para implementar el control de acceso multiusuario mediante RBAC y ABAC, y usa un almacén de políticas compartido en lugar de un almacén de políticas diferente para cada inquilino.

Ejemplo de control de acceso multiusuario con RBAC, ABAC, Amazon Verified Permissions y Cedar

Este ejemplo representa una solución SaaS multiusuario en la que debe proporcionar decisiones de autorización para el arrendatario A y el arrendatario B, de forma similar al ejemplo anterior.

Para implementar la función de bloqueo de usuarios, el ejemplo agrega el atributo account_lockout_flag a la User entidad principal en la solicitud de autorización. Este indicador bloquea el acceso del usuario al sistema y DENY otorga todos los privilegios al usuario bloqueado. El account_lockout_flag atributo está asociado a la User entidad y estará en vigor User hasta que la marca se revoque activamente en varias sesiones. En el ejemplo se usa la when condición para evaluaraccount_lockout_flag.

El ejemplo también agrega detalles sobre la solicitud y la sesión. La información de contexto especifica que la sesión se ha autenticado mediante la autenticación multifactorial. Para implementar esta validación, el ejemplo usa la when condición para evaluar el uses_mfa indicador como parte del campo de contexto. Para obtener más información sobre las prácticas recomendadas para añadir contexto, consulte la documentación 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 };

Esta política impide el acceso a los recursos a menos que el recurso esté en el mismo grupo que el Tenant atributo del principal solicitante. Este enfoque para mantener el aislamiento de los inquilinos se denomina enfoque de un almacén de políticas compartido para varios inquilinos. Para obtener más información sobre las consideraciones de diseño de permisos verificados para aplicaciones SaaS de varios inquilinos, consulte la sección Consideraciones de diseño de permisos verificados para múltiples inquilinos.

La política también garantiza que el director sea miembro de allAccessRole y restringe las acciones a y. viewData updateData Además, esta política verifica que así account_lockout_flag sea false y que el valor de contexto para la uses_mfa evaluación sea igual a. true

Del mismo modo, la siguiente política garantiza que tanto el principal como el recurso estén asociados al mismo inquilino, lo que impide el acceso entre inquilinos. Esta política también garantiza que el director sea miembro viewDataRole y restringe las acciones a. viewData Además, verifica que el account_lockout_flag es false y que el valor de contexto para el que se uses_mfa evalúa. 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 tercera política es similar a la anterior. La política exige que el recurso sea miembro del grupo que corresponda a la entidad por la que está representadoprincipal.Tenant. Esto garantiza que tanto el principal como el recurso estén asociados al inquilino B, lo que impide el acceso entre inquilinos. Esta política garantiza que el director sea miembro updateDataRole y restringe las acciones a. updateData Además, esta política verifica que account_lockout_flag es false y que el valor de contexto se uses_mfa evalúa como tal. 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 siguiente solicitud de autorización se evalúa mediante las tres políticas descritas anteriormente en esta sección. En esta solicitud de autorización, el principal del tipo User y con un valor de Alice realiza una updateData solicitud con el rolallAccessRole. Alicetiene el atributo Tenant cuyo valor esTenant::"TenantA". La acción que Alice se intenta realizar es de ese tipo updateData, y el recurso al que se aplicará es SampleData de ese tipoData. SampleDatatiene TenantA como entidad principal.

Según la primera política del almacén de <DATAMICROSERVICE_POLICYSTOREID> políticas, Alice puede realizar la updateData acción en el recurso, suponiendo que se cumplan las condiciones de la when cláusula de la política. La primera condición requiere que el principal.Tenant atributo se evalúeTenantA. La segunda condición requiere que el atributo del principal account_lockout_flag seafalse. La condición final requiere que el contexto uses_mfa seatrue. Como se cumplen las tres condiciones, la solicitud devuelve una ALLOW decisión.

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