Logotipo de Zephyrnet

Proteja sus índices de Amazon Kendra con la ACL mediante una clave secreta compartida de JWT

Fecha:

A nivel mundial, muchas organizaciones tienen datos comerciales críticos dispersos entre varios repositorios de contenido, lo que dificulta el acceso a esta información de manera optimizada y cohesiva. Crear una experiencia de búsqueda unificada y segura es un desafío importante para las organizaciones porque cada repositorio contiene una amplia gama de formatos de documentos y mecanismos de control de acceso.

amazona kendra es un servicio de búsqueda empresarial inteligente que permite a los usuarios buscar en diferentes repositorios de contenido. Los clientes son responsables de autenticar y autorizar a los usuarios para obtener acceso a su aplicación de búsqueda, y Amazon Kendra permite la búsqueda segura de aplicaciones empresariales, asegurándose de que los resultados de la consulta de búsqueda de un usuario solo incluyan documentos que el usuario está autorizado a leer. Amazon Kendra puede validar fácilmente la identidad de usuarios individuales y grupos de usuarios que realizan búsquedas con la adición de tokens de búsqueda seguros. Al agregar tokens de usuario para la búsqueda segura, se simplifica y protege la realización de búsquedas filtradas basadas en el acceso en Amazon Kendra. Puede pasar de forma segura la información de acceso del usuario en la carga útil de la consulta en lugar de utilizar filtros de atributos para lograrlo. Con esta característica, Amazon Kendra puede validar la información del token y aplicarla automáticamente a los resultados de búsqueda para un filtrado basado en el acceso preciso y seguro.

Amazon Kendra admite el control de acceso de usuarios basado en tokens mediante los siguientes tipos de tokens:

  • Abrir ID
  • JWT con un secreto compartido
  • JWT con una clave pública
  • JSON

Previamente, vimos una demostración de control de acceso de usuarios basado en token en Amazon Kendra con Open ID. En esta publicación, demostramos el control de acceso de usuarios basado en tokens en Amazon Kendra con JWT con un secreto compartido. JWT, o JSON Web Token, es un estándar abierto que se utiliza para compartir información de seguridad entre un cliente y un servidor. Contiene objetos JSON codificados, incluido un conjunto de notificaciones. Los JWT se firman con un algoritmo criptográfico para garantizar que los reclamos no se puedan modificar después de que se emita el token. Los JWT son útiles en escenarios relacionados con la autorización y el intercambio de información.

Los JWT constan de tres partes separadas por puntos (.):

  • Encabezamiento – Contiene partes como el tipo de token, que es JWT, el algoritmo de firma que se utiliza, como HMAC SHA256 o RSA, y un identificador de clave opcional.
  • carga útil – Contiene varios pares clave-valor, llamados reclamaciones, que son emitidos por el proveedor de identidad. Además de varios reclamos relacionados con la emisión y el vencimiento del token, el token también puede contener información sobre el principal y el arrendatario individuales.
  • Firma – Para crear la parte de la firma, toma el encabezado codificado, la carga útil codificada, un secreto, el algoritmo especificado en el encabezado y lo firma.

Por lo tanto, un JWT se parece a lo siguiente:

Header.Payload.Signature

El siguiente es un encabezado de muestra:

{ "alg": "HS256", "typ": "JWT", "kid": "jwttest"
}

La siguiente es la carga útil de muestra:

{ "groups": [ "AWS-SA" ], "username": "John", "iat": 1676078851, "exp": 1676079151, "iss": "0oa5yce4g2sQdftHV5d7", "sub": "0oa5yce4g2sQdftHV5d7", "jti": "e3d62304-6608-4b72-ac0a-cb1d7049df5b"
}

El JWT se crea con una clave secreta, y esa clave secreta es privada para usted, lo que significa que nunca la revelará al público ni la inyectará dentro del JWT. Cuando recibe un JWT del cliente, puede verificar el JWT con la clave secreta almacenada en el servidor. Cualquier modificación al JWT resultará en una falla de verificación (validación de JWT).

