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.
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.
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.
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.
SSH admite múltiples métodos, y SFTP hereda esa flexibilidad:
authorized_keys. Permite automatización segura y revocación granular.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.
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).
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.
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.
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.
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.