Usando para integrar seu provedor de identidade - AWS Transfer Family

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á.

Usando para integrar seu provedor de identidade

Este tópico descreve como usar uma AWS Lambda função para apoiar um método do API Gateway. Use essa opção se precisar de uma RESTful API para integrar seu provedor de identidade ou se quiser usá-la para aproveitar seus recursos AWS WAF para solicitações de bloqueio geográfico ou limitação de taxa.

Para a maioria dos casos de uso, a forma recomendada de configurar um provedor de identidade personalizado é usar Solução personalizada de provedor de identidade o.

Limitações ao usar um API Gateway para integrar seu provedor de identidade

  • Essa configuração não aceita domínios personalizados.

  • Essa configuração não é compatível com um URL privado do API Gateway.

Se precisar de um desses, é possível usar o Lambda como provedor de identidade, sem o API Gateway. Para obter detalhes, consulte Usando AWS Lambda para integrar seu provedor de identidade.

Autenticação usando um método do API Gateway

É possível criar um método API Gateway para ser usado como provedor de identidade para o Transfer Family. Essa abordagem fornece uma maneira altamente segura de criar e fornecer APIs. Com o API Gateway, você pode criar um endpoint HTTPS para que todas as operações de entrada da API sejam transmitidas com maior segurança. Para obter mais detalhes sobre o serviço do API Gateway, consulte o Guia do desenvolvedor do API Gateway.

O API Gateway oferece um método de autorização chamadoAWS_IAM, que fornece a mesma autenticação baseada em AWS Identity and Access Management (IAM) AWS usada internamente. Se você ativar a autenticação com AWS_IAM, somente chamadores com permissões explícitas para chamar uma API poderão acessar o método API Gateway dessa API.

Para usar o método do API Gateway como provedor de identidade personalizado para o Transfer Family, ative o IAM para o método do API Gateway. Como parte desse processo, você fornece um perfil do IAM com permissões para o Transfer Family usar seu gateway.

nota

Para melhorar a segurança, é possível configurar um firewall para aplicações Web. O AWS WAF é um firewall para aplicações Web que permite monitorar as solicitações HTTP e HTTPS que são encaminhadas ao Amazon API Gateway. Para obter detalhes, consulte Adicione um firewall da aplicação web.

Não habilite o armazenamento em cache do API Gateway

Não habilite o armazenamento em cache para seu método API Gateway ao usá-lo como um provedor de identidade personalizado para Transfer Family. O armazenamento em cache é impróprio e inválido para solicitações de autenticação porque:

  • Cada solicitação de autenticação é exclusiva e requer uma resposta ativa, não uma resposta em cache

  • O armazenamento em cache não oferece benefícios, pois o Transfer Family nunca envia solicitações duplicadas ou repetidas para o API Gateway.

  • A ativação do armazenamento em cache fará com que o API Gateway responda com dados incompatíveis, resultando em respostas inválidas às solicitações de autenticação

