Logotipo de Zephyrnet

Controle el acceso a los paneles de Amazon OpenSearch Service con asignaciones de funciones basadas en atributos

Fecha:

Usuarios federados de Servicio Amazon OpenSearch a menudo necesitan acceso a OpenSearch Dashboards con funciones basadas en sus perfiles de usuario. Control de acceso detallado del servicio OpenSearch asigna usuarios autenticados a roles de búsqueda de OpenSearch y luego evalúa los permisos para determinar cómo manejar las acciones del usuario. Sin embargo, cuando un proveedor de identidad (IdP) de toda la empresa administra a los usuarios, la asignación de usuarios a las funciones del servicio OpenSearch a menudo debe realizarse de forma dinámica en función de los atributos de usuario del IdP. Una opción para mapear usuarios es usar Integración SAML del servicio OpenSearch y pasar la información del grupo de usuarios a OpenSearch Service. Otra opción es Control de acceso basado en roles de Amazon Cognito, que admite asignaciones basadas en reglas o basadas en tokens. Pero ninguno de los enfoques admite la lógica de asignación de roles arbitraria. Por ejemplo, cuando necesita interpretar atributos de usuario de varios valores para identificar un rol de destino.

Esta publicación muestra cómo puede implementar asignaciones de funciones personalizadas con una generación previa de tokens de Amazon Cognito. AWS Lambda desencadenar. Para nuestro ejemplo, usamos un atributo de varios valores proporcionado a través de OpenID Connect (OIDC) a Amazon Cognito. Mostramos cómo tiene el control total de la lógica de mapeo y el proceso de un atributo multivaluado para Gestión de identidades y accesos de AWS (IAM) búsquedas de funciones. Nuestro enfoque es genérico para los IdP compatibles con OIDC. Para que esta publicación sea independiente, usamos el IdP de Okta como ejemplo para recorrer la configuración.

Resumen de la solución

La solución proporcionada intercepta el proceso de inicio de sesión basado en OICD en OpenSearch Dashboards con una función Lambda de generación previa al token. El inicio de sesión en OpenSearch Dashboards con un IdP de terceros y Amazon Cognito como intermediario consta de varios pasos:

  1. Primero, la solicitud inicial del usuario a OpenSearch Dashboard se redirige a Amazon Cognito.
  2. Amazon Cognito redirige la solicitud al IdP para la autenticación.
  3. Una vez que el usuario se autentica, el IdP envía el token de identidad (token de ID) a Amazon Cognito.
  4. Amazon Cognito invoca una función Lambda que modifica el token obtenido. Usamos un Amazon DynamoDB table para realizar búsquedas de mapeo de roles. El token modificado ahora contiene la información de asignación de funciones de IAM.
  5. Amazon Cognito utiliza esta información de asignación de funciones para asignar al usuario a la función de IAM especificada y proporciona las credenciales de la función.
  6. OpenSearch Service asigna las credenciales del rol de IAM a los roles de OpenSearch y aplica controles de permisos detallados.

La siguiente arquitectura describe el flujo de inicio de sesión desde la perspectiva del usuario.

Alcance de la solución

En el backend, OpenSearch Dashboards se integra con un grupo de usuarios de Amazon Cognito y un grupo de identidades de Amazon Cognito durante el flujo de autenticación. Los pasos son los siguientes:

  1. Autenticarse y obtener tokens.
  2. Busque el atributo del token y la asignación de roles de IAM y sobrescriba el atributo de Amazon Cognito.
  3. Intercambie tokens por credenciales de AWS utilizadas por los paneles de OpenSearch.

La siguiente arquitectura muestra esta perspectiva de back-end para el proceso de autenticación.

Flujo de autenticación de back-end

En el resto de esta publicación, repasamos las configuraciones necesarias para un flujo de autenticación en el que una función de Lambda implementa una lógica de asignación de funciones personalizada. Proporcionamos un código Lambda de muestra para la asignación de atributos OIDC de varios valores a roles de IAM en función de una tabla de búsqueda de DynamoDB con la siguiente estructura.

Valor de atributo OIDC Rol de IAM
["attribute_a","attribute_b"] arn:aws:iam::<aws-account-id>:role/<role-name-01>
["attribute_a","attribute_x"] arn:aws:iam::<aws-account-id>:role/<role-name-02>

Los pasos de alto nivel de la solución presentada en esta publicación son los siguientes:

  1. Configure la autenticación de Amazon Cognito para los paneles de OpenSearch.
  2. Agregue roles de IAM para asignaciones a roles de OpenSearch Service.
  3. Configure el IdP de Okta.
  4. Agregue un IdP de OIDC de terceros al grupo de usuarios de Amazon Cognito.
  5. Asigne roles de IAM a roles de OpenSearch Service.
  6. Cree la tabla de asignación de funciones y atributos de DynamoDB.
  7. Implemente y configure la función Lambda de generación previa al token.
  8. Configure el disparador Lambda de generación previa al token.
  9. Pruebe el inicio de sesión en OpenSearch Dashboards.

