Uso de Amazon API Gateway para integrar su proveedor de identidad - AWS Transfer Family

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.

Uso de Amazon API Gateway para integrar su proveedor de identidad

En este tema se describe cómo utilizar una AWS Lambda función para respaldar un método de API Gateway. Utilice esta opción si necesita una API RESTful para integrar su proveedor de identidad o si desea AWS WAF utilizarla para aprovechar sus capacidades para el bloqueo geográfico o las solicitudes de limitación de velocidad.

Limitaciones si utiliza una API Gateway para integrar su proveedor de identidad

  • Esta configuración no admite dominios personalizados.

  • Esta configuración no admite una URL de API Gateway privada.

Si necesita alguna de estas opciones, puede usar Lambda como proveedor de identidades, sin API Gateway. Para obtener más detalles, consulte Se utiliza AWS Lambda para integrar su proveedor de identidad.

Autenticación mediante un método de API Gateway

Puede crear un método API Gateway para usarlo como proveedor de identidad para Transfer Family. Este enfoque proporciona una forma muy segura de crear y proporcionar API. Con API Gateway, puede crear un punto de conexión HTTPS para que todas las llamadas a la API entrantes se transmitan con mayor seguridad. Para obtener más información sobre el servicio API Gateway, consulte la Guía para desarrolladores de API Gateway.

API Gateway ofrece un método de autorización denominadoAWS_IAM, que le proporciona la misma autenticación basada en AWS Identity and Access Management (IAM) que se AWS utiliza internamente. Si habilita la autenticación con AWS_IAM, solo las personas que llaman con permisos explícitos para llamar a una API pueden acceder al método API Gateway de esa API.

Para usar su método API Gateway como proveedor de identidad personalizado para Transfer Family, habilita IAM para su método API Gateway. Como parte de este proceso, usted proporciona un rol de IAM con permisos para que Transfer Family utilice su puerta de enlace.

nota

Para mejorar la seguridad, puede configurar un firewall de aplicaciones web. AWS WAF es un firewall de aplicaciones web que permite monitorizar las solicitudes HTTP y HTTPS que se reenvían a una Amazon API Gateway. Para obtener más detalles, consulte Agregue un cortafuegos de aplicaciones web.

Uso del método API Gateway para la autenticación personalizada con Transfer Family
  1. Crea una AWS CloudFormation pila. Para ello:

    nota

    Las plantillas de pila se han actualizado para utilizar contraseñas codificadas en Base64: para obtener más información, consulte. Mejoras en las plantillas AWS CloudFormation

    1. Abra la AWS CloudFormation consola en https://console.aws.amazon.com/cloudformation.

    2. Siga las instrucciones para implementar una AWS CloudFormation pila a partir de una plantilla existente en Seleccionar una plantilla de pila en la Guía del AWS CloudFormation usuario.

    3. Usa una de las siguientes plantillas básicas para crear un método API Gateway AWS Lambda respaldado por API para usarlo como proveedor de identidad personalizado en Transfer Family.

    Implementar una de estas pilas es la forma más sencilla de integrar un proveedor de identidades personalizado en el flujo de trabajo de Transfer Family. Cada pila utiliza la función de Lambda para admitir su método de API basado en API Gateway. A continuación, puede usar su método de API como proveedor de identidad personalizado en Transfer Family. De forma predeterminada, la función de Lambda autentica a un único usuario llamado myuser con una contraseña de MySuperSecretPassword. Tras la implementación, puede editar estas credenciales o actualizar el código de la función de Lambda para hacer algo diferente.

    importante

    Le recomendamos que edite las credenciales de usuario y contraseña predeterminadas.

    Una vez desplegada la pila, puede ver sus detalles en la pestaña Salidas de la CloudFormation consola. Estos detalles incluyen el nombre de recurso de Amazon (ARN) de la pila, el ARN del rol de IAM que creó la pila y la URL de su nueva puerta de enlace.

    nota

    Si utiliza la opción de proveedor de identidad personalizado para habilitar la autenticación basada en contraseñas para sus usuarios y habilita el registro de solicitudes y respuestas que proporciona API Gateway, API Gateway registra las contraseñas de sus usuarios en sus Amazon Logs. CloudWatch No recomendamos utilizar este modo de inicio en entornos de producción. Para obtener más información, consulte Configurar el registro de CloudWatch API en API Gateway en la Guía para desarrolladores de API Gateway.

  2. Compruebe la configuración del método API Gateway para su servidor. Para ello:

    1. Abra la consola de API Gateway en https://console.aws.amazon.com/apigateway/.

    2. Elija la API de plantilla básica Transfer Custom Identity Provider que generó la AWS CloudFormation plantilla. Puede que tengas que seleccionar tu región para ver las pasarelas.

    3. En el panel Recursos, selecciona GET. La siguiente captura de pantalla muestra la configuración correcta del método.

      Detalles de la configuración de la API, que muestran los parámetros de configuración del método para las rutas de solicitud y para la cadena de consulta URL.

    En este punto, su API Gateway está lista para ser implementada.

  3. Para Acciones, elija Implementar API. Para la Etapa de implementación, elija prod y, a continuación, elija Implementar.

    Una vez que el método API Gateway se haya implementado correctamente, consulta su rendimiento en Stages > Stage details, como se muestra en la siguiente captura de pantalla.

    nota

    Copie la dirección URL de invocación que aparece en la parte superior de la pantalla. Puede que lo necesites para el siguiente paso.

    Detalles del escenario con la URL de invocación resaltada.
  4. Abra la AWS Transfer Family consola en https://console.aws.amazon.com/transfer/.

  5. Se debería haber creado una Transfer Family para ti cuando creaste la pila. Si no es así, configure su servidor siguiendo estos pasos.

    1. Seleccione Crear servidor para abrir la página Crear servidor. En Elija un proveedor de identidad, seleccione Personalizado y, a continuación, seleccione Usar Amazon API Gateway para conectarse con su proveedor de identidad, como se muestra en la siguiente captura de pantalla.

      La pantalla del proveedor de identidad con el proveedor de identidad personalizado seleccionado y la API Gateway elegida para conectarse a su proveedor de identidad.
    2. En el cuadro de texto Proporcionar una URL de Amazon API Gateway, pegue la dirección URL de invocación del punto de conexión de API Gateway que creó en el paso 3 de este procedimiento.

    3. En Función, elige la función de IAM que creó la AWS CloudFormation plantilla. Este rol permite a Transfer Family invocar su método de puerta de enlace de API.

      El rol de invocación contiene el nombre de la AWS CloudFormation pila que seleccionó para la pila que creó en el paso 1. Tiene el formato siguiente: CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI.

    4. Rellene las casillas restantes y, a continuación, seleccione Crear servidor. Para obtener más información sobre los pasos restantes para crear un servidor, consulte Configuración de un punto final de servidor SFTP, FTPS o FTP.

