Validación de token mediante AWS Lambda - AWS HealthLake

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.

Validación de token mediante AWS Lambda

Al crear un almacén de datos habilitado para HealthLake SMART en el FHIR, debe proporcionar el ARN de AWS Lambda la función en CreateFHIRDatastore la solicitud. El ARN de la función Lambda se especifica en el IdentityProviderConfiguration objeto mediante el parámetro. IdpLambdaArn

Debe crear la función Lambda antes de crear su banco de datos habilitado para SMART on FHIR. Una vez creado el banco de datos, no se puede cambiar el ARN de Lambda. Para ver el ARN de Lambda que especificó al crear el banco de datos, utilice la acción de la API. DescribeFHIRDatastore

Para que una solicitud REST de FHIR tenga éxito en un almacén de datos habilitado para SMART on FHIR, la función Lambda debe hacer lo siguiente:
  • Devuelve una respuesta en menos de 1 segundo al punto final del almacén de HealthLake datos.

  • Decodifique el token de acceso proporcionado en el encabezado de autorización de la solicitud de API REST enviada por la aplicación cliente.

  • Asigne una función de servicio de IAM que tenga permisos suficientes para llevar a cabo la solicitud de la API REST del FHIR.

  • Para completar una solicitud de la API REST del FHIR, se requieren las siguientes afirmaciones. Para obtener más información, consulte Solicitudes obligatorias.

    • nbf

    • exp

    • isAuthorized

    • aud

    • scope

Al trabajar con Lambda, además de la función Lambda, debe crear un rol de ejecución y una política basada en recursos. La función de ejecución de una función de Lambda es una función de IAM que otorga a la función permiso para acceder a los servicios y recursos de AWS necesarios en tiempo de ejecución. La política basada en recursos que proporcione debe permitir HealthLake invocar su función en su nombre.

En las secciones de este tema se describe un ejemplo de solicitud de una aplicación cliente y una respuesta decodificada, los pasos necesarios para crear una función AWS Lambda y cómo crear una política basada en recursos que se pueda asumir. HealthLake

Creación de una AWS función Lambda

La función Lambda creada en este tema se activa cuando HealthLake recibe una solicitud a un almacén de datos habilitado para SMART en FHIR. La solicitud de la aplicación cliente contiene una llamada a la API REST y un encabezado de autorización que contiene un token de acceso.

GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/ Authorization: Bearer i8hweunweunweofiwweoijewiwe

El ejemplo de la función Lambda de este tema se utiliza AWS Secrets Manager para ocultar las credenciales relacionadas con el servidor de autorización. Recomendamos encarecidamente no proporcionar los detalles de inicio de sesión del servidor de autorización directamente en una función Lambda.

ejemplo validar una solicitud REST del FHIR que contenga un token portador de autorización

La función Lambda de ejemplo muestra cómo validar una solicitud REST de FHIR enviada a un almacén de datos SMART en FHIR habilitado. Para ver step-by-steps instrucciones sobre cómo implementar esta función Lambda, consulte. Creación de una función Lambda mediante el AWS Management Console

Si la solicitud de la API REST de FHIR no contiene un punto final de almacén de datos, un token de acceso y una operación REST válidos, la función Lambda fallará. Para obtener más información sobre los elementos del servidor de autorización necesarios, consulte. Solicitudes obligatorias

import base64 import boto3 import logging import json import os from urllib import request, parse logger = logging.getLogger() logger.setLevel(logging.INFO) ## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server client = boto3.client('secretsmanager', region_name="region-of-datastore") response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager') secret = json.loads(response['SecretString']) client_id = secret['client_id'] client_secret = secret['client_secret'] unencoded_auth = f'{client_id}:{client_secret}' headers = { 'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}', 'Content-Type': 'application/x-www-form-urlencoded' } auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore def lambda_handler(event, context): if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event: return {} datastore_endpoint = event['datastoreEndpoint'] operation_name = event['operationName'] bearer_token = event['bearerToken'] logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name)) ## To validate the token auth_response = auth_with_provider(bearer_token) logger.info('Auth response: [{}]'.format(auth_response)) auth_payload = json.loads(auth_response) ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through auth_payload["isAuthorized"] = bool(auth_payload["active"]) auth_payload["nbf"] = auth_payload["iat"] return {"authPayload": auth_payload, "iamRoleARN": user_role_arn} ## access the server def auth_with_provider(token): data = {'token': token, 'token_type_hint': 'access_token'} req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers) with request.urlopen(req) as resp: return resp.read().decode()