Requisitos previos

Para este tutorial, debe tener los siguientes requisitos previos:

Configurar la autenticación de Amazon Cognito para los paneles de OpenSearch

La modificación de los tokens de autenticación requiere que configure el dominio del servicio OpenSearch para usar Amazon Cognito para la autenticación. Para obtener instrucciones, consulte Configuración de la autenticación de Amazon Cognito para paneles de OpenSearch.

La función Lambda implementa asignaciones de funciones personalizadas configurando el cognito:preferred_role reclamación (para obtener más información, consulte Control de acceso basado en roles). Para la interpretación correcta de esta afirmación, establezca el grupo de identidades de Amazon Cognito en Elija el rol del token. A continuación, el grupo de identidades de Amazon Cognito utiliza el valor de la cognito:preferred_role reclamo para seleccionar el rol de IAM correcto. La siguiente captura de pantalla muestra la configuración necesaria en el grupo de identidades de Amazon Cognito que se crea durante la configuración de la autenticación de Amazon Cognito para OpenSearch Service.

Configuración de mapeo de roles de Cognito

Agregar roles de IAM para asignaciones a roles de OpenSearch

Los roles de IAM utilizados para las asignaciones a los roles de OpenSearch requieren una política de confianza para que los usuarios autenticados puedan asumirlos. La política de confianza debe hacer referencia al grupo de identidades de Amazon Cognito creado durante la configuración de la autenticación de Amazon Cognito para OpenSearch Service. Cree al menos un rol de IAM con una política de confianza personalizada. Para obtener instrucciones, consulte Creación de un rol mediante políticas de confianza personalizadas. El rol de IAM no requiere la vinculación de una política de permisos. Para ver una política de confianza de muestra, consulte Control de acceso basado en roles.

Configurar el IdP de Okta

En esta sección, describimos los pasos de configuración para incluir un multivalor attribute_array atributo en el token proporcionado por Okta. Para obtener más información, consulte Personalice los tokens devueltos por Okta con reclamos personalizados. Usamos la interfaz de usuario de Okta para realizar las configuraciones. Okta también proporciona una API que puede usar para crear secuencias de comandos y automatizar la configuración.

El primer paso es agregar el attributes_array atributo al perfil de usuario de Okta.

  1. Use el Editor de perfil de Okta en Directorio, Editor de perfil.
  2. Seleccione Usuario (predeterminado) y luego elige Añadir atributo.
  3. Agregar un atributo con un nombre para mostrar y un nombre de variable attributes_array De tipo conjunto de cadenas.

La siguiente captura de pantalla muestra el perfil de usuario predeterminado de Okta después de agregar el atributo personalizado.

Editor de perfil de usuario Okta

  1. A continuación, agregue attributes_array atribuir valores a los usuarios que utilizan la interfaz de administración de usuarios de Okta en Directorio, Personas.
  2. Seleccione un usuario y elija Mi Perfil.
  3. Elige Editar e introduzca los valores de los atributos.

La siguiente captura de pantalla muestra un ejemplo de attributes_array valores de atributo dentro de un perfil de usuario.

Matriz de atributos de usuario de Okta

El siguiente paso es agregar el attributes_array atributo al token de ID que se genera durante el proceso de autenticación.

  1. En la consola de Okta, elija Seguridad, API y seleccione el default servidor de autorización.
  2. Elige Reclamaciones y elige Agregar reclamo agregar el attributes_array atributo como parte del token de ID.
  3. Como ámbito, introduzca openid y como el valor del atributo, ingrese user.attributes_array.

Esto hace referencia al atributo creado previamente en el perfil de un usuario.

Agregar reclamo al token de ID

  1. A continuación, cree una aplicación para la federación con Amazon Cognito. Para obtener instrucciones, consulte ¿Cómo configuro Okta como proveedor de identidad de OpenID Connect en un grupo de usuarios de Amazon Cognito?.

El último paso asigna la aplicación Okta a los usuarios de Okta.

  1. Navegue hasta Directorio, Personas, seleccione un usuario y elija Asignar aplicaciones.
  2. Seleccione la aplicación que creó en el paso anterior.

Agregar un IdP de OIDC de terceros al grupo de usuarios de Amazon Cognito

