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
-
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
-
Abra la AWS CloudFormation consola en https://console.aws.amazon.com/cloudformation.
-
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.
-
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.
-
De forma predeterminada, el método API Gateway se utiliza como proveedor de identidad personalizado para autenticar a un único usuario en un único servidor mediante una clave o contraseña SSH (Secure Shell) codificada de forma rígida. Tras la implementación, puede modificar el código de la función de Lambda para hacer algo diferente.
-
AWS Secrets Manager plantilla de pila
De forma predeterminada, el método API Gateway se autentica con una entrada de este formato de
aws/transfer/
en Secrets Manager. Además, el secreto debe contener los pares clave-valor de todas las propiedades de usuario devueltas a Transfer Family. Tras la implementación, puede modificar el código de la función de Lambda para hacer algo diferente. Para obtener más información, consulte la entrada del blog Habilitar la autenticación por contraseña para su AWS Transfer Family uso AWS Secrets Managerserver-id
/username
. -
Su método API Gateway se integra con Okta como proveedor de identidad personalizado en Transfer Family. Para obtener más información, consulte la publicación de blog sobre el Uso de Okta como proveedor de identidad con AWS 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 deMySuperSecretPassword
. 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.
-
-
Compruebe la configuración del método API Gateway para su servidor. Para ello:
-
Abra la consola de API Gateway en https://console.aws.amazon.com/apigateway/
. -
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.
-
En el panel Recursos, selecciona GET. La siguiente captura de pantalla muestra la configuración correcta del método.
En este punto, su API Gateway está lista para ser implementada.
-
-
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.
-
Abra la AWS Transfer Family consola en https://console.aws.amazon.com/transfer/
. -
Se debería haber creado una Transfer Family para ti cuando creaste la pila. Si no es así, configure su servidor siguiendo estos pasos.
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.
-
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.
-
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
-
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/
. Los valores de serverId
/users/username
/config
y serverId
proceden de la ruta de recurso RESTful. Además, añada username
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.](images/apig-config-method-request.png)
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
en la ruta de recursos RESTful.protocol
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-rsapublic-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-rsapublic-key1
", "ssh-rsapublic-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 comoPATH
: el campoHomeDirectory
debe ser un prefijo absoluto de bucket de Amazon S3 o una ruta absoluta de Amazon EFS visible para los usuarios. -
HomeDirectoryType
establecido comoLOGICAL
: no defina un campoHomeDirectory
. En su lugar, configuramos un campoHomeDirectoryDetails
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
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 esteRequestTemplates
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 alGetUserConfig
recurso debe cambiar para poder utilizar elPasswordBase64
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
Abre la AWS CloudFormation consola en https://console.aws.amazon.com/cloudformation
. De la lista de pilas, elige la tuya.
En el panel de detalles, selecciona la pestaña Plantilla.
-
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.