Para usar seu método API Gateway para autenticação personalizada com o Transfer Family
  1. Crie uma CloudFormation pilha. Para fazer isso:

    nota

    Os modelos de pilha foram atualizados para usar senhas BASE64 codificadas: para obter detalhes, consulte. Melhorias nos CloudFormation modelos

    1. Abra o CloudFormation console em https://console.aws.amazon.com/cloudformation.

    2. Siga as instruções para implantar uma CloudFormation pilha a partir de um modelo existente em Seleção de um modelo de pilha no Guia do AWS CloudFormation usuário.

    3. Use um dos modelos básicos a seguir para criar um método API Gateway suportado por AWS Lambda para uso como provedor de identidade personalizado no Transfer Family.

      • Modelo básico de pilha

        Por padrão, seu método API Gateway é usado como um provedor de identidade personalizado para autenticar um único usuário em um único servidor usando uma chave ou senha SSH (Secure Shell) codificada. Após a implantação, é possível modificar o código da função do Lambda para fazer algo diferente.

      • AWS Secrets Manager modelo de pilha

        Por padrão, seu método API Gateway é autenticado em uma entrada no Secrets Manager do formato aws/transfer/server-id/username. Além disso, o segredo deve conter os pares de valores-chave de todas as propriedades do usuário retornadas ao Transfer Family. Após a implantação, é possível modificar o código da função do Lambda para fazer algo diferente. Para obter mais informações, consulte a postagem do blog Habilitar a autenticação por senha para AWS Transfer Family uso AWS Secrets Manager.

      • Modelo de pilha Okta

        Seu método API Gateway se integra ao Okta como um provedor de identidade personalizado no Transfer Family. Para obter mais informações, consulte a postagem de blog Usar o Okta como provedor de identidade com AWS Transfer Family.

    A implantação de uma dessas pilhas é a maneira mais fácil de integrar um provedor de identidade personalizado ao fluxo de trabalho do Transfer Family. Cada pilha usa a função do Lambda para oferecer suporte ao seu método de API com base no API Gateway. Em seguida, é possível usar seu método de API como um provedor de identidade personalizado no Transfer Family. Por padrão, a função do Lambda autentica um único usuário chamado myuser com uma senha de MySuperSecretPassword. Após a implantação, é possível editar essas credenciais ou atualizar o código da função do Lambda para fazer algo diferente.

    Importante

    Recomendamos que você edite as credenciais padrão de usuário e senha.

    Depois que a pilha for implantada, você poderá ver detalhes sobre ela na guia Saídas no console. CloudFormation Esses detalhes incluem o nome do recurso da Amazon (ARN) da pilha, o ARN do perfil do IAM que a pilha criou e o URL do seu novo gateway.

    nota

    Se você estiver usando a opção de provedor de identidade personalizado para habilitar a autenticação baseada em senha para seus usuários e ativar o registro de solicitações e respostas fornecido pelo API Gateway, o API Gateway registrará as senhas dos seus usuários no Amazon Logs. CloudWatch Não recomendamos usar esse log em seu ambiente de produção. Para obter mais informações, consulte Configurar o registro de CloudWatch API no API Gateway no Guia do desenvolvedor do API Gateway.

  2. Verifique a configuração do método API Gateway para seu servidor. Para fazer isso:

    1. Abra o console do API Gateway em https://console.aws.amazon.com/apigateway/.

    2. Escolha a API de modelo básico do Transfer Custom Identity Provider que o CloudFormation modelo gerou. Talvez seja necessário selecionar sua região para ver seus gateways.

    3. No painel Recursos, escolha OBTER. A captura de tela a seguir mostra a configuração correta do método.

      Detalhes da configuração da API, mostrando os parâmetros de configuração do método para os caminhos de solicitação e para a string de consulta de URL.

    Neste ponto, seu API gateway está pronto para ser implantado.

  3. Escolha Ações e Implantar API. Para o Estágio de implantação, escolha prod e Implantar.

    Depois que o método API Gateway for implantado com sucesso, veja seu desempenho em Estágios > Detalhes do estágio, conforme mostrado na captura de tela a seguir.

    nota

    Copie o endereço do URL de invocação que aparece na parte superior da tela. Talvez você precise dele para a próxima etapa.

    Detalhes do estágio com o URL Invoke destacado.
  4. Abra o AWS Transfer Family console em https://console.aws.amazon.com/transfer/.

  5. Uma Transfer Family deveria ter sido criada para você quando você criou a pilha. Caso contrário, configure seu servidor usando essas etapas.

    1. Escolha Criar servidor para abrir a página Criar servidor. Em Escolher um provedor de identidade, escolha Personalizado e, em seguida, selecione Usar Amazon API Gateway para se conectar ao seu provedor de identidade, conforme mostrado na captura de tela a seguir.

      A tela do provedor de identidade com o provedor de identidade personalizado selecionado e com o API Gateway escolhido para se conectar ao seu provedor de identidade.
    2. Na caixa de texto Fornecer um URL do Amazon API Gateway, cole o endereço do URL de invocação do endpoint do API Gateway que você criou na etapa 3 deste procedimento.

    3. Em Role, escolha a função do IAM que foi criada pelo CloudFormation modelo. Essa função permite que o Transfer Family invoque seu método de gateway de API.

      A função de invocação contém o nome da CloudFormation pilha que você selecionou para a pilha que você criou na etapa 1. Tem o seguinte formato: CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI.

    4. Preencha as caixas restantes e escolha Criar servidor. Para obter detalhes sobre as etapas restantes para criar um servidor, consulte Configurando um endpoint de servidor SFTP, FTPS ou FTP.

Implementar seu método do API Gateway

Para criar um provedor de identidade personalizado para o Transfer Family, seu método API Gateway deve implementar um único método que tenha um caminho de recurso de /servers/serverId/users/username/config. Os username valores serverId e vêm do caminho RESTful dos recursos. Além disso, adicione sourceIp e protocol como Parâmetros de sequência de caracteres de consulta do URL na solicitação de método, conforme mostrado na imagem a seguir.

