<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Juan Gonzalez</title>
    <description>The latest articles on Forem by Juan Gonzalez (@juan_gonzalez_6bc63085f7a).</description>
    <link>https://forem.com/juan_gonzalez_6bc63085f7a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3724218%2F00bd8902-6e87-4364-a7a7-70bbae1ce561.jpg</url>
      <title>Forem: Juan Gonzalez</title>
      <link>https://forem.com/juan_gonzalez_6bc63085f7a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juan_gonzalez_6bc63085f7a"/>
    <language>en</language>
    <item>
      <title>AWS SFTP con AWS Transfer Family y Amazon Cognito</title>
      <dc:creator>Juan Gonzalez</dc:creator>
      <pubDate>Wed, 21 Jan 2026 17:28:17 +0000</pubDate>
      <link>https://forem.com/juan_gonzalez_6bc63085f7a/aws-sftp-con-aws-transfer-family-y-amazon-cognito-31o6</link>
      <guid>https://forem.com/juan_gonzalez_6bc63085f7a/aws-sftp-con-aws-transfer-family-y-amazon-cognito-31o6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Implementando un servidor SFTP seguro con AWS Transfer Family y Amazon Cognito&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muchas organizaciones necesitan ofrecer servicios de transferencia segura de archivos sin administrar servidores SFTP tradicionales, usuarios del sistema operativo o la gestión manual de llaves SSH.&lt;/p&gt;

&lt;p&gt;En este artículo presento una arquitectura basada en servicios nativos de AWS para construir una solución SFTP segura, escalable y totalmente administrada, que soporta autenticación por usuario/contraseña y llaves públicas SSH, además de automatización basada en eventos para el ciclo de vida de los usuarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visión general de la arquitectura&lt;/strong&gt;&lt;br&gt;
La siguiente imagen muestra la arquitectura de la solución:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F232twl6sy6bp02rgplys.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F232twl6sy6bp02rgplys.jpeg" alt=" " width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componentes principales&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Transfer Family – Endpoint SFTP administrado&lt;/li&gt;
&lt;li&gt;Amazon Cognito – Autenticación y gestión de usuarios&lt;/li&gt;
&lt;li&gt;AWS Lambda – Proveedor de identidad personalizado y automatización&lt;/li&gt;
&lt;li&gt;Amazon EventBridge – Orquestación basada en eventos&lt;/li&gt;
&lt;li&gt;Amazon S3 – Almacenamiento de datos y llaves públicas&lt;/li&gt;
&lt;li&gt;AWS IAM – Control de acceso con privilegios mínimos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modelos de autenticación soportados&lt;/strong&gt;&lt;br&gt;
La solución soporta dos métodos de autenticación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autenticación basada en usuario y contraseña&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autenticación basada en llaves públicas SSH&lt;/strong&gt;
Ambos métodos son manejados dinámicamente por una &lt;strong&gt;función Lambda&lt;/strong&gt; que actúa como &lt;strong&gt;proveedor de identidad personalizado&lt;/strong&gt; para AWS Transfer Family.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Requisitos previos&lt;/strong&gt;&lt;br&gt;
Antes de implementar esta solución, asegúrate de cumplir con lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS CloudTrail habilitado&lt;/strong&gt;, con Management Events activos
Esto es necesario para que Amazon EventBridge pueda detectar eventos administrativos provenientes de Amazon Cognito (por ejemplo, creación o eliminación de usuarios).
No se requieren configuraciones adicionales previas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 1: Crear el User Pool de Amazon Cognito&lt;/strong&gt;&lt;br&gt;
Amazon Cognito funciona como el &lt;strong&gt;servicio central de identidad&lt;/strong&gt; para los usuarios SFTP.&lt;br&gt;
&lt;strong&gt;Decisiones clave de configuración&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicio de sesión basado en nombre de usuario&lt;/li&gt;
&lt;li&gt;Política de contraseñas fuerte&lt;/li&gt;
&lt;li&gt;Habilitar AdminCreateUser para automatización&lt;/li&gt;
&lt;li&gt;No se requiere Hosted UI
Cada usuario creado en Cognito representa &lt;strong&gt;un usuario SFTP&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 2: Crear los buckets de Amazon S3&lt;/strong&gt;&lt;br&gt;
La solución utiliza dos buckets de Amazon S3:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Bucket de datos&lt;/strong&gt;&lt;br&gt;
Almacena los archivos de los usuarios.&lt;br&gt;
Estructura recomendada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3://sftp-data-bucket/username/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Bucket de llaves públicas&lt;/strong&gt;&lt;br&gt;
Almacena las llaves públicas SSH de cada usuario.&lt;br&gt;
Estructura recomendada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3://sftp-public-keys-bucket/username/key.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las políticas de IAM aseguran que cada usuario solo tenga acceso a su propio prefijo dentro del bucket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 3: Configurar AWS Transfer Family&lt;/strong&gt;&lt;br&gt;
Se debe crear un servidor &lt;strong&gt;AWS Transfer Family (SFTP)&lt;/strong&gt; con las siguientes características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protocolo: &lt;strong&gt;SFTP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tipo de endpoint: &lt;strong&gt;VPC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Security Group permitiendo el puerto TCP 22&lt;/li&gt;
&lt;li&gt;Proveedor de identidad personalizado: &lt;strong&gt;AWS Lambda&lt;/strong&gt;
AWS Transfer Family invoca la función Lambda cada vez que un usuario intenta autenticarse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 4: Implementar la Lambda de autenticación personalizada&lt;/strong&gt;&lt;br&gt;
Esta función Lambda actúa como &lt;strong&gt;proveedor de identidad personalizado.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Flujo de autenticación&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS Transfer Family invoca la función Lambda&lt;/li&gt;
&lt;li&gt;La función analiza la solicitud&lt;/li&gt;
&lt;li&gt;Se determina el método de autenticación utilizado
&lt;strong&gt;Ejemplo de pseudocódigo&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if event.get("Password"):
    authenticate_user_with_cognito(username, password)
else:
    public_keys = get_public_keys_from_s3(username)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Responsabilidades de la función&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validar credenciales contra Amazon Cognito&lt;/li&gt;
&lt;li&gt;Recuperar llaves públicas SSH desde Amazon S3&lt;/li&gt;
&lt;li&gt;Retornar dinámicamente:

&lt;ul&gt;
&lt;li&gt;Rol de IAM&lt;/li&gt;
&lt;li&gt;Política IAM en línea&lt;/li&gt;
&lt;li&gt;Mapeo de directorio home lógico
Esto permite &lt;strong&gt;autorización dinámica por sesión.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 5: Automatizar la gestión de carpetas con EventBridge&lt;/strong&gt;&lt;br&gt;
El ciclo de vida de los usuarios se maneja mediante eventos.&lt;br&gt;
&lt;strong&gt;Creación de carpetas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evento&lt;/strong&gt;: AdminCreateUser en Cognito&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicio&lt;/strong&gt;: Amazon EventBridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destino&lt;/strong&gt;: Función Lambda
La función Lambda:&lt;/li&gt;
&lt;li&gt;Crea las carpetas del usuario en ambos buckets&lt;/li&gt;
&lt;li&gt;Prepara el entorno antes del primer acceso&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Eliminación o renombrado de carpetas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evento&lt;/strong&gt;: AdminDeleteUser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicio&lt;/strong&gt;: Amazon EventBridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destino&lt;/strong&gt;: Función Lambda
En lugar de eliminar la información, las carpetas pueden:
Renombrarse&lt;/li&gt;
&lt;li&gt;Archivarse&lt;/li&gt;
&lt;li&gt;Moverse a un prefijo de resguardo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Paso 6: Modelo de seguridad con IAM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La seguridad se basa en el principio de mínimos privilegios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada sesión SFTP recibe un rol de IAM temporal&lt;/li&gt;
&lt;li&gt;El acceso se limita a:

&lt;ul&gt;
&lt;li&gt;El prefijo del usuario en S3&lt;/li&gt;
&lt;li&gt;Las acciones estrictamente necesarias&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Las llaves públicas están protegidas contra eliminación accidental
Este modelo garantiza &lt;strong&gt;aislamiento fuerte entre usuarios.&lt;/strong&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Flujo operativo&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Autenticación basada en contraseña&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se crea el usuario en Cognito&lt;/li&gt;
&lt;li&gt;Se establece la contraseña mediante AWS CLI o CloudShell&lt;/li&gt;
&lt;li&gt;El usuario se conecta usando un cliente SFTP estándar
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws cognito-idp admin-set-user-password \
  --user-pool-id &amp;lt;UserPoolId&amp;gt; \
  --username &amp;lt;username&amp;gt; \
  --permanent \
  --password &amp;lt;password&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Autenticación basada en llave pública SSH&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generar el par de llaves:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -m PEM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Cargar la llave pública en S3:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws s3api put-object \
  --bucket &amp;lt;PublicKeyBucketName&amp;gt; \
  --key &amp;lt;username&amp;gt;/key.pub \
  --body key.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Conectarse usando cualquier cliente SFTP compatible&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Beneficios de esta arquitectura&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sin servidores que administrar&lt;/li&gt;
&lt;li&gt;Autenticación completamente administrada&lt;/li&gt;
&lt;li&gt;Automatización basada en eventos&lt;/li&gt;
&lt;li&gt;Seguridad por diseño&lt;/li&gt;
&lt;li&gt;Escalabilidad automática&lt;/li&gt;
&lt;li&gt;Auditoría completa mediante CloudTrail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusión&lt;/strong&gt;&lt;br&gt;
Esta arquitectura demuestra cómo los &lt;strong&gt;servicios nativos de AWS&lt;/strong&gt; pueden combinarse para entregar una solución &lt;strong&gt;SFTP segura, escalable y fácil de operar.&lt;/strong&gt;&lt;br&gt;
Al utilizar AWS Transfer Family, Amazon Cognito, Lambda, EventBridge y S3, es posible eliminar servidores SFTP tradicionales sin sacrificar seguridad, control ni trazabilidad.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>security</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