Esta publicación demuestra el uso de muestra de un JWT con una clave de acceso compartida y su uso para proteger los índices de Amazon Kendra con controles de acceso. En producción, utiliza un proveedor de servicios de autenticación seguro de su elección y según sus requisitos para generar JWT.

Para obtener más información sobre los JWT, consulte Introducción a los tokens web JSON.

Resumen de la solución

Similar a la post con Open ID, esta solución está diseñada para que un conjunto de usuarios y grupos realicen consultas de búsqueda en un repositorio de documentos, y los resultados se devuelven solo de aquellos documentos que están autorizados para acceder dentro de ese grupo. La siguiente tabla describe a qué documentos está autorizado cada usuario para acceder a nuestro caso de uso. Los documentos que se utilizan en este ejemplo son un subconjunto de los documentos públicos de AWS.

Usuario Grupo procesos Tipo de documento autorizado para el acceso
Invitad@s . Blog
Patricia Local Blogs, guías de usuario
James Ventas Blogs, guías de usuario, estudios de casos
Juan Marketing Blogs, guías de usuario, estudios de casos, informes de analistas
Mary Solutions Architect Blogs, guías de usuario, estudios de casos, informes de analistas, libros blancos

El siguiente diagrama ilustra la creación de un JWT con una clave de acceso compartida para controlar el acceso de los usuarios a los documentos específicos en el índice de Amazon Kendra.

Cuando un índice de Amazon Kendra recibe una llamada a la API de consulta con un token de acceso de usuario, valida el token mediante una clave secreta compartida (almacenada de forma segura en Director de secretos de AWS) y obtiene parámetros como el nombre de usuario y los grupos en la carga útil. El índice de Amazon Kendra filtra los resultados de búsqueda en función de la Lista de control de acceso (ACL) almacenada y la información recibida en el JWT del usuario. Estos resultados filtrados se devuelven en respuesta a la llamada API de consulta realizada por la aplicación.

Requisitos previos

Para seguir los pasos de esta publicación, asegúrese de tener lo siguiente:

Genere un JWT con una clave secreta compartida

El siguiente código Java de muestra muestra cómo crear un JWT con una clave secreta compartida utilizando el código abierto jsonwebtoken paquete. En producción, utilizará un proveedor de servicios de autenticación seguro de su elección y en función de sus requisitos para generar JWT.

Pasamos la información del nombre de usuario y los grupos como reclamos en la carga útil, firmamos el JWT con el secreto compartido y generamos un JWT específico para ese usuario. Proporcione una cadena de 256 bits como su secreto y conserve el valor del secreto compartido codificado en URL base64 para usarlo en un paso posterior.

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys; //HS256 token generation public class TokenGeneration { public static void main(String[] args) { String secret = "${yourSecret}"; String base64secret = Base64.getUrlEncoder().encodeToString(secret.getBytes(StandardCharsets.UTF_8)); System.out.println("base64secret " + base64secret); SecretKey sharedSecret = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); Instant now = Instant.now(); String sub = "${yourSub}"; String username = " ${yourUsername}"; List<String> groups = Arrays.asList("${yourGroup}"); //set claims Map<String, Object> claims = new HashMap<>(); claims.put("username", username); claims.put("groups", groups); Map<String, Object> headers = new HashMap<String, Object>(); headers.put("typ", "JWT"); headers.put("kid","${kid}"); String jwt = Jwts.builder() .setClaims(claims) .setIssuedAt(Date.from(now)) .setExpiration(Date.from(now.plus(5L, ChronoUnit.MINUTES))) .setIssuer(sub) .setSubject(sub) .setId(UUID.randomUUID().toString()) .setHeaderParams(headers) .signWith(sharedSecret) .compact(); System.out.println(“JWT Token: “ + jwt); }
}

Cree un índice de Amazon Kendra con un secreto compartido de JWT

Para obtener instrucciones sobre cómo crear un índice de Amazon Kendra, consulte Crear un índice. Anote el Gestión de identidades y accesos de AWS (IAM) que creó durante el proceso. Proporcione al rol acceso al depósito de S3 y Secrets Manager siguiendo las principio de menor privilegio. Para ver políticas de ejemplo, consulte Ejemplo de políticas basadas en identidad de IAM. Después de crear el índice, su consola de Amazon Kendra debería verse como la siguiente captura de pantalla.