El siguiente procedimiento supone que ya ha creado la función de servicio que desea asumir HealthLake al gestionar una solicitud de la API REST del FHIR en un almacén de datos habilitado para SMART on FHIR. Si no ha creado el rol de servicio, aún puede crear la función Lambda. Debe añadir el ARN del rol de servicio para que la función Lambda funcione. Para obtener más información sobre cómo crear un rol de servicio y especificarlo en la función Lambda, consulte Crear un rol HealthLake de servicio para usarlo en la función AWS Lambda utilizada para decodificar un JWT

Para crear una función Lambda ()AWS Management Console
  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija Crear función.

  3. Seleccione Crear desde cero.

  4. En Información básica, introduzca un nombre de función. En Tiempo de ejecución, elija un tiempo de ejecución basado en Python.

  5. En Execution role (Rol de ejecución), elija Create a new role with basic Lambda permissions (Crear un nuevo rol con permisos básicos de Lambda).

    Lambda crea un rol de ejecución que otorga a la función permiso para cargar registros en Amazon. CloudWatch La función Lambda asume la función de ejecución cuando se invoca la función y la utiliza para crear credenciales para el SDK. AWS

  6. Seleccione la pestaña Código y añada la función Lambda de ejemplo.

    Si aún no ha creado el rol de servicio que va a utilizar la función Lambda, tendrá que crearlo antes de que funcione la función Lambda de ejemplo. Para obtener más información sobre la creación de un rol de servicio para la función Lambda, consulte. Crear un rol HealthLake de servicio para usarlo en la función AWS Lambda utilizada para decodificar un JWT

    import base64 import boto3 import logging import json import os from urllib import request, parse logger = logging.getLogger() logger.setLevel(logging.INFO) ## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server client = boto3.client('secretsmanager', region_name="region-of-datastore") response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager') secret = json.loads(response['SecretString']) client_id = secret['client_id'] client_secret = secret['client_secret'] unencoded_auth = f'{client_id}:{client_secret}' headers = { 'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}', 'Content-Type': 'application/x-www-form-urlencoded' } auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore def lambda_handler(event, context): if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event: return {} datastore_endpoint = event['datastoreEndpoint'] operation_name = event['operationName'] bearer_token = event['bearerToken'] logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name)) ## To validate the token auth_response = auth_with_provider(bearer_token) logger.info('Auth response: [{}]'.format(auth_response)) auth_payload = json.loads(auth_response) ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through auth_payload["isAuthorized"] = bool(auth_payload["active"]) auth_payload["nbf"] = auth_payload["iat"] return {"authPayload": auth_payload, "iamRoleARN": user_role_arn} ## Access the server def auth_with_provider(token): data = {'token': token, 'token_type_hint': 'access_token'} req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers) with request.urlopen(req) as resp: return resp.read().decode()

Modificación del rol de ejecución de una función Lambda

Tras crear la función Lambda, debe actualizar el rol de ejecución para incluir los permisos necesarios para llamar a Secrets Manager. En Secrets Manager, cada secreto que crees tiene un ARN. Para aplicar el mínimo de privilegios, la función de ejecución solo debe tener acceso a los recursos necesarios para que se ejecute la función Lambda.

Puede modificar la función de ejecución de una función de Lambda buscándola en la consola de IAM o seleccionando Configuración en la consola de Lambda. Para obtener más información sobre la administración de su función de ejecución de funciones de Lambda, consulte. Rol de ejecución de Lambda

ejemplo Función de ejecución de la función Lambda que otorga acceso a GetSecretValue

Al añadir la acción de IAM GetSecretValue a la función de ejecución, se otorga el permiso necesario para que funcione la función Lambda de muestra.

En este punto, ha creado una función Lambda que se puede utilizar para validar el token de acceso proporcionado como parte de la solicitud REST de FHIR enviada a su almacén de datos SMART on FHIR habilitado.

Crear un rol HealthLake de servicio para usarlo en la función AWS Lambda utilizada para decodificar un JWT

Perfil: administrador de IAM

Un usuario que puede añadir o eliminar políticas de IAM y crear nuevas identidades de IAM.

