Ejemplo 3: Control de acceso multiusuario con RBAC - 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 3: Control de acceso multiusuario con RBAC

Para profundizar en el ejemplo anterior de RBAC, puede ampliar sus requisitos para incluir la multitenencia de SaaS, que es un requisito común para los proveedores de SaaS. En las soluciones multiarrendatario, el acceso a los recursos siempre se proporciona en nombre de un arrendatario determinado. Es decir, los usuarios del arrendatario A no pueden ver los datos del arrendatario B, incluso si esos datos están colocados lógica o físicamente en un sistema. El siguiente ejemplo ilustra cómo puede implementar el aislamiento de inquilinos mediante varios almacenes de políticas de permisos verificados y cómo puede emplear las funciones de usuario para definir los permisos dentro del inquilino.

Utilizar el patrón de diseño del almacén de políticas por inquilino es una práctica recomendada para mantener el aislamiento de los inquilinos y, al mismo tiempo, implementar el control de acceso con permisos verificados. En este escenario, las solicitudes de los usuarios del inquilino A y del inquilino B se verifican comparándolas con almacenes de políticas independientes DATAMICROSERVICE_POLICYSTORE_A yDATAMICROSERVICE_POLICYSTORE_B, respectivamente. 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.

Ejemplo de control de acceso de múltiples inquilinos con RBAC, Amazon Verified Permissions y Cedar

La siguiente política se encuentra en el almacén de políticas. DATAMICROSERVICE_POLICYSTORE_A Verifica que el principal formará parte del grupo allAccessRole de tipoRole. En este caso, el director podrá realizar updateData las acciones viewData y acciones en todos los recursos que estén asociados al inquilino A.

permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource );

Las siguientes políticas se encuentran en el almacén DATAMICROSERVICE_POLICYSTORE_B de políticas. La primera política comprueba que el principal forma parte del updateDataRole grupo de tiposRole. Suponiendo que ese sea el caso, da permiso a los directores para realizar la updateData acción con los recursos que están asociados al inquilino B.

permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource );

Esta segunda política exige que los directores que formen parte del viewDataRole grupo de este tipo Role puedan realizar la viewData acción con los recursos asociados al arrendatario B.

permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource );

La solicitud de autorización realizada por el arrendatario A debe enviarse al almacén DATAMICROSERVICE_POLICYSTORE_A de políticas y verificarse mediante las políticas que pertenecen a ese almacén. En este caso, se verifica mediante la primera política analizada anteriormente como parte de este ejemplo. En esta solicitud de autorización, el principal de tipo User con un valor de Alice solicita realizar la viewData acción. El principal pertenece al grupo allAccessRole de tiposRole. Alice está intentando realizar la viewData acción en el SampleData recurso. Como Alice tiene la allAccessRole función, esta evaluación da como resultado una ALLOW decisión.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }

Si, por el contrario, consulta una solicitud realizada por el inquilino BUser Bob, verá algo parecido a la siguiente solicitud de autorización. La solicitud se envía al almacén de DATAMICROSERVICE_POLICYSTORE_B políticas porque proviene del arrendatario B. En esta solicitud, el director Bob desea realizar la acción updateData en el recursoSampleData. Sin embargo, Bob no forma parte de un grupo que tenga acceso a la acción updateData de ese recurso. Por lo tanto, la solicitud da lugar a una DENY decisión.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_B", "principal": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Bob" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "viewDataRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }

En este tercer ejemplo, User Alice intenta realizar la viewData acción en el recursoSampleData. Esta solicitud se dirige al almacén de DATAMICROSERVICE_POLICYSTORE_A políticas porque la principal Alice pertenece al arrendatario A. Alice forma parte de este tipo allAccessRole de grupoRole, lo que le permite realizar la viewData acción con los recursos. Como tal, la solicitud da lugar a una ALLOW decisión.

{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE_A", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "viewData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [] } ] } }