Estamos implementando el mapeo de roles en función de la información proporcionada en un atributo OIDC de varios valores. El token de autenticación debe incluir este atributo. Si siguió la configuración de Okta descrita anteriormente, el atributo se agrega automáticamente al token de ID de un usuario. Si usó otro IdP, es posible que deba solicitar el atributo explícitamente. Para esto, agregue el nombre del atributo a la Ámbitos autorizados lista de IdP en Amazon Cognito.

Para obtener instrucciones sobre cómo configurar la federación entre un IdP de terceros y un grupo de usuarios de Amazon Cognito y cómo solicitar atributos adicionales, consulte Adición de proveedores de identidad OIDC a un grupo de usuarios. Para obtener un tutorial detallado de Okta, consulte ¿Cómo configuro Okta como proveedor de identidad de OpenID Connect en un grupo de usuarios de Amazon Cognito?.

Después de solicitar el token a través de OIDC, debe asignar el atributo a un atributo de grupo de usuarios de Amazon Cognito. Para obtener instrucciones, consulte Especificación de asignaciones de atributos de proveedores de identidad para su grupo de usuarios. La siguiente captura de pantalla muestra la configuración resultante en la consola de Amazon Cognito.

Asignación de atributos del grupo de usuarios de Amazon Cognito

Asignar roles de IAM a roles de OpenSearch Service

Al iniciar sesión, OpenSearch Service asigna a los usuarios a un rol de OpenSearch Service en función del ARN del rol de IAM establecido en el cognito:preferred_role reclamo por el activador Lambda de generación anterior al token. Esto requiere una asignación de roles en OpenSearch Service. Para agregar dichas asignaciones de roles a los roles de back-end de IAM, consulte Mapeo de roles a usuarios. La siguiente captura de pantalla muestra una asignación de roles en la consola de OpenSearch Dashboards.

Asignaciones de funciones de Amazon OpenSearch Service

Crear la tabla de mapeo de roles y atributos

Para esta solución, usamos DynamoDB para almacenar asignaciones de usuarios a roles de IAM. Para obtener instrucciones, consulte Crear una tabla y definir una clave de partición llamada Key De tipo String. Necesita el nombre de la tabla en el paso siguiente para configurar la función Lambda.

El siguiente paso es escribir la información de mapeo en la tabla. Una entrada de asignación consta de los siguientes atributos:

  • Clave – Una cadena que contiene valores de atributos en orden alfabético separados por comas
  • RolArn – Una cadena con el ARN del rol de IAM al que se debe asignar la combinación de valor de atributo.

Para obtener detalles sobre cómo agregar datos a una tabla de DynamoDB, consulte Escriba datos en una tabla usando la consola o AWS CLI.

Por ejemplo, si el atributo OIDC previamente configurado attributes_array contiene tres valores, attribute_a, attribute_by attribute_c, la entrada en la tabla de asignación se parece a la línea 1 de la tabla en la siguiente captura de pantalla.

Tabla de Amazon DynamoDB con asignaciones de roles y atributos

Implementar y configurar la función Lambda de generación previa al token

Una función de Lambda implementa la lógica de asignación de funciones personalizada. La función Lambda recibe un evento de Amazon Cognito como entrada y extrae información de atributos de él. Utiliza la información de atributos para una búsqueda en una tabla de DynamoDB y recupera el valor para cognito:preferred_role. Siga los pasos en Empezando con Lambda para crear una función Lambda de Node.js e inserte el siguiente código fuente:

const AWS = require("aws-sdk");
const tableName = process.env.TABLE_NAME;
const unauthorizedRoleArn = process.env.UNAUTHORIZED_ROLE;
const userAttributeArrayName = process.env.USER_POOL_ATTRIBUTE;
const dynamodbClient = new AWS.DynamoDB({apiVersion: "2012-08-10"});
exports.lambdaHandler = handlePreTokenGenerationEvent async function handlePreTokenGenerationEvent (event, context) { var sortedAttributeList = getSortedAttributeList(event); var lookupKey = sortedAttributeList.join(','); var roleArn = await lookupIAMRoleArn(lookupKey); appendResponseWithPreferredRole(event, roleArn); return event;
} function getSortedAttributeList(event) { return JSON.parse(event['request']['userAttributes'][userAttributeArrayName]).sort();
} async function lookupIAMRoleArn(key) { var params = { TableName: tableName, Key: { 'Key': {S: key} }, ProjectionExpression: 'RoleArn' }; try { let item = await dynamodbClient.getItem(params).promise(); return item['Item']['RoleArn']['S']; } catch (e){ console.log(e); return unauthorizedRoleArn; }
} function appendResponseWithPreferredRole(event, roleArn){ event.response = { 'claimsOverrideDetails': { 'groupOverrideDetails': { 'preferredRole': roleArn } } };
}

