7. SFTP (Secure File Transfer Protocol)

El Secure File Transfer Protocol es una extensión del subsistema de SSH que ofrece transferencia de archivos cifrada, autenticada y con verificación de integridad sobre el puerto 22/TCP.

SFTP encapsula cada operación de lectura, escritura y cambio de permisos dentro del mismo canal seguro utilizado para la administración remota, evitando la exposición de credenciales y simplificando el paso por firewalls y balanceadores que ya permiten SSH.

7.1 Fundamentos y relación con SSH

A diferencia de FTP, SFTP no define un protocolo independiente con canales separados; reusa la sesión SSH establecida entre cliente y servidor e intercambia mensajes binarios codificados en paquetes. Esta decisión hereda las capacidades de cifrado, compresión y tunelización de SSH sin requerir puertos adicionales.

El servidor proporciona el subsistema SFTP mediante configuraciones como Subsystem sftp internal-sftp en OpenSSH, mientras que los clientes solo necesitan contar con una implementación compatible para iniciar el canal.

7.2 Flujo de una sesión SFTP

La siguiente tabla resume las etapas más frecuentes de una transferencia:

Etapa Detalle Resultado esperado
Negociación SSH Intercambio de claves asimétricas y establecimiento de cifrado simétrico. Canal seguro listo para comandos.
Autenticación Contraseña, clave pública o ambos (autenticación multifactor). Acceso concedido al usuario definido.
Operaciones SFTP Mensajes para listar, crear directorios, transferir archivos y ajustar permisos. Transferencias fiables con confirmaciones por paquete.

Las respuestas incluyen códigos de estatus precisos que permiten detectar errores de autenticación, permisos insuficientes o archivos inexistentes.

7.3 Diferencias entre SFTP, FTP y FTPS

Los tres protocolos persiguen objetivos similares, pero difieren en su arquitectura:

Característica SFTP FTP FTPS
Canal Un solo canal SSH cifrado. Canales de control y datos separados en texto plano. FTP clásico + TLS.
Puertos 22/TCP único. 21/TCP y puertos altos dinámicos. 21/TCP + puertos altos, más negociación TLS.
Autenticación Contraseña o claves SSH. Usuario/contraseña en texto plano. Usuario/contraseña dentro de TLS.
Cifrado Obligatorio (algoritmos de SSH). No disponible. Opcional (implícito o explícito).

Esta comparación explica por qué SFTP se adopta en redes con requisitos estrictos: simplifica la configuración perimetral al utilizar el mismo puerto de administración remota.

7.4 Autenticación por contraseña o clave

SSH admite múltiples métodos, y SFTP hereda esa flexibilidad:

  • Contraseña: rápida de configurar pero depende de políticas robustas y rotación periódica.
  • Clave pública: el cliente posee una clave privada protegida y registra la clave pública en authorized_keys. Permite automatización segura y revocación granular.
  • Autenticación combinada: algunos servidores exigen clave + contraseña o clave + OTP para elevar la seguridad.

Para automatizar, se recomienda generar claves Ed25519 o RSA modernas y limitar sus permisos al directorio requerido mediante chroot o Match en la configuración de SSH.

7.5 Ejemplo práctico con la herramienta sftp

Las distribuciones modernas incluyen el cliente interactivo sftp, cuyo flujo se asemeja a un shell remoto:

sftp -i ~/.ssh/deploy_ed25519 usuario@files.corporativo.local
Connecting to files.corporativo.local...
sftp> pwd
Remote working directory: /datos/reportes
sftp> put ventas2025.csv
Uploading ventas2025.csv to /datos/reportes/ventas2025.csv
sftp> get inventario.xlsx
Fetching /datos/reportes/inventario.xlsx to inventario.xlsx
sftp> exit

Cada comando confirma el resultado y permite scriptar transferencias mediante archivos por lotes (sftp -b operaciones.txt).

7.6 Transferencias con scp y PowerShell

El comando scp reutiliza el mismo canal SSH pero con una sintaxis inspirada en cp. Puede ejecutarse desde PowerShell sin configuración adicional:

scp -i "C:\\Seguridad\\deploy_ed25519" `
  C:\\exportaciones\\resumen.pdf `
  usuario@files.corporativo.local:/datos/entradas/

Al completarse, el comando devuelve el control a PowerShell. Para descargas basta con invertir el orden de los argumentos o agregar el modificador -r para copiar directorios completos.

7.7 Automatización con Python

Bibliotecas como Paramiko exponen una API de alto nivel que permite programar transferencias seguras y reutilizar conexiones:

import paramiko
from pathlib import Path

host = "files.corporativo.local"
cliente = paramiko.SSHClient()
cliente.set_missing_host_key_policy(paramiko.AutoAddPolicy())
cliente.connect(hostname=host, username="deploy", key_filename="~/.ssh/deploy_ed25519")
with cliente.open_sftp() as sftp:
    local = Path("reportes/mensual.xlsx")
    remoto = f"/datos/reportes/{local.name}"
    sftp.put(local.as_posix(), remoto)
    print("Archivo enviado:", remoto)
cliente.close()

El código reutiliza el mismo par de claves configurado para SSH y permite integrarse en pipelines de entrega continua o tareas programadas.

7.8 Herramientas gráficas y soportes adicionales

Clientes como FileZilla soportan SFTP, FTPS y FTP desde una sola interfaz, con historial de sitios y verificación visual de huellas digitales. En entornos corporativos también se utilizan puertas de enlace administradas que inspeccionan las transferencias y aplican controles de DLP sin abandonar el canal cifrado.

7.9 Buenas prácticas y cierre

Mantener SFTP seguro implica restringir comandos a los estrictamente necesarios, habilitar registros detallados, rotar claves periódicamente y aprovechar controles de acceso basados en roles. Siempre que sea posible, combine SFTP con verificación de integridad de archivos y monitoreo de actividad para detectar usos indebidos. Con estas medidas, SFTP asegura la transferencia de archivos en escenarios donde FTP tradicional resulta insuficiente.