Rol de servicio

Un rol de servicio es un rol de IAM que asume un servicio para realizar acciones en su nombre. Un administrador de IAM puede crear, modificar y eliminar un rol de servicio desde IAM. Para obtener más información, consulte Creación de un rol para delegar permisos a un Servicio de AWS en la Guía del usuario de IAM.

Una vez decodificado el token web JSON (JWT), Lambda también necesita devolver un ARN de rol de IAM. Esta función debe tener los permisos necesarios para llevar a cabo la solicitud de la API REST o fallará por falta de permisos.

Al configurar una política personalizada mediante IAM, lo mejor es conceder los permisos mínimos necesarios. Para obtener más información, consulte Aplicar permisos con privilegios mínimos en la Guía del usuario de IAM.

La creación HealthLake de un rol de servicio para designarlo en la función Lambda de autorización requiere dos pasos.

  • En primer lugar, debe crear una política de IAM. La política debe especificar el acceso a los recursos del FHIR para los que ha proporcionado ámbitos en el servidor de autorización.

  • En segundo lugar, debe crear el rol de servicio. Al crear el rol, designa una relación de confianza y adjunta la política que creó en el primer paso. La relación de confianza se designa HealthLake como principal del servicio. Debe especificar un ARN de almacén de HealthLake datos y un ID de AWS cuenta en este paso.

Crear una nueva política de IAM

Los ámbitos que defina en su servidor de autorización determinan a qué recursos del FHIR tiene acceso un usuario autenticado en un almacén de datos. HealthLake

La política de IAM que cree se puede personalizar para que coincida con los ámbitos que haya definido.

Se pueden definir las siguientes acciones en el Action elemento de una declaración de política de IAM. Para cada uno de Action los elementos de la tabla, puede definir unResource types. En HealthLake un banco de datos, es el único tipo de recurso admitido que se puede definir en el Resource elemento de una declaración de política de permisos de IAM.

Los recursos individuales del FHIR no son un recurso que se pueda definir como un elemento de una política de permisos de la IAM.

Acciones definidas por HealthLake
Actions Descripción Nivel de acceso Tipo de recurso (obligatorio)

CreateResource

Otorga permiso para crear un recurso

Escritura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
DeleteResource

Otorga permiso para eliminar un recurso

Escritura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
ReadResource

Otorga permiso para leer el recurso

Lectura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithGet

Otorga permiso para buscar recursos con el método GET

Lectura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithPost Otorga permiso para buscar recursos con el método POST Lectura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
Inicio FHIRExport JobWithPost

Otorga permiso para iniciar un trabajo de exportación del FHIR con GET

Escritura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id
UpdateResource

Otorga permiso para actualizar el recurso

Escritura ARN del almacén de datos: arn:aws:healthlake: :datastore/fhir/ your-region 111122223333 your-datastore-id

Para empezar, puede utilizar. AmazonHealthLakeFullAccess Esta política permitiría leer, escribir, buscar y exportar todos los recursos del FHIR que se encuentren en un almacén de datos. Para conceder permisos de solo lectura en un almacén de datos, utilice. AmazonHealthLakeReadOnlyAccess

Para obtener más información sobre cómo crear una política personalizada mediante el AWS Management Console, o el IAM AWS CLI SDKs, consulte Creación de políticas de IAM en la Guía del usuario de IAM.

Crear un rol de servicio para HealthLake (consola de IAM)

Utilice este procedimiento para crear un rol de servicio. Al crear un servicio, también tendrá que designar una política de IAM.

Para crear el rol de servicio para HealthLake (consola de IAM)
  1. Inicie sesión en la consola de IAM AWS Management Console y ábrala en. https://console.aws.amazon.com/iam/

  2. En el panel de navegación de la consola de IAM, elija Roles.

  3. A continuación, elija Create role (Crear rol).

  4. En la página Seleccionar entidad de confianza, elija Política de confianza personalizada.

  5. A continuación, en Política de confianza personalizada, actualice la política de ejemplo de la siguiente manera. your-account-idSustitúyalo por su número de cuenta y añada el ARN del banco de datos que desee utilizar en sus trabajos de importación o exportación.

  6. A continuación, elija Next (Siguiente).

  7. En la página Agregar permisos, elija la política que desee que asuma el HealthLake servicio. Para encontrar tu política, búscala en Políticas de permisos.

  8. A continuación, selecciona Adjuntar política.

  9. A continuación, en la página Nombre, revisión y creación, situada en Nombre del rol, introduzca un nombre.

  10. (Opcional) A continuación, en Descripción, añade una breve descripción de tu función.

  11. De ser posible, escriba un nombre o sufijo de nombre para el rol, que pueda ayudarle a identificar su finalidad. Los nombres de rol deben ser únicos en su Cuenta de AWS. No distinguen entre mayúsculas y minúsculas. Por ejemplo, no puede crear funciones denominado tanto PRODROLE como prodrole. Dado que varias entidades pueden hacer referencia al rol, no puede editar el nombre del rol después de crearlo.

  12. Revisa los detalles del rol y, a continuación, selecciona Crear rol.