A tela de recursos do API Gateway mostrando os detalhes do GET método.
nota

O nome de usuário deve ter no mínimo 3 e no máximo 100 caracteres. Você pode usar os seguintes caracteres no nome de usuário: a—z, A-Z, 0—9, sublinhado '_', hífen '-', ponto '.' e sinal de arroba '@'. O nome de usuário não pode começar com um hífen '-', ponto '.' ou com o sinal '@'.

Se o Transfer Family tentar uma autenticação de senha para o usuário, o serviço fornecerá um campo de cabeçalho Password:. Na ausência de um cabeçalho Password:, o Transfer Family tenta a autenticação por chave pública para autenticar seu usuário.

Ao usar um provedor de identidade para autenticar e autorizar usuários finais, além de validar suas credenciais, é possível permitir ou negar solicitações de acesso com base nos endereços IP dos clientes usados por seus usuários finais. É possível usar esse atributo para garantir que os dados armazenados em seus buckets do S3 ou em seu sistema de arquivos Amazon EFS possam ser acessados por meio dos protocolos suportados somente a partir de endereços IP que você especificou como confiáveis. Para ativar esse atributo, você deve incluir sourceIp na sequência de caracteres de consulta.

Se você tiver vários protocolos habilitados para seu servidor, e quiser fornecer acesso usando o mesmo nome de usuário em vários protocolos, poderá fazer isso desde que as credenciais específicas para cada protocolo tenham sido configuradas no seu provedor de identidade. Para habilitar esse recurso, você deve incluir o protocol valor no caminho do RESTful recurso.

Seu método do API Gateway deve sempre retornar o código de status HTTP 200. Qualquer outro código de status HTTP indica um erro ao acessar a API.

Resposta de exemplo do Amazon S3

O corpo de resposta do exemplo é um documento JSON do seguinte formato para o Amazon S3.

{ "Role": "IAM role with configured S3 permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "Policy": "STS Assume role session policy", "HomeDirectory": "/amzn-s3-demo-bucket/path/to/home/directory" }
nota

A política tem um JSON de escape como uma string. Por exemplo:

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::amzn-s3-demo-bucket\", \"Action\": \"s3:ListBucket\", \"Effect\": \"Allow\", \"Sid\": \"ListHomeDir\"}, {\"Resource\": \"arn:aws:s3:::*\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObjectVersion\", \"s3:DeleteObject\", \"s3:GetObjectVersion\", \"s3:GetObjectACL\", \"s3:PutObjectACL\"], \"Effect\": \"Allow\", \"Sid\": \"HomeDirObjectAccess\"}] }"

O exemplo de resposta a seguir mostra que um usuário tem um tipo de diretório inicial lógico.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3", "HomeDirectoryType":"LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/amzn-s3-demo-bucket1\"}]", "PublicKeys":[""] }
Exemplo de resposta do Amazon EFS

O corpo de resposta do exemplo é um documento JSON do seguinte formato para o Amazon EFS.

{ "Role": "IAM role with configured EFS permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "PosixProfile": { "Uid": "POSIX user ID", "Gid": "POSIX group ID", "SecondaryGids": [Optional list of secondary Group IDs], }, "HomeDirectory": "/fs-id/path/to/home/directory" }

O campo Role indica que ocorreu uma autenticação bem-sucedida. Ao fazer a autenticação por senha (quando você fornece um cabeçalho Password:), você não precisa fornecer chaves públicas SSH. Se um usuário não puder ser autenticado, por exemplo, se a senha estiver incorreta, seu método deverá retornar uma resposta sem um Role definido. Um exemplo dessa resposta é um objeto JSON vazio.

O exemplo de resposta a seguir mostra um usuário que tem um tipo de diretório inicial lógico.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs", "HomeDirectoryType": "LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]", "PublicKeys":[""], "PosixProfile":{"Uid":65534,"Gid":65534} }

É possível incluir políticas de usuário na função do Lambda no formato JSON. Para obter mais informações sobre a configuração de políticas de usuário no Transfer Family, consulte Gerenciar controles de acesso.

Função do Lambda padrão

Para implementar diferentes estratégias de autenticação, edite a função do Lambda que seu gateway usa. Para ajudá-lo a atender às necessidades do seu aplicativo, é possível usar os seguintes exemplos de funções do Lambda em Node.js. Para obter mais informações sobre o Lambda, consulte Guia do desenvolvedor do AWS Lambda ou Como criar funções do Lambda com Node.js.

O exemplo a seguir da função do Lambda usa seu nome de usuário, senha (se você estiver executando a autenticação por senha), ID do servidor, protocolo e endereço IP do cliente. É possível usar uma combinação dessas entradas para pesquisar seu provedor de identidade e determinar se o login deve ser aceito.

nota

Se você tiver vários protocolos habilitados para seu servidor e quiser fornecer acesso usando o mesmo nome de usuário em vários protocolos, poderá fazer isso desde que as credenciais específicas do protocolo tenham sido configuradas no seu provedor de identidade.

Para File Transfer Protocol (FTP), recomendamos manter credenciais separadas do Secure Shell (SFTP) e File Transfer Protocol (SFTP) e File Transfer Protocol (FTP). Recomendamos manter credenciais separadas para o FTP porque, diferentemente do SFTP e do FTPS, o FTP transmite as credenciais em texto não criptografado. Ao isolar as credenciais de FTP do SFTP ou FTPS, se as credenciais de FTP forem compartilhadas ou expostas, suas cargas de trabalho usando SFTP ou FTPS permanecerão seguras.

Essa função de exemplo retorna a função e os detalhes do diretório inicial lógico, junto com as chaves públicas (se ela realizar a autenticação por chave pública).

Ao criar usuários gerenciados por serviços, você define o diretório inicial, lógico ou físico. Da mesma forma, precisamos dos resultados da função do Lambda para transmitir a estrutura de diretórios física ou lógica desejada pelo usuário. Os parâmetros definidos dependem do valor do campo HomeDirectoryType.

  • HomeDirectoryType definido como PATH — o HomeDirectory campo deve então ser um prefixo absoluto do bucket do Amazon S3 ou um caminho absoluto do Amazon EFS que seja visível para seus usuários.

  • HomeDirectoryType definido como LOGICALNão defina um campo HomeDirectory. Em vez disso, definimos um HomeDirectoryDetails campo que fornece os Entry/Target mapeamentos desejados, semelhantes aos valores descritos no HomeDirectoryDetailsparâmetro para usuários gerenciados por serviços.

As funções de exemplo estão listadas em Exemplo de funções do Lambda.

Função Lambda para uso com AWS Secrets Manager

Para usar AWS Secrets Manager como seu provedor de identidade, você pode trabalhar com a função Lambda no modelo de amostra CloudFormation . A função do Lambda consulta o serviço Secrets Manager com suas credenciais e, se for bem-sucedida, retorna um segredo designado. Para ter mais informações sobre o Secrets Manager, consulte o Guia do usuário do AWS Secrets Manager.

Para baixar um CloudFormation modelo de amostra que usa essa função Lambda, acesse o bucket do Amazon S3 fornecido pela. AWS Transfer Family

Melhorias nos CloudFormation modelos

Foram feitas melhorias na interface do API Gateway nos CloudFormation modelos publicados. Os modelos agora usam senhas BASE64 codificadas com o API Gateway. Suas implantações existentes continuam funcionando sem esse aprimoramento, mas não permitem senhas com caracteres fora do conjunto básico de caracteres US-ASCII.

As alterações no modelo que habilitam esse recurso são as seguintes:

  • O GetUserConfigRequest AWS::ApiGateway::Method recurso precisa ter esse RequestTemplates código (a linha em itálico é a linha atualizada)

    RequestTemplates: application/json: | { "username": "$util.urlDecode($input.params('username'))", "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")", "protocol": "$input.params('protocol')", "serverId": "$input.params('serverId')", "sourceIp": "$input.params('sourceIp')" }
  • O RequestParameters formulário do GetUserConfig recurso deve ser alterado para usar o PasswordBase64 cabeçalho (a linha em itálico é a linha atualizada):

    RequestParameters: method.request.header.PasswordBase64: false method.request.querystring.protocol: false method.request.querystring.sourceIp: false
Para verificar se o modelo da sua pilha é o mais recente
  1. Abra o CloudFormation console em https://console.aws.amazon.com/cloudformation.

  2. Na lista de pilhas, escolha sua pilha.

  3. No painel de detalhes, escolha a guia Modelo.

  4. Procure o seguinte:

    • Pesquise RequestTemplates e verifique se você tem esta linha:

      "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
    • Pesquise RequestParameters e verifique se você tem esta linha:

      method.request.header.PasswordBase64: false

Se você não vê as linhas atualizadas, edite sua pilha. Para obter detalhes sobre como atualizar sua CloudFormation pilha, consulte Modificar um modelo de pilha no AWS CloudFormation; Guia do usuário.