Desplegando servidor SFTP en AWS
Tags: aws, security, tutorial, beginners
Published: 2022-01-08 19:03:56

## Introducción

En el presente tutorial mostraremos como podemos subir archivos a la nube de AWS utilizando el protocolo de seguridad SFTP.

## Tabla de Contenidos
* [Requerimientos](#chapter-1)
* [Arquitectura] (#chapter-2)
* [Tutorial](#chapter-3)
* [Costos](#chapter-4)

## Requerimientos <a name="chapter-1"></a>

1. Cuenta en AWS.
2. Aplicación FTP(Utilizamos Filezilla).
3. ssh-keygen para generación de clave pública y privada.

## Arquitectura <a name="chapter-2"></a>


![ARQUITECTURA](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8wneyqgpt2d5ef9v9bvd.png)

## Tutorial <a name="chapter-3"></a>

#### Paso 1

Lo primero que haremos es ir al servicio de S3 y crearemos un bucket que será donde almacenaremos los archivos que subamos mediante el servidor SFTP. En nuestro caso al bucket lo llamaremos _demo-sftp-99_

![Creación Bucket](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/doqhpqhvpzkq9vzztehf.png)

#### Paso 2

A continuación, nos dirigimos al servicio AWS Transfer Family y seleccionaremos "Create Server"

![Transfer Family](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyy3oe4a6reuer5h8bey.png)

En la sección 1 "Choose protocols" debemos seleccionar el tipo de transferencia que tendrá nuestro servidor, para ello nos desplega las siguientes opciones

1. SFTP: Transferencia segura utilizando SSH
2. FTPS: Transferencia segura sobre protocolo de encriptación TLS
3. FTP: Transferencia sobre canal no encriptado

Seleccionaremos la opción **SFTP**

![Choose protocols SFTP](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7r14gywrti3kwj9srvy.png)

---
---


En la sección 2 "Choose an identity provider" debemos seleccionar el tipo de proveedor que nos permitirá almacenar las credenciales de acceso. Las opciones son las siguientes:

1. Service Managed: Con Transfer Family administramos las credenciales de acceso.
2. AWS Directory Service: Utilizamos AWS Directory Service para administrar las credenciales de acceso. Este servicio se utiliza para trabajar en la nube de AWS con Microsoft Active Directory
3. Custom Identity Provider: Administramos las credenciales de acceso con un proveedor personalizado a elección.

Seleccionaremos la opción de **Service Managed** para que posteriormente podamos crear un usuario directamente en el servidor SFTP.

![Identity provider Service Managed](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e8990mtri5vzm6kvpm74.png)

---
---

En la sección 3 "Choose an endpoint" debemos definir la configuración de seguridad del endpoint del servidor, para esto nos permite seleccionar lo siguiente:

1. Publicy accesible: Para que este disponible a través de internet
2. VPC Hosted: Para que se encuentre dentro de una VPC y utilizando Security Group

Para este tutorial nos basta con que se **encuentre disponible sobre internet** ya que la seguridad de la transferencia la estamos manejando con el protocolo SFTP. En el caso que necesitemos aplicar seguridad al servidor, entonces podemos configurar una VPC y seleccionar la opción VPC Hosted.

Al seleccionar esta opción, debemos definir en **custom hostname** que implica seleccionar como se creará el endpoint del servidor SFTP. Las opciones disponibles son:

1. None: Crear el endpoint por defecto utilizando AWS Transfer Family.
2. Amazon Route53 DNS Alias: Utiliza un Alias de DNS generado con Route53.
3. Other DNS: Utilizar un hostname que hayamos creado previamente con un servicio DNS externo.

Seleccionaremos **None** para que el endpoint lo genere el mismo servicio de Transfer Family.

La opción **FIPS Enabled** es para asegurar que el endpoint cumpla con el estándar FIPS. La dejaremos desactivada.
![Choose an endpoint](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bup4kmdfl0nz85o3jezn.png)

---
---

En la sección 4 "Choose a domain" debemos definir el servicio de almacenamiento de los archivos a transferir:

1. Amazon S3: Para almacenar los archivos en un bucket de S3.
2. Amazon EFS: Para almacenar los archivos en una instancia de EFS.

Seleccionaremos **Amazon S3**. _La configuración del bucket se realiza al crear el usuario_

![Choose a domain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkrrdyqjsso2jvx1mba5.png)

---
---

En la sección 5 "Configure additional details" debemos primero crear/seleccionar un role para el registro de los logs de CloudWatch. En nuestro caso dejaremos que el mismo servicio **cree el role**. 

Luego en Cryptographic algorithm options debemos elegir la politica de seguridad referente al algoritmo de encriptación, la dejaremos por default **"TransferSecurityPolicy-2020-06"**.

![Configure additional details](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zu4o3z2c3a1q0ceub81j.png)

En la sub-sección Server Host Key nos permite ingresar la clave privada en caso que deseemos migrar desde un servidor SFTP existente. En nuestro caso no aplica por lo que quedará **vacio**.

En Tags podemos agregar las etiquetas que necesitemos, aunque esto es opcional por lo que nosotros no lo haremos por el momento.

En Managed Workflows nos permite crear/seleccionar un flujo de trabajo en caso que necesitemos generar un procesamiento del tipo copiar, borrar, tagear o invocar una función lambda al archivo subido. Para propósitos de este tutorial no profundizaremos en esto, pero es una opción muy interesante a seguir explorando en el futuro.

![Server Host Key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xmga4l596dwfhp7cmj9.png)

---
---

Hemos llegado al término del proceso de creación del servidor SFTP, por lo que en la sección 6 de "Review and create" clickearemos Create Server para lanzar el servicio.

La creación del servicio demora entre 3 a 5 minutos, por lo que cuando su estado sea Online, podemos continuar con el siguiente paso


![Servidor creado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4a8yx30naubynts0h0z.png)


#### Paso 3

Seleccionaremos el servidor que acabamos de desplegar y lo que debemos hacer a continuación es crear el usuario que nos permitirá subir los archivos. Para ello iremos a la sección "Users" y seleccionaremos Add user.

![Add user](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8zxwhhdspngf9gfh6v6.png)

En la sección User configuration debemos ingresar los parámetros que tendrá el usuario. Para ello en Username colocaremos **sftp-user**. En Role debemos previamente haber creado un role con la siguiente estructura:

En IAM iremos a Create Role y la primera sección de Choose a use case elegiremos **Transfer**

![Use case](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rgjw3p2fcp2aj4h5huh4.png)

En Attach permissions policies seleccionaremos la politica administrada de AWS **AmazonS3FullAccess**

![S3FullAccess](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1gcyxjj0kcneje87yz2o.png)

Por último en Review colocaremos el nombre **demo-sftp** al role.

![Nombre Role](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzhozo57urcce7t8hlzt.png)

Volvemos a la pestaña de creación del usuario del servidor y seleccionaremos el role que acabamos de crear(Si no aparece inmediatamente podemos darle al refresh que está justo a la derecha).

No aplicaremos ninguna política extra al usuario por lo que dejaremos la opción **None**

En Home Directory debemos seleccionar el bucket que creamos en el paso 1 al cual colocamos **demo-sftp-99** e inmediatamente el recuadro inferior lo rellenará con el nombre del usuario que ingresamos en la primera casilla. Esto significa que dentro del bucket de S3, al subir un archivo con este usuario, creará una "carpeta" en donde quedará almacenado. Este valor lo podemos cambiar a discreción, pero se recomienda dejarlo por defecto porque en el futuro podemos crear nuevos usuarios que eventualmente podrian generar confusión al no tener asignada una carpeta con el mismo nombre para cada usuario.

![User](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l9glyaevhjyx8bnh3cx1.png)

En SSH public keys debemos ingresar la clave pública que funcionará como credencial de acceso para este usuario. Para generar la clave pública y privada utilizamos el siguiente comando

```
ssh-keygen -f nombre_archivo
```
Esto nos generará dos archivos, uno con terminación .pub(Clave pública) y el otro no(Clave privada). Copiaremos el contenido del archivo .pub y lo pegaremos en la sección SSH public key.
**IMPORTANTE ALMACENAR AMBOS ARCHIVOS. LA CLAVE PRIVADA NO DEBE COMPARTIRSE NI ENVIARSE A TRAVÉS DE INTERNET PARA EVITAR QUE EXTERNOS PUEDAN ACCEDER A NUESTRO SERVIDOR SFTP.**

Una vez tengamos todos los parámetros ingresado podemos seleccionar "Add user".

Ahora en la sección User veremos el usuario que acabamos de crear.

![User creado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e4o2zknx5sztvkaye63x.png)

#### Paso 4

Abriremos el programa FTP que hayamos seleccionado, nosotros utilizaremos Filezilla. Iremos a Archivo y luego a Gestor de Sitios. 

Esto nos deplegará una ventana en donde crearemos el Nuevo sitio para nuestro servidor. Para ello en la sección Protocolo de la parte derecha de la ventana seleccionaremos **SFTP - SSH File Transfer Protocol**. En Servidor pegaremos el endpoint ubicado en la sección Endpoint Details de nuestro servidor. El **puerto es el 22**. En el modo de acceso seleccionamos **Archivo de claves** y luego en el Usuario colocaremos el nombre del usuario creado en el paso 3, en nuestro caso **sftp-user**. En archivo de claves seleccionaremos la **clave privada** que generamos con ssh-keygen en el paso 3.

Ahora ya estamos en condiciones de conectarnos y comenzar a subir los archivos que deseemos

![Configuración Filezilla](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n989xkp5jyt5in33n22.png)

#### Paso 5 - Subida de archivos

Para nuestra primera subida solo basta con arrastrar el o los archivos que deseemos a la parte derecha inferior de Filezilla.

![Subiendo archivo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6t4ghdz76ecd4oku1p7o.png)

Ahora iremos a revisar a S3 el archivo que acabamos de subir, para ello buscaremos el bucket demo-sftp-99 y luego sftp-user, en donde se encontrará el archivo.


![Archivo en S3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcxkg1411q4tibd3wq0w.png)


## Costos <a name="chapter-3"></a>
### Tutorial

Considerando que estamos desplegando el servidor en una cuenta personal, es importante que conozcamos de antemano los costos que tendrá el despliegue de esta solución. Para esto debemos considerar tres aspectos, el primero es **cuantos protocolos estamos desplegando**(con esto me refiero a si usamos SFTP, FTP, FTPS), el segundo es el **tiempo que estará desplegado el servidor SFTP** y por último la **cantidad de data transferida**.
Para este tutorial, tendremos desplegado el servidor durante **1 hora** con una **transferencia de datos de 0.5 GB**

Utilizando la [AWS Pricing Calculator](https://calculator.aws/#/createCalculator/TransferFamily) realizaremos el cálculo.

Detalle: 

- 1 protocolo SFTP x 1 hora x 0.30 USD = 0.30 USD (costo por protocolos)
- 0.50 GB x 0.04 USD = 0.02 USD (costo por transferencia de subida)
- 0.50 GB x 0.04 USD = 0.02 USD (costo por transferencia de bajada)

_0.30 USD + 0.02 USD + 0.02 USD = 0.34 USD_

**Costo AWS Transfer tutorial: 0.34 USD**

![Costo AWS Transfer tutorial](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7zlha15joxgy9311goeh.png)

#### Ambiente productivo
Considerando que requerimos desplegar esta solución en un ambiente productivo, por lo que consideramos 720 horas al mes(24hr * 30 días) y con una cuota de transferencia de datos de 10 GB en promedio mensual. En base a esto, el detalle es el siguiente

- 1 protocolo SFTP x 720 horas x 0.30 USD = 216.00 USD (costo por protocolos)
- 10 GB x 0.04 USD = 0.40 USD (costo por transferencia de subida)
- 10 GB x 0.04 USD = 0.40 USD (costo por transferencia de bajada)

_216.00 USD + 0.40 USD + 0.40 USD = 216.80 USD_

Costo AWS Transfer (mensual): 216.80 USD

Evidenciamos que los costos se eleven considerablemente, por lo que si no estamos dispuestos a desembolsar esa cantidad de dólares mensualmente, debemos de buscar alguna estrategia. Una que se me ocurre es desplegar esta solución solo cuando la necesitemos, realizando el despliegue mediante IaaC(Infraestructura como código) mediante un CloudFormation 

![Costo AWS Transfer ambiente productivo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rko6fx080c81eij6bukd.png)

## Tutorial en YouTube 
[Tutorial](https://youtu.be/oH5fxQoaXbM)


Fuente:
https://calculator.aws/#/createCalculator/TransferFamily
https://aws.amazon.com/aws-transfer-family/pricing/