Complete los siguientes pasos para agregar su secreto:

  1. En la consola de Amazon Kendra, vaya a la Control de acceso de usuario pestaña en la página de detalles de su índice.
  2. Elige Editar la configuración.

  1. Debido a que estamos implementando un control de acceso basado en tokens, seleccione bajo Configuraciones de control de acceso.

  1. under Configuración de fichas, escoger JWT con secreto compartido para Tipo de token.
  2. tipo de secreto, escoger Nuevo.
  3. Nombre secreto, introduzca AmazonKendra-jwt-shared-secret o cualquier nombre de su elección.
  4. ID de clave, ingrese el ID de clave para que coincida con su JWT que creó en el código Java de muestra.
  5. Algoritmo, elija el algoritmo HS256.
  6. Secreto compartido, ingrese su secreto codificado de URL base64 retenido generado a partir del código Java anteriormente.
  7. Elige Guardar secreto.

El secreto ahora se almacenará en Secrets Manager como un conjunto de claves web JSON (JWKS). Puede localizarlo en la consola de Secrets Manager. Para obtener más detalles, consulte Uso de un token web JSON (JWT) con un secreto compartido.

  1. Ampliar la opción Configuracion avanzada .

En este paso, configuramos el nombre de usuario y los grupos que se extraerán de las notificaciones de JWT y se compararán con la ACL cuando la firma sea válida.

  1. Usuariointroduzca su nombre de usuario.
  2. Grupos, entrar en grupos.
  3. Deje los campos opcionales como predeterminados.
  4. Elige Siguiente, A continuación, elija Actualizar.

Prepare su depósito S3 como fuente de datos

Para preparar un depósito de S3 como fuente de datos, cree un depósito de S3. En la terminal con el Interfaz de línea de comandos de AWS (CLI de AWS) o AWS CloudShell, ejecute los siguientes comandos para cargar los documentos y los metadatos en el depósito de la fuente de datos:

aws s3 cp s3://aws-ml-blog/artifacts/building-a-secure-search-application-with-access-controls-kendra/docs.zip .
unzip docs.zip
aws s3 cp Data/ s3://<REPLACE-WITH-NAME-OF-S3-BUCKET>/Data/ --recursive
aws s3 cp Meta/ s3://<REPLACE-WITH-NAME-OF-S3-BUCKET>/Meta/ --recursive

Los documentos que se consultan se almacenan en un depósito S3. Cada tipo de documento tiene una carpeta separada: blogs, estudios de casos, informes de analistas, guías de usuario y libros blancos. Esta estructura de carpetas está contenida en una carpeta denominada Datos. Los archivos de metadatos, incluidas las ACL, se encuentran en una carpeta llamada Meta.

Usamos el conector Amazon Kendra S3 para configurar este depósito S3 como fuente de datos. Cuando la fuente de datos se sincroniza con el índice de Amazon Kendra, rastrea e indexa todos los documentos y recopila las ACL y los atributos de los documentos de los archivos de metadatos. Para obtener más información sobre las ACL que utilizan archivos de metadatos, consulte Metadatos de documentos de Amazon S3. Para este ejemplo, usamos el atributo personalizado DocumentType para indicar el tipo de documento. Después de la carga, la estructura de su depósito S3 debería verse como la siguiente captura de pantalla.

Para establecer el atributo personalizado DocumentType, completa los siguientes pasos:

  1. Elija su índice Kendra y elija Definición de faceta en el panel de navegación.
  2. Elige Agregue campo.

  1. Nombre del campo, introduzca DocumentType.
  2. Tipo de datos, escoger Cordón.
  3. Elige Añada.

