Validação de token usando AWS Lambda - AWS HealthLake

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Validação de token usando AWS Lambda

Ao criar um HealthLake SMART no armazenamento de dados habilitado para FHIR, você deve fornecer o ARN da AWS Lambda função na solicitação. CreateFHIRDatastore O ARN da função Lambda é especificado no IdentityProviderConfiguration objeto usando o parâmetro. IdpLambdaArn

Você deve criar a função Lambda antes de criar seu SMART no armazenamento de dados habilitado para FHIR. Depois de criar o armazenamento de dados, o ARN do Lambda não pode ser alterado. Para ver o ARN do Lambda que você especificou quando o armazenamento de dados foi criado, use a ação da API. DescribeFHIRDatastore

Para que uma solicitação FHIR REST seja bem-sucedida em um armazenamento de dados SMART no FHIR ativado, sua função Lambda deve fazer o seguinte:
  • Retorne uma resposta em menos de 1 segundo para o endpoint do armazenamento de HealthLake dados.

  • Decodifique o token de acesso fornecido no cabeçalho de autorização da solicitação da API REST enviada pelo aplicativo cliente.

  • Atribua uma função de serviço do IAM que tenha permissões suficientes para realizar a solicitação da API FHIR REST.

  • As declarações a seguir são necessárias para concluir uma solicitação da API FHIR REST. Para saber mais, consulte Declarações exigidas.

    • nbf

    • exp

    • isAuthorized

    • aud

    • scope

Ao trabalhar com o Lambda, você precisa criar uma função de execução e uma política baseada em recursos, além da sua função Lambda. A função de execução de uma função do Lambda é uma função do IAM que concede à função permissão para acessar os serviços e recursos da AWS necessários em tempo de execução. A política baseada em recursos que você fornece deve permitir HealthLake invocar sua função em seu nome.

As seções deste tópico descrevem um exemplo de solicitação de um aplicativo cliente e uma resposta decodificada, as etapas necessárias para criar uma função AWS Lambda e como criar uma política baseada em recursos que possa assumir. HealthLake

Criação de uma função AWS Lambda

A função Lambda criada neste tópico é acionada quando HealthLake recebe uma solicitação para um SMART no armazenamento de dados habilitado para FHIR. A solicitação do aplicativo cliente contém uma chamada à API REST e um cabeçalho de autorização contendo um token de acesso.

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

O exemplo da função Lambda neste tópico é usado AWS Secrets Manager para obscurecer as credenciais relacionadas ao servidor de autorização. É altamente recomendável não fornecer detalhes de login do servidor de autorização diretamente em uma função Lambda.

exemplo validando uma solicitação FHIR REST contendo um token do portador da autorização

O exemplo da função Lambda mostra como validar uma solicitação FHIR REST enviada para um SMART no armazenamento de dados habilitado para FHIR. Para ver step-by-steps instruções sobre como implementar essa função Lambda, consulte. Criando uma função Lambda usando o AWS Management Console

Se a solicitação da API FHIR REST não contiver um endpoint de armazenamento de dados, token de acesso e operação REST válidos, a função Lambda falhará. Para saber mais sobre os elementos necessários do servidor de autorização, consulteDeclarações exigidas.

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()

O procedimento a seguir pressupõe que você já tenha criado a função de serviço que deseja assumir HealthLake ao lidar com uma solicitação da API REST FHIR em um armazenamento de dados SMART no FHIR habilitado. Se você não criou a função de serviço, ainda pode criar a função Lambda. Você deve adicionar o ARN da função de serviço antes que a função Lambda funcione. Para saber mais sobre como criar uma função de serviço e especificá-la na função Lambda, consulte Criação de uma função HealthLake de serviço para uso na função AWS Lambda usada para decodificar um JWT

Para criar uma função Lambda ()AWS Management Console
  1. Abra a página Funções do console do Lambda.

  2. Escolha a opção Criar função.

  3. Selecione Criar do zero.

  4. Em Informações básicas, insira um nome de função. Em Tempo de execução, escolha um tempo de execução baseado em python.

  5. Em Execution role (Perfil de execução), escolha Create a new role with basic Lambda permissions (Criar um novo perfil com as permissões básicas do Lambda).

    O Lambda cria uma função de execução que concede à função permissão para fazer upload de registros para a Amazon. CloudWatch A função Lambda assume a função de execução quando você invoca sua função e usa a função de execução para criar credenciais para o SDK. AWS

  6. Escolha a guia Código e adicione o exemplo da função Lambda.

    Se você ainda não criou a função de serviço para usar a função Lambda, precisará criá-la antes que a função de amostra do Lambda funcione. Para saber mais sobre a criação de uma função de serviço para a função Lambda, consulte. Criação de uma função HealthLake de serviço para uso na função AWS Lambda usada para decodificar um 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()