Implementación de su método de API Gateway

Para crear un proveedor de identidades personalizado para Transfer Family, el método API Gateway debe implementar un único método que tenga una ruta de recursos de /servers/serverId/users/username/config. Los valores de serverId y username proceden de la ruta de recurso RESTful. Además, añada sourceIp y protocol como Parámetros de cadena de consulta de URL en la Solicitud de método, como se muestra en la imagen siguiente.

La pantalla de recursos de la API Gateway que muestra los detalles del GET método.
nota

El nombre de usuario debe tener un mínimo de 3 y un máximo de 100 caracteres. El nombre de usuario puede contener los siguientes caracteres: a-z, A-Z, 0-9, guion bajo (_) y guion (-), punto (.), y el signo de arroba (@). Sin embargo, el nombre de usuario no puede comenzar por un guion (-), un punto (.), ni una arroba (@).

Si Transfer Family intenta autenticar una contraseña en nombre de un usuario, el servicio proporciona un campo de encabezado Password:. En ausencia de un encabezado de Password:, Transfer Family intenta la autenticación con clave pública para autenticar al usuario.

Si utiliza un proveedor de identidad para autenticar y autorizar a los usuarios finales, además de validar sus credenciales, puede permitir o denegar las solicitudes de acceso en función de las direcciones IP de los clientes utilizados por los usuarios finales. Puede usar esta característica para asegurarse de que solo se pueda acceder a los datos almacenados en sus buckets de S3 o en su sistema de archivos Amazon EFS a través de los protocolos compatibles desde las direcciones IP que haya especificado como confiables. Para habilitar esta característica, debe incluir sourceIp en la cadena de consulta.

Si tiene varios protocolos habilitados para su servidor y desea proporcionar acceso con el mismo nombre de usuario a través de varios protocolos, puede hacerlo siempre que las credenciales específicas de cada protocolo estén configuradas en su proveedor de identidad. Para habilitar esta característica, debe incluir el valor protocol en la ruta de recursos RESTful.

El método API Gateway siempre debe devolver el código de estado HTTP 200. Cualquier otro código de estado HTTP significa que se ha producido un error en el acceso a la API.

Ejemplo de respuesta de Amazon S3

El cuerpo de la respuesta de ejemplo es un documento JSON del siguiente formato para 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": "/DOC-EXAMPLE-BUCKET/path/to/home/directory" }
nota

La política es un JSON de escape en forma de cadena. Por ejemplo:

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::DOC-EXAMPLE-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\"}] }"

El siguiente ejemplo de respuesta muestra que un usuario tiene un tipo de directorio de inicio lógico.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3", "HomeDirectoryType":"LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/DOC-EXAMPLE-BUCKET1\"}]", "PublicKeys":[""] }
Ejemplo de respuesta de Amazon EFS

El cuerpo de la respuesta de ejemplo es un documento JSON del siguiente formato para 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" }

El campo Role indica que la autenticación ha tenido éxito. Al realizar la autenticación con contraseña (cuando se proporciona un encabezado de Password:), no es necesario que proporcione las claves públicas de SSH. Si un usuario no se puede autenticar, por ejemplo, si la contraseña es incorrecta, su método debería devolver una respuesta de Role sin configurar. Un ejemplo de esta respuesta es un objeto JSON vacío.

El siguiente ejemplo de respuesta muestra un usuario que tiene un tipo de directorio de inicio lógico.

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