Ahora puede ingerir documentos del depósito que creó en el índice de Amazon Kendra mediante el conector S3. Para obtener instrucciones completas, consulte Ingesta de documentos a través del conector Amazon Kendra S3.

  1. En Configurar ajustes de sincronización sección, para Ingrese la ubicación de la fuente de datos, ingrese su depósito S3 (s3://kendra-demo-bucket/).
  2. Ubicación de la carpeta del prefijo de los archivos de metadatos, introduzca Meta/.
  3. Expandir Configuración adicional.
  4. En Incluir patrones pestaña, para Prefijo, introduzca Data/.

Para obtener más información acerca de los conectores admitidos, consulte Conectores.

  1. Elige Siguiente, entonces Siguiente de nuevo, entonces Actualizar.
  2. Espere a que se cree la fuente de datos, luego seleccione la fuente de datos y elija Sincronizar ahora.

La sincronización de la fuente de datos puede tardar entre 10 y 15 minutos en completarse. Cuando se complete la sincronización, Estado de la última sincronización debería mostrarse como Exitoso.

Consultar un índice de Amazon Kendra

Para ejecutar una consulta de prueba en su índice, complete los siguientes pasos:

  1. En la consola de Amazon Kendra, elija Buscar contenido indexado en el panel de navegación.
  2. Expandir Consulta de prueba con un token de acceso.
  3. Elige Aplicar ficha.

  1. Podemos generar un JWT para el usuario y el grupo. En este ejemplo, creamos un JWT para el AWS-SA grupo. Reemplazamos nombre de usuario como María y grupos como AWS-SA en el paso de generación de JWT.
  2. Ingrese el token generado y elija Aplicá.

Según la ACL, deberíamos obtener resultados de todas las carpetas: blogs, guías de usuario, estudios de casos, informes de analistas y documentos técnicos.

De manera similar, cuando inicia sesión como James desde el AWS-Sales group y pasando el JWT correspondiente, tenemos acceso solo a blogs, guías de usuario y casos de estudio.

También podemos buscar en el índice como invitados sin pasar un token. El invitado solo puede acceder a los contenidos de la carpeta de blogs.

Experimente con otras consultas que se le ocurran mientras está conectado como diferentes usuarios y grupos y observe los resultados.

Limpiar

Para evitar incurrir en costos futuros, limpie los recursos que creó como parte de esta solución. Para eliminar el índice de Amazon Kendra y el depósito S3 creados mientras probaba la solución, consulte Limpiar. Para eliminar el secreto de Secrets Manager, consulte Eliminar un secreto de AWS Secrets Manager.

Conclusión

En esta publicación, vimos cómo Amazon Kendra puede realizar búsquedas seguras que solo arrojan resultados de búsqueda basados ​​en el acceso del usuario. Con la adición de un JWT con una clave secreta compartida, podemos validar fácilmente la identidad de los usuarios individuales, así como de los grupos de usuarios que realizan búsquedas. Este enfoque similar se puede extender a una JWT con una clave pública. Para obtener más información, consulte Uso de un token web JSON (JWT) con un secreto compartido.


Acerca de los autores

Nitin Eusebio es arquitecto sénior de soluciones empresariales en AWS con más de 18 años de experiencia en ingeniería de software y arquitectura empresarial. Trabaja con los clientes para ayudarlos a crear aplicaciones bien diseñadas en la plataforma de AWS. Le apasiona resolver desafíos tecnológicos y ayudar a los clientes con su viaje a la nube.

Kruthi Jayasimha Rao es un arquitecto de soluciones de socios con un enfoque en IA y ML. Brinda orientación técnica a los socios de AWS sobre cómo seguir las mejores prácticas para crear soluciones seguras, resistentes y de alta disponibilidad en la nube de AWS.

Baya de Ishaan es ingeniero de software en Amazon Web Services y trabaja en Amazon Kendra, un motor de búsqueda empresarial. Le apasiona la seguridad y ha trabajado en los componentes clave de las funciones de control de acceso de Kendra durante los últimos 2 años.

akasha bhatia es un arquitecto principal de soluciones con AWS. Su enfoque actual es ayudar a los clientes empresariales a lograr sus resultados comerciales a través de la arquitectura e implementación de soluciones innovadoras y resistentes a escala. Ha trabajado en tecnología durante más de 15 años en empresas que van desde Fortune 100 hasta nuevas empresas en los verticales de fabricación, aeroespacial y minorista.

punto_img

Información más reciente

punto_img