Modificando a função de execução de uma função Lambda

Depois de criar a função Lambda, você precisa atualizar a função de execução para incluir as permissões necessárias para chamar o Secrets Manager. No Secrets Manager, cada segredo que você cria tem um ARN. Para aplicar o menor privilégio, a função de execução só deve ter acesso aos recursos necessários para a execução da função Lambda.

Você pode modificar a função de execução de uma função Lambda pesquisando-a no console do IAM ou escolhendo Configuração no console Lambda. Para saber mais sobre como gerenciar sua função de execução de funções Lambda, consulte. Função de execução do Lambda

exemplo Função de execução da função Lambda que concede acesso a GetSecretValue

Adicionar a ação do IAM GetSecretValue à função de execução concede a permissão necessária para que a função de amostra do Lambda funcione.

Neste ponto, você criou uma função Lambda que pode ser usada para validar o token de acesso fornecido como parte da solicitação FHIR REST enviada ao seu SMART no armazenamento de dados habilitado para FHIR.

Criação de uma função HealthLake de serviço para uso na função AWS Lambda usada para decodificar um JWT

Persona: administrador do IAM

Um usuário que pode adicionar ou remover políticas do IAM e criar novas identidades do IAM.

Perfil de serviço

O perfil de serviço é um perfil do IAM que um serviço assume para executar ações em seu nome. Um administrador do IAM pode criar, modificar e excluir um perfil de serviço do IAM. Para obter mais informações, consulte Criar um perfil para delegar permissões a um AWS service (Serviço da AWS) no Guia do Usuário do IAM.

Depois que o JSON Web Token (JWT) é decodificado, a autorização Lambda também precisa retornar um ARN de função do IAM. Essa função deve ter as permissões necessárias para realizar a solicitação da API REST ou falhará devido a permissões insuficientes.

Ao configurar uma política personalizada usando o IAM, é melhor conceder as permissões mínimas necessárias. Para saber mais, consulte Aplicar permissões de privilégios mínimos no Guia do usuário do IAM.

A criação HealthLake de uma função de serviço para designar na função Lambda de autorização requer duas etapas.

  • Primeiro, você precisa criar uma política do IAM. A política deve especificar o acesso aos recursos do FHIR para os quais você forneceu escopos no servidor de autorização.

  • Em segundo lugar, você precisa criar a função de serviço. Ao criar a função, você designa uma relação de confiança e anexa a política criada na etapa um. A relação de confiança é designada HealthLake como principal do serviço. Você precisa especificar um ARN do armazenamento de HealthLake dados e uma ID de AWS conta nesta etapa.

Criação de uma nova política do IAM

Os escopos que você define em seu servidor de autorização determinam a quais recursos FHIR um usuário autenticado tem acesso em um armazenamento de dados. HealthLake

A política do IAM que você cria pode ser personalizada para corresponder aos escopos que você definiu.

As ações a seguir no Action elemento de uma declaração de política do IAM podem ser definidas. Para cada um Action na tabela, você pode definir umResource types. Em HealthLake um armazenamento de dados, é o único tipo de recurso compatível que pode ser definido no Resource elemento de uma declaração de política de permissão do IAM.

Os recursos individuais do FHIR não são um recurso que você possa definir como um elemento em uma política de permissão do IAM.

Ações definidas por HealthLake
Ações Descrição Nível de acesso Tipo de recurso (obrigatório)

CreateResource

Concede permissão a um recurso de criação

Gravar ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
DeleteResource

Concede permissão para excluir um recurso

Gravar ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
ReadResource

Concede permissão para ler um recurso

Leitura ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithGet

Concede permissão para pesquisar recursos com o método GET

Leitura ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithPost Concede permissão para pesquisar recursos com o método POST Leitura ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
Iniciar FHIRExport JobWithPost

Concede permissão para iniciar um trabalho de exportação FHIR com GET

Gravar ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id
UpdateResource

Concede permissão para atualizar um recurso

Gravar ARN do armazenamento de dados: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id

Para começar, você pode usarAmazonHealthLakeFullAccess. Essa política permitiria leitura, gravação, pesquisa e exportação em todos os recursos do FHIR encontrados em um armazenamento de dados. Para conceder permissões somente de leitura em um armazenamento de dados, use. AmazonHealthLakeReadOnlyAccess

Para saber mais sobre como criar uma política personalizada usando o AWS Management Console, AWS CLI, ou IAM SDKs, consulte Como criar políticas do IAM no Guia do usuário do IAM.

Criação de uma função de serviço para HealthLake (console do IAM)

Use esse procedimento para criar uma função de serviço. Ao criar um serviço, você também precisará designar uma política do IAM.