La función Lambda espera tres variables de entorno. Referirse a Uso de variables de entorno de AWS Lambda para obtener instrucciones para agregar las siguientes entradas:

  • NOMBRE DE LA TABLA – El nombre de la tabla de DynamoDB creada anteriormente. Esta tabla se utiliza para las búsquedas.
  • ROL_NO AUTORIZADO – El ARN del rol de IAM que se utiliza cuando no se encuentra ninguna asignación en la tabla de búsqueda.
  • USER_POOL_ATTRIBUTE – El atributo del grupo de usuarios de Amazon Cognito utilizado para la búsqueda de funciones de IAM. En nuestro ejemplo, este atributo se llama custom:attributes_array.

La siguiente captura de pantalla muestra la configuración final.

Configuración de la función AWS Lamba

La función Lambda necesita permisos para acceder a la tabla de búsqueda de DynamoDB. Configure los permisos de la siguiente manera: adjunte la siguiente política al rol de ejecución de Lambda (para obtener instrucciones, consulte Rol de ejecución de Lambda) y proporcione la región, el número de cuenta de AWS y el nombre de la tabla de DynamoDB:

{ "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:DescribeTable" ], "Resource": [ "arn:aws:dynamodb:<region>:<accountid>:table/<table>", "arn:aws:dynamodb:<region>:<accountid>:table/<table>/index/*" ], "Effect": "Allow" } ]
}

La configuración de la función Lambda ahora está completa.

Configurar el activador Lambda de generación previa al token

Como paso final, agregue un disparador de generación previa al token al grupo de usuarios de Amazon Cognito y haga referencia a la función Lambda recién creada. Para más detalles, consulte Personalización de flujos de trabajo de grupos de usuarios con activadores de Lambda. La siguiente captura de pantalla muestra la configuración.

Configuración del activador de generación previa al token de Amazon Cognito

Este paso completa la configuración; Amazon Cognito ahora asigna usuarios a roles de OpenSearch Service en función de los valores proporcionados en un atributo OIDC.

Pruebe el inicio de sesión en OpenSearch Dashboards

El siguiente diagrama muestra un flujo de inicio de sesión de ejemplo y las capturas de pantalla correspondientes para un usuario de Okta user1 con un atributo de perfil de usuario attribute_array y valor: ["attribute_a", "attribute_b", "attribute_c"].

Prueba de solución

Limpiar

Para evitar incurrir en cargos futuros, elimine el dominio de OpenSearch Service, el grupo de usuarios y el grupo de identidades de Amazon Cognito, la función Lambda y la tabla de DynamoDB creados como parte de esta publicación.

Conclusión

En esta publicación, demostramos cómo configurar una asignación personalizada a los roles del servicio OpenSearch utilizando valores proporcionados a través de un atributo OIDC. Configuramos dinámicamente el cognito:preferred_role reclamo utilizando un disparador de Lambda de generación previa al token de Amazon Cognito y una tabla de DynamoDB para la búsqueda. La solución es capaz de manejar atributos de usuario dinámicos de múltiples valores, pero puede ampliarla con una lógica de aplicación adicional que va más allá de una simple búsqueda. Los pasos en esta publicación son una prueba de concepto. Si planea desarrollar esto en una solución productiva, le recomendamos implementar Prácticas recomendadas de seguridad de Okta y AWS.

La publicación destaca solo un caso de uso de cómo puede usar el soporte de Amazon Cognito para los disparadores de Lambda para implementar necesidades de autenticación personalizadas. Si está interesado en obtener más detalles, consulte Cómo usar el activador de generación previa al token de Cognito para personalizar reclamos en tokens de identificación.


Acerca de los autores

retrato stefanoStefan Appel es arquitecto sénior de soluciones en AWS. Durante más de 10 años, apoya a los clientes empresariales en la adopción de tecnologías en la nube. Antes de unirse a AWS, Stefan ocupó cargos en los departamentos de arquitectura de software, gestión de productos y operaciones de TI. Comenzó su carrera en la investigación de sistemas basados ​​en eventos. En su tiempo libre, disfruta del senderismo y ha caminado a lo largo de Nueva Zelanda siguiendo a Te Araroa.

modo de retratomodood alvi es arquitecto sénior de soluciones en Amazon Web Services (AWS). A Modood le apasiona la transformación digital y está comprometido a ayudar a los grandes clientes empresariales de todo el mundo a acelerar su adopción y migración a la nube. Modood aporta más de una década de experiencia en el desarrollo de software, habiendo ocupado varios puestos técnicos en empresas como SAP y Porsche Digital. Modood obtuvo su Diploma en Ciencias de la Computación de la Universidad de Stuttgart.

punto_img

Información más reciente

punto_img