Para obtener información sobre cómo especificar el ARN del rol en la función Lambda de ejemplo, consulte. Creación de una AWS función Lambda

Rol de ejecución de Lambda

La función de ejecución de una función Lambda es una función de IAM que concede a la función permiso para acceder a los AWS servicios y recursos. Esta página proporciona información sobre cómo crear, ver y administrar el rol de ejecución de una función de Lambda.

De forma predeterminada, Lambda crea un rol de ejecución con permisos mínimos al crear una nueva función de Lambda mediante. AWS Management Console Para gestionar los permisos concedidos en la función de ejecución, consulte Creación de una función de ejecución en la consola de IAM en la Guía para desarrolladores de Lambda.

La función Lambda de ejemplo que se proporciona en este tema usa Secrets Manager para ocultar las credenciales del servidor de autorización.

Al igual que con cualquier función de IAM que cree, es importante seguir las mejores prácticas con privilegios mínimos. Durante la fase de desarrollo, a veces es posible que concedas permisos más allá de lo necesario. Antes de publicar la función en el entorno de producción, la práctica recomendada consiste en ajustar la política para incluir solo los permisos necesarios. Para obtener más información, consulte Aplicar los privilegios mínimos en la Guía del usuario de IAM.

Permita HealthLake activar su función Lambda

Para HealthLake poder invocar la función Lambda en su nombre, debe hacer lo siguiente:

  • Debe establecer un IdpLambdaArn valor igual al ARN de la función Lambda que desea HealthLake invocar en la solicitud. CreateFHIRDatastore

  • Necesita una política basada en recursos que le permita HealthLake invocar la función Lambda en su nombre.

Cuando HealthLake recibe una solicitud de la API REST de FHIR en un almacén de datos habilitado para SMART o FHIR, necesita permisos para invocar en su nombre la función Lambda especificada en la creación del almacén de datos. Para conceder el HealthLake acceso, utilizará una política basada en los recursos. Para obtener más información sobre cómo crear una política basada en recursos para una función de Lambda, consulte Permitir que un AWS servicio llame a una función de Lambda en la Guía para desarrolladores.AWS Lambda

Aprovisionamiento simultáneo para su función Lambda

importante

HealthLake requiere que el tiempo máximo de ejecución de la función Lambda sea inferior a un segundo (1000 milisegundos).

Si la función Lambda supera el límite de tiempo de ejecución, se produce una TimeOutexcepción.

Para evitar esta excepción, se recomienda configurar la simultaneidad aprovisionada. Mediante la asignación de la simultaneidad aprovisionada antes de un aumento en las invocaciones, puede asegurarse de que todas las solicitudes se atiendan mediante instancias inicializadas con una latencia baja. Para obtener más información sobre la configuración de la simultaneidad aprovisionada, consulte Configuración de la simultaneidad aprovisionada en la Guía para desarrolladores de Lambda

Para ver el tiempo medio de ejecución de la función Lambda en la actualidad, utilice la página de supervisión de la función Lambda en la consola de Lambda. De forma predeterminada, la consola Lambda proporciona un gráfico de duración que muestra la cantidad media, mínima y máxima de tiempo que el código de función dedica a procesar un evento. Para obtener más información sobre la supervisión de las funciones de Lambda, consulte Supervisión de las funciones en la consola de Lambda en la Guía para desarrolladores de Lambda.

Si ya ha aprovisionado la simultaneidad para la función de Lambda y desea supervisarla, consulte Supervisión de la simultaneidad en la Guía para desarrolladores de Lambda.