Se utiliza AWS Lambda 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.

Se utiliza AWS Lambda para integrar su proveedor de identidad

Cree una AWS Lambda función que se conecte a su proveedor de identidad personalizado. Puede usar cualquier proveedor de identidad personalizado, como Okta, Secrets Manager o un almacén de datos personalizado que incluya lógica de autorización y autenticación. OneLogin

nota

Antes de crear un servidor de Transfer Family que utilice Lambda como proveedor de identidades, debe crear la función. Para ver una función de Lambda de ejemplo, consulte Ejemplo de función de Lambda. O bien, puede implementar una CloudFormation pila que utilice uno de losPlantillas de función de Lambda. Además, asegúrese de que la función de Lambda utilice una política basada en recursos que confíe en Transfer Family. Para ver una política de ejemplo, consulte Política basada en recursos de Lambda.

  1. Abra la consola de AWS Transfer Family.

  2. Seleccione Crear servidor para abrir la página Crear servidor. En Elegir un proveedor de identidad, elija un proveedor de identidad personalizado, como se muestra en la siguiente captura de pantalla.

    La sección de la consola Elija un proveedor de identidad con el Proveedor de identidad personalizado seleccionado. También tiene seleccionado el valor predeterminado, que permite a los usuarios autenticarse con su contraseña o clave.
    nota

    La elección de métodos de autenticación solo está disponible si los habilita SFTP como uno de los protocolos de su servidor Transfer Family.

  3. Asegúrese de seleccionar el valor predeterminado, Usar AWS Lambda para conectar su proveedor de identidad.

  4. Para la AWS Lambda función, seleccione el nombre de su Función de Lambda.

  5. 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 Configurar un punto SFTP finalFTPS, o un FTP servidor.

Política basada en recursos de Lambda

Debe tener una política que haga referencia al servidor Transfer Family y a LambdaARNs. Por ejemplo, puede usar la siguiente política con la función de Lambda que se conecta a su proveedor de identidad. La política se escapa en JSON forma de cadena.

"Policy": "{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "AllowTransferInvocation", "Effect": "Allow", "Principal": { "Service": "transfer.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:transfer:region:account-id:function:my-lambda-auth-function", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:transfer:region:account-id:server/server-id" } } } ] }"
nota

En el ejemplo de política anterior, sustituya cada user input placeholder con tu propia información.

Estructura de mensaje de evento

La estructura del mensaje de evento desde el SFTP servidor enviado a la función Lambda del autorizador para una función IDP personalizada es la siguiente.

{ 'username': 'value', 'password': 'value', 'protocol': 'SFTP', 'serverId': 's-abcd123456', 'sourceIp': '192.168.0.100' }

Siendo username y password los valores de las credenciales de inicio de sesión que se envían al servidor.

Por ejemplo, introduzca el siguiente comando para la conexión:

sftp bobusa@server_hostname

Se le pedirá que escriba su contraseña:

Enter password: mysecretpassword

Puede comprobarlo desde la función de Lambda al imprimir el evento pasado desde la función de Lambda. Debería parecerse a lo que sigue.

{ 'username': 'bobusa', 'password': 'mysecretpassword', 'protocol': 'SFTP', 'serverId': 's-abcd123456', 'sourceIp': '192.168.0.100' }

La estructura de eventos es similar para FTP yFTPS: la única diferencia es que esos valores se utilizan para el protocol parámetro, en lugar de hacerlo. SFTP

funciones de Lambda para autenticación

Para implementar diferentes estrategias de autenticación, edite la función de Lambda. Para ayudarle a satisfacer las necesidades de su aplicación, puede implementar una CloudFormation pila. 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.

Plantillas de función de Lambda

Puede implementar una AWS CloudFormation pila que utilice una función Lambda para la autenticación. Proporcionamos varias plantillas que autentican y autorizan a sus usuarios mediante credenciales de inicio de sesión. Puede modificar estas plantillas o AWS Lambda códigos para personalizar aún más el acceso de los usuarios.

nota

Puede crear un AWS Transfer Family servidor FIPS habilitado AWS CloudFormation especificando una política de seguridad FIPS habilitado en su plantilla. Las políticas de seguridad disponibles se describen en Políticas de seguridad para AWS Transfer Family

Para crear una AWS CloudFormation pila para utilizarla en la autenticación
  1. Abre 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. Utilice una de las siguientes plantillas para crear una función de Lambda que se utilizará para la autenticación en Transfer Family.

    • Plantilla de pila clásica (Amazon Cognito)

      Una plantilla básica para crear una AWS Lambda para usarla como proveedor de identidad personalizado en AWS Transfer Family. Se autentica con Amazon Cognito para la autenticación basada en contraseñas y las claves públicas se devuelven desde un bucket de Amazon S3 si se utiliza la autenticación basada en claves públicas. 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

      Una plantilla básica que se utiliza AWS Lambda con un AWS Transfer Family servidor para integrar Secrets Manager como proveedor de identidad. Se autentica con una entrada AWS Secrets Manager de ese formatoaws/transfer/server-id/username. 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.

    • Plantilla de pila Okta: plantilla básica que se utiliza AWS Lambda con un AWS Transfer Family servidor para integrar Okta como proveedor de identidad personalizado.

    • Plantilla apilada Okta-MFA: plantilla básica que se utiliza AWS Lambda con un AWS Transfer Family servidor para integrar Okta, con MultiFactor Authentication, como proveedor de identidad personalizado.

    • Plantilla de Azure Active Directory: los detalles de esta pila se describen en la entrada del blog Cómo autenticarse AWS Transfer Family con Azure Active Directory y. AWS Lambda

    Una vez implementada la pila, puede ver sus detalles en la pestaña Salidas de la CloudFormation consola.

    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.

Valores de Lambda válidos

En la siguiente tabla se describen los detalles de los valores que Transfer Family acepta para las funciones de Lambda que se utilizan para los proveedores de identidades personalizados.

Valor Descripción Obligatorio

Role

Especifica el nombre del recurso de Amazon (ARN) del IAM rol que controla el acceso de los usuarios al bucket de Amazon S3 o al sistema de EFS archivos de Amazon. Las políticas asociadas a esta función determinan el nivel de acceso que desea proporcionar a sus usuarios al transferir archivos dentro y fuera de su sistema de EFS archivos Amazon S3 o Amazon. El IAM rol también debe contener una relación de confianza que permita al servidor acceder a sus recursos cuando atienda las solicitudes de transferencia de los usuarios.

Para obtener más información sobre cómo establecer una relación de confianza, consulte Para establecer una relación de confianza.

Obligatoria

PosixProfile

La POSIX identidad completa, incluidos el ID de usuario (Uid), el ID de grupo (Gid) y cualquier grupo secundario IDs (SecondaryGids), que controla el acceso de los usuarios a los sistemas de EFS archivos de Amazon. Los POSIX permisos que se establecen en los archivos y directorios de su sistema de archivos determinan el nivel de acceso que obtienen sus usuarios al transferir archivos dentro y fuera de sus sistemas de EFS archivos de Amazon.

Necesario para el almacenamiento EFS de respaldo de Amazon

PublicKeys

Una lista de valores de clave SSH pública válidos para este usuario. Una lista vacía implica que no se trata de un inicio de sesión válido. No debe devolverse durante la autenticación de la contraseña.

Opcional

Policy

Una política de sesión para su usuario, de modo que pueda usar el mismo IAM rol en varios usuarios. Esta política reduce el ámbito de acceso del usuario a partes de su bucket de Amazon S3.

Opcional

HomeDirectoryType

El tipo de directorio de destino (carpeta) que quiere utilizar como directorio de inicio de los usuarios cuando inicien sesión en el servidor.

  • Si lo configuras enPATH, el usuario verá el bucket absoluto de Amazon S3 o las EFS rutas de Amazon tal como están en sus clientes de protocolo de transferencia de archivos.

  • Si lo configura enLOGICAL, debe proporcionar mapeos en el HomeDirectoryDetails parámetro para que Amazon S3 o las EFS rutas de Amazon estén visibles para sus usuarios.