Para criar a função de serviço para HealthLake (console do IAM)
  1. Faça login no AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação do console do IAM, escolha Perfis.

  3. Depois, escolha Create role (Criar perfil).

  4. Na página Selecionar entidade confiável, escolha Política de confiança personalizada.

  5. Em seguida, em Política de confiança personalizada, atualize a política de amostra da seguinte forma. your-account-idSubstitua pelo número da sua conta e adicione o ARN do armazenamento de dados que você deseja usar em seus trabalhos de importação ou exportação.

  6. Em seguida, escolha Next (Próximo).

  7. Na página Adicionar permissões, escolha a política que você deseja que o HealthLake serviço assuma. Para encontrar sua política, procure-a em Políticas de permissões.

  8. Em seguida, escolha Anexar política.

  9. Em seguida, na página Nome, revise e crie, em Nome da função, insira um nome.

  10. (Opcional) Em Descrição, adicione uma breve descrição da sua função.

  11. Se possível, insira um nome de função ou sufixo de nome de função para ajudar a identificar o propósito desta função. Os nomes de função devem ser exclusivos em sua Conta da AWS. Eles não são diferenciados por letras maiúsculas e minúsculas. Por exemplo, não é possível criar perfis denominados PRODROLE e prodrole. Como várias entidades podem fazer referência à função, não é possível editar o nome da função depois que ela é criada.

  12. Revise os detalhes da função e escolha Criar função.

Para saber como especificar o ARN da função no exemplo da função Lambda, consulte. Criação de uma função AWS Lambda

Função de execução do Lambda

A função de execução de uma função Lambda é uma função do IAM que concede à função permissão para acessar AWS serviços e recursos. Esta página fornece informações sobre como criar, visualizar e gerenciar o perfil de execução de uma função do Lambda.

Por padrão, o Lambda cria uma função de execução com permissões mínimas quando você cria uma nova função do Lambda usando o. AWS Management Console Para gerenciar as permissões concedidas na função de execução, consulte Criação de uma função de execução no console do IAM no Lambda Developer Guide.

O exemplo da função Lambda fornecido neste tópico usa o Secrets Manager para ocultar as credenciais do servidor de autorização.

Como acontece com qualquer função do IAM que você criar, é importante seguir as melhores práticas de privilégios mínimos. Durante a frase de desenvolvimento, às vezes você pode conceder permissões além do necessário. Antes de publicar sua função no ambiente de produção, como prática recomendada, ajuste a política para incluir somente as permissões necessárias. Para obter mais informações, consulte Aplicar o menor privilégio no Guia do usuário do IAM.

Permitir HealthLake acionar sua função Lambda

Para que HealthLake possa invocar a função Lambda em seu nome, você deve fazer o seguinte:

  • Você precisa definir IdpLambdaArn igual ao ARN da função Lambda que você deseja HealthLake invocar na solicitação. CreateFHIRDatastore

  • Você precisa de uma política baseada em recursos que permita HealthLake invocar a função Lambda em seu nome.

Quando HealthLake recebe uma solicitação da API REST FHIR em um armazenamento de dados SMART no FHIR ativado, ele precisa de permissões para invocar a função Lambda especificada na criação do armazenamento de dados em seu nome. Para conceder HealthLake acesso, você usará uma política baseada em recursos. Para saber mais sobre a criação de uma política baseada em recursos para uma função do Lambda, consulte Permitir que um AWS serviço chame uma função do Lambda no Guia do desenvolvedor.AWS Lambda

Provisionando a simultaneidade para sua função Lambda

Importante

HealthLake exige que o tempo máximo de execução da função Lambda seja inferior a um segundo (1000 milissegundos).

Se sua função Lambda exceder o limite de tempo de execução, você receberá uma TimeOutexceção.

Para evitar essa exceção, recomendamos configurar a simultaneidade provisionada. Ao alocar simultaneidade provisionada antes de um aumento nas invocações, é possível garantir que todas as solicitações sejam atendidas por instâncias inicializadas com latência baixa. Para saber mais sobre como configurar a simultaneidade provisionada, consulte Como configurar a simultaneidade provisionada no Lambda Developer Guide

Para ver o tempo médio de execução de sua função Lambda atualmente, use a página de monitoramento de sua função Lambda no console Lambda. Por padrão, o console Lambda fornece um gráfico de duração que mostra a quantidade média, mínima e máxima de tempo que seu código de função gasta processando um evento. Para saber mais sobre o monitoramento das funções do Lambda, consulte Funções de monitoramento no console do Lambda no Guia do desenvolvedor do Lambda.

Se você já provisionou a simultaneidade para sua função do Lambda e deseja monitorá-la, consulte Monitoramento da simultaneidade no Guia do desenvolvedor do Lambda.