Puede incluir políticas de usuario en la función de Lambda en formato JSON. Para obtener más información acerca de la configuración de usuario en Transfer Family, consulte Administrar los controles de acceso.

Función de Lambda por defecto

Para implementar diferentes estrategias de autenticación, edite la función de Lambda que utiliza su puerta de enlace. Para ayudarle a satisfacer las necesidades de su aplicación, puede utilizar las siguientes funciones de Lambda de ejemplo en Node.js. Para obtener más información acerca de Lambda, consulte la Guía para desarrolladores de AWS Lambda o Crear funciones de Lambda con Node.js.

El siguiente ejemplo de función de Lambda toma el nombre de usuario, la contraseña (si está realizando la autenticación con contraseña), el identificador del servidor, el protocolo y la dirección IP del cliente. Puede usar una combinación de estas entradas para buscar su proveedor de identidad y determinar si se debe aceptar el inicio de sesión.

nota

Si tiene varios protocolos habilitados para su servidor y desea proporcionar acceso con el mismo nombre de usuario a través de varios protocolos, puede hacerlo siempre que las credenciales específicas del protocolo se hayan configurado en su proveedor de identidad.

Para el Protocolo de File Transfer (FTP), se recomienda mantener credenciales separadas del Protocolo de File Transfer (SFTP) de Secure Shell (SSH) y el Protocolo de File Transfer a través de SSL (FTPS). Recomendamos mantener credenciales separadas para el FTP porque, a diferencia del SFTP y el FTPS, el FTP transmite las credenciales en texto no cifrado. Al aislar las credenciales de FTP de las de SFTP o FTPS, si las credenciales de FTP se comparten o están expuestas, las cargas de trabajo que utilizan SFTP o FTPS permanecen seguras.

Este rol de ejemplo devuelve el rol y los detalles del directorio de inicio lógico, junto con las claves públicas (si realiza la autenticación de clave pública).

Al crear usuarios administrados por el servicio, se establece su directorio de inicio, ya sea lógico o físico. Del mismo modo, necesitamos que los resultados de la función de Lambda transmitan la estructura de directorios física o lógica deseada por el usuario. Los parámetros que defina dependen del valor del campo de HomeDirectoryType.

  • HomeDirectoryType establecido como PATH: el campo HomeDirectory debe ser un prefijo absoluto de bucket de Amazon S3 o una ruta absoluta de Amazon EFS visible para los usuarios.

  • HomeDirectoryType establecido como LOGICAL: no defina un campo HomeDirectory. En su lugar, configuramos un campo HomeDirectoryDetails que proporciona las asignaciones de entrada/destino deseadas, similares a los valores descritos en el parámetro HomeDirectoryDetails para los usuarios administrados por el servicio.

Las funciones de ejemplo se muestran en Ejemplo de función de Lambda.

Función Lambda para usar con AWS Secrets Manager

Para AWS Secrets Manager utilizarla como proveedor de identidad, puede trabajar con la función Lambda de la plantilla de ejemplo AWS CloudFormation . La función de Lambda consulta el servicio Secrets Manager con sus credenciales y, si se ejecuta correctamente, devuelve un secreto designado. Para obtener más información acerca de Secrets Manager, consulte la Guía del usuario de AWS Secrets Manager.

Para descargar una AWS CloudFormation plantilla de ejemplo que utilice esta función Lambda, vaya al bucket de Amazon S3 proporcionado por. AWS Transfer Family

Mejoras en las plantillas AWS CloudFormation

Se han realizado mejoras en la interfaz de API Gateway en las CloudFormation plantillas publicadas. Las plantillas ahora utilizan contraseñas codificadas en Base64 con la API Gateway. Sus implementaciones actuales siguen funcionando sin esta mejora, pero no permiten contraseñas con caracteres que no estén incluidos en el conjunto básico de caracteres US-ASCII.

Los cambios en la plantilla que permiten esta capacidad son los siguientes:

  • El GetUserConfigRequest AWS::ApiGateway::Method recurso debe tener este RequestTemplates código (la línea en cursiva es la línea actualizada)

    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')" }
  • El RequestParameters campo correspondiente al GetUserConfig recurso debe cambiar para poder utilizar el PasswordBase64 encabezado (la línea en cursiva es la línea actualizada):

    RequestParameters: method.request.header.PasswordBase64: false method.request.querystring.protocol: false method.request.querystring.sourceIp: false
Para comprobar si la plantilla de tu pila es la más reciente
  1. Abre la AWS CloudFormation consola en https://console.aws.amazon.com/cloudformation.

  2. De la lista de pilas, elige la tuya.

  3. En el panel de detalles, selecciona la pestaña Plantilla.

  4. Busque lo siguiente:

    • Busca RequestTemplates y asegúrate de tener esta línea:

      "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
    • Busca RequestParameters y asegúrate de tener esta línea:

      method.request.header.PasswordBase64: false

Si no ves las líneas actualizadas, edita tu pila. Para obtener más información sobre cómo actualizar la AWS CloudFormation pila, consulta Modificación de una plantilla de pila en la AWS CloudFormation Guía del usuario.