

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
<a name="custom-lambda-idp"></a>

En este tema se describe cómo crear una AWS Lambda función que se conecte a su proveedor de identidades 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

En la mayoría de los casos de uso, la forma recomendada de configurar un proveedor de identidades personalizado es utilizar el[Solución de proveedor de identidad personalizada](custom-idp-toolkit.md).

**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](#lambda-auth-examples). O bien, puede implementar una CloudFormation pila que utilice uno de los[Plantillas de función de Lambda](#lambda-idp-templates). 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](#lambda-resource-policy).

1. Abra la [consola de AWS Transfer Family](https://console.aws.amazon.com/transfer/).

1. 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.\]](http://docs.aws.amazon.com/es_es/transfer/latest/userguide/images/custom-lambda-console.png)
**nota**  
La selección de métodos de autenticación solo está disponible si habilita SFTP como uno de los protocolos del servidor de Transfer Family.

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

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

1. 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](tf-server-endpoint.md).

## Política basada en recursos de Lambda
<a name="lambda-resource-policy"></a>

Debe tener una política que haga referencia al servidor Transfer Family y a Lambda ARNs. 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 es un JSON de escape en 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:lambda:region:123456789012:function:my-lambda-auth-function\",
  \"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:transfer:region:123456789012:server/server-id\"}}}
]}"
```

**nota**  
En el ejemplo de política anterior, sustituya cada una *user input placeholder* por su propia información.

## Estructura de mensaje de evento
<a name="event-message-structure"></a>

La estructura de los mensajes de eventos del servidor SFTP enviados a la función de Lambda del autorizador para un IDP personalizado 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 y FTPS: la única diferencia es que esos valores se utilizan para el parámetro `protocol` y no para SFTP.

## funciones de Lambda para autenticación
<a name="authentication-lambda-examples"></a>

Para implementar diferentes estrategias de autenticación, edite la función de Lambda. Para ayudarte a satisfacer las necesidades de tu aplicación, puedes implementar una CloudFormation pila. Para obtener más información acerca de Lambda, consulte la [Guía para desarrolladores de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) o [Crear funciones de Lambda con Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html).

**Topics**
+ [Valores de Lambda válidos](#lambda-valid-values)
+ [Ejemplo de función de Lambda](#lambda-auth-examples)
+ [Prueba de su configuración](#authentication-test-configuration)
+ [Plantillas de función de Lambda](#lambda-idp-templates)

### Valores de Lambda válidos
<a name="lambda-valid-values"></a>

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  |  Description (Descripción)  |  Obligatorio  | 
| --- | --- | --- | 
|  `Role`  |  Especifica el nombre de recurso de Amazon (ARN) del rol de IAM que controla el acceso de sus usuarios a su bucket de Amazon S3 o al sistema de archivos EFS. Las políticas asociadas a este rol determinarán el nivel de acceso que quiere ofrecer a los usuarios cuando se transfieran archivos dentro y fuera de su bucket de Amazon S3 o del sistema de archivos de Amazon EFS. El rol de IAM también debe contener una relación de confianza que permita que el servidor pueda obtener acceso a los 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](requirements-roles.md#establish-trust-transfer).  |  Obligatorio  | 
|  `PosixProfile`  |  La identidad POSIX completa, que incluye 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 archivos de Amazon EFS. Los permisos POSIX establecidos en los archivos y directorios del sistema de archivos determinan el nivel de acceso que obtienen los usuarios al transferir archivos dentro y fuera de los sistemas de archivos de Amazon EFS.  |  Se requiere para el almacenamiento de respaldo de Amazon EFS  | 
|  `PublicKeys`  |  Una lista de valores de clave pública de SSH que son 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 el usuario, de modo que pueda usar el mismo rol de IAM en varios usuarios. Esta política reduce el ámbito de acceso del usuario a partes de su bucket de Amazon S3. Para obtener más información sobre el uso de políticas de sesión con proveedores de identidad personalizados, consulte los ejemplos de políticas de sesión de este tema.  |  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. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transfer/latest/userguide/custom-lambda-idp.html)  |  Opcional  | 
|  `HomeDirectoryDetails`  |  Los mapeos de directorio lógico que especifican qué rutas de acceso y claves de Amazon S3 deben ser visibles para el usuario y cómo desea hacerlas visibles. Deberá especificar el par `Entry` y `Target`, donde `Entry` muestra cómo se hace visible la ruta y `Target` es la ruta de Amazon S3 o de Amazon EFS real.  |  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. El formato depende del backend de almacenamiento: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transfer/latest/userguide/custom-lambda-idp.html)  El nombre del bucket o el ID del sistema de archivos Amazon EFS deben incluirse en la ruta. Si se omite esta información, se producirán errores de tipo «Archivo no encontrado» durante las transferencias de archivos.   |  Opcional  | 

**nota**  
`HomeDirectoryDetails` es una representación de cadenas de un mapa de JSON. Esto contrasta con `PosixProfile`, que es un objeto de mapa JSON real, y `PublicKeys`, que es una matriz JSON de cadenas. Consulte los ejemplos de código para ver los detalles específicos del idioma.

**HomeDirectory Requisitos de formato**  
Cuando utilice el `HomeDirectory` parámetro, asegúrese de incluir el formato de ruta completo:  
**Para el almacenamiento en Amazon S3:** incluya siempre el nombre del bucket en el formato `/bucket-name/path`
**Para el almacenamiento en Amazon EFS:** incluya siempre el ID del sistema de archivos en el formato `/fs-12345/path`
Una causa común de los errores de «Archivo no encontrado» es omitir el nombre del bucket o el ID del sistema de archivos EFS en la `HomeDirectory` ruta. Si `HomeDirectory` se establece solo `/` sin el identificador de almacenamiento, la autenticación se realizará correctamente, pero las operaciones con los archivos fallarán.

### Ejemplo de función de Lambda
<a name="lambda-auth-examples"></a>

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

**nota**  
En estos ejemplos, el usuario, el rol, el perfil POSIX, la contraseña y los detalles del directorio de inicio son todos 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](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html). 

```
// 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 format depends on your storage backend:
      // For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      // For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      HomeDirectory: '/my-transfer-bucket/users/example-user' // S3 example - replace with your bucket name
      // HomeDirectory: '/fs-faa1a123/users/example-user' // EFS example - uncomment for EFS
    };
    
    // 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](https://docs.aws.amazon.com/transfer/latest/userguide/logical-dir-mappings.html). 

```
# 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 format depends on your storage backend:
      # For S3: '/bucket-name/user-home-directory' (e.g., '/my-transfer-bucket/users/john')
      # For EFS: '/fs-12345/user-home-directory' (e.g., '/fs-faa1a123/users/john')
      'HomeDirectory': '/my-transfer-bucket/users/example-user', # S3 example - replace with your bucket name
      # 'HomeDirectory': '/fs-faa1a123/users/example-user', # EFS example - uncomment for EFS
      '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
<a name="authentication-test-configuration"></a>

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](https://console.aws.amazon.com/transfer/). 

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

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

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

------
#### [ CLI ]

**Para probar la configuración mediante la AWS CLI**

1. Ejecute el comando [test-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/transfer/test-identity-provider.html). 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
   ```

1. Introduzca el identificador del servidor.

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

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

------

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

**nota**  
 En el ejemplo de respuesta que aparece a continuación, el campo `Response` es un objeto JSON que se ha “encadenado” (convertido en una cadena JSON plana que se puede utilizar dentro de un programa) y contiene los detalles de los roles 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": ""
}
```

### Plantillas de función de Lambda
<a name="lambda-idp-templates"></a>

Puede implementar una 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 compatible con FIPS CloudFormation especificando una política de seguridad con FIPS en la plantilla. Las políticas de seguridad disponibles se describen en [Políticas de seguridad para servidores AWS Transfer Family](security-policies.md) 

**Para crear una pila para utilizarla en la autenticación CloudFormation**

1. Abre la CloudFormation consola en [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Siga las instrucciones para implementar una CloudFormation pila a partir de una plantilla existente en [Seleccionar una plantilla de pila](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html) en la Guía del *AWS CloudFormation usuario*.

1. 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)](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-cognito-s3.template.yml)

     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](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml)

     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 formato`aws/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](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-lambda.template.yml) 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](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-okta-mfa-lambda.template.yml) básica que se utiliza AWS Lambda con un AWS Transfer Family servidor para integrar Okta, con autenticación multifactor, como proveedor de identidad personalizado.
   + [Plantilla de Azure Active Directory](https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-basic-lambda-azure-ad.template.yml): los detalles de esta pila se describen en la entrada del blog Cómo [autenticarse AWS Transfer Family con](https://aws.amazon.com/blogs/storage/authenticating-to-aws-transfer-family-with-azure-active-directory-and-aws-lambda/) 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.