Opcional

HomeDirectoryDetails

Asignaciones de directorios lógicos que especifican qué EFS rutas y claves de Amazon S3 o Amazon deben estar visibles para el usuario y cómo desea hacerlas visibles. Debe especificar el Target par Entry y, donde se Entry muestra cómo se hace visible la ruta y Target es la EFS ruta real de Amazon S3 o Amazon.

Obligatorio si HomeDirectoryType tiene un valor de LOGICAL

HomeDirectory

Directorio de destino de un usuario cuando inicia sesión en el servidor a través del cliente.

Opcional

nota

HomeDirectoryDetailses una representación en cadena de un JSON mapa. Esto contrasta conPosixProfile, que es un objeto de JSON mapa real y PublicKeys que es una JSON matriz de cadenas. Consulte los ejemplos de código para ver los detalles específicos del idioma.

Ejemplo de función de Lambda

En esta sección se presentan algunos ejemplos de funciones de Lambda, tanto en Nodejs como en Python.

nota

En estos ejemplos, los detalles del usuario, el rol, el POSIX perfil, la contraseña y el directorio principal son ejemplos y deben reemplazarse por sus valores reales.

Logical home directory, NodeJS

La siguiente función de ejemplo de Nodejs proporciona los detalles de un usuario que tiene un directorio de inicio lógico.

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided. if (event.serverId !== "" && event.username == 'example-user') { var homeDirectoryDetails = [ { Entry: "/", Target: "/fs-faa1a123" } ]; response = { Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank PosixProfile: {"Gid": 65534, "Uid": 65534}, // Required for EFS access, but not needed for S3 HomeDirectoryDetails: JSON.stringify(homeDirectoryDetails), HomeDirectoryType: "LOGICAL", }; // Check if password is provided if (!event.password) { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]; // Check if password is correct } else if (event.password !== 'Password1234') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };
Path-based home directory, NodeJS

La siguiente función de ejemplo de Nodejs proporciona los detalles de un usuario que tiene un directorio de inicio basado en rutas.

// GetUserConfig Lambda exports.handler = (event, context, callback) => { console.log("Username:", event.username, "ServerId: ", event.serverId); var response; // Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided. // There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins. if (event.serverId !== "" && event.username == 'example-user') { response = { Role: 'arn:aws:iam::123456789012:role/transfer-access-role', // The user is authenticated if and only if the Role field is not blank Policy: '', // Optional, JSON stringified blob to further restrict this user's permissions HomeDirectory: '/fs-faa1a123' // Not required, defaults to '/' }; // Check if password is provided if (!event.password) { // If no password provided, return the user's SSH public key response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ]; // Check if password is correct } else if (event.password !== 'Password1234') { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } } else { // Return HTTP status 200 but with no role in the response to indicate authentication failure response = {}; } callback(null, response); };
Logical home directory, Python

La siguiente función de ejemplo de Python proporciona los detalles de un usuario que tiene un directorio de inicio lógico.

# GetUserConfig Python Lambda with LOGICAL HomeDirectoryDetails import json def lambda_handler(event, context): print("Username: {}, ServerId: {}".format(event['username'], event['serverId'])) response = {} # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided. if event['serverId'] != '' and event['username'] == 'example-user': homeDirectoryDetails = [ { 'Entry': '/', 'Target': '/fs-faa1a123' } ] response = { 'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank 'PosixProfile': {"Gid": 65534, "Uid": 65534}, # Required for EFS access, but not needed for S3 'HomeDirectoryDetails': json.dumps(homeDirectoryDetails), 'HomeDirectoryType': "LOGICAL" } # Check if password is provided if event.get('password', '') == '': # If no password provided, return the user's SSH public key response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ] # Check if password is correct elif event['password'] != 'Password1234': # Return HTTP status 200 but with no role in the response to indicate authentication failure response = {} else: # Return HTTP status 200 but with no role in the response to indicate authentication failure response = {} return response
Path-based home directory, Python

La siguiente función de ejemplo de Python proporciona los detalles de un usuario que tiene un directorio de inicio basado en rutas.

# GetUserConfig Python Lambda with PATH HomeDirectory def lambda_handler(event, context): print("Username: {}, ServerId: {}".format(event['username'], event['serverId'])) response = {} # Check if the username presented for authentication is correct. This doesn't check the value of the server ID, only that it is provided. # There is also event.protocol (one of "FTP", "FTPS", "SFTP") and event.sourceIp (e.g., "127.0.0.1") to further restrict logins. if event['serverId'] != '' and event['username'] == 'example-user': response = { 'Role': 'arn:aws:iam::123456789012:role/transfer-access-role', # The user will be authenticated if and only if the Role field is not blank 'Policy': '', # Optional, JSON stringified blob to further restrict this user's permissions 'HomeDirectory': '/fs-fs-faa1a123', 'HomeDirectoryType': "PATH" # Not strictly required, defaults to PATH } # Check if password is provided if event.get('password', '') == '': # If no password provided, return the user's SSH public key response['PublicKeys'] = [ "ssh-rsa abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" ] # Check if password is correct elif event['password'] != 'Password1234': # Return HTTP status 200 but with no role in the response to indicate authentication failure response = {} else: # Return HTTP status 200 but with no role in the response to indicate authentication failure response = {} return response

Prueba de su configuración

Tras crear el proveedor de identidad personalizado, debe probar la configuración.

Console
Para probar la configuración mediante la AWS Transfer Family consola
  1. Abra la consola de AWS Transfer Family.

  2. En la página Servidores, elija su nuevo servidor, elija Acciones y, a continuación, elija Probar.

  3. Introduzca el texto del nombre de usuario y la contraseña que estableció al implementar la AWS CloudFormation pila. Si ha mantenido las opciones predeterminadas, el nombre de usuario es myuser y la contraseña es MySuperSecretPassword.

  4. Elija el protocolo del servidor e introduzca la dirección IP de la IP de origen, si la configuró al implementar la AWS CloudFormation pila.

CLI
Para probar la configuración mediante el AWS CLI
  1. Ejecute el comando .test-identity-provider Sustituya cada user input placeholder por su propia información, tal y como se describe en los pasos siguientes.

    aws transfer test-identity-provider --server-id s-1234abcd5678efgh --user-name myuser --user-password MySuperSecretPassword --server-protocol FTP --source-ip 127.0.0.1
  2. Introduzca el identificador del servidor.

  3. Introduzca el nombre de usuario y la contraseña que estableció al implementar la AWS CloudFormation pila. Si ha mantenido las opciones predeterminadas, el nombre de usuario es myuser y la contraseña es MySuperSecretPassword.

  4. Introduzca el protocolo del servidor y la dirección IP de origen, si los configuró al implementar la AWS CloudFormation pila.

Si la autenticación del usuario se realiza correctamente, la prueba devuelve una StatusCode: 200 HTTP respuesta, una cadena vacía Message: "" (que de lo contrario contendría el motivo del error) y un Response campo.

nota

En el siguiente ejemplo de respuesta, el Response campo es un JSON objeto que se ha «encadenado» (convertido en una JSON cadena plana que se puede utilizar dentro de un programa) y contiene los detalles de las funciones y permisos del usuario.

{ "Response":"{\"Policy\":\"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"ReadAndListAllBuckets\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":[\\\"s3:ListAllMybuckets\\\",\\\"s3:GetBucketLocation\\\",\\\"s3:ListBucket\\\",\\\"s3:GetObjectVersion\\\",\\\"s3:GetObjectVersion\\\"],\\\"Resource\\\":\\\"*\\\"}]}\",\"Role\":\"arn:aws:iam::000000000000:role/MyUserS3AccessRole\",\"HomeDirectory\":\"/\"}", "StatusCode": 200, "Message": "" }