Tarde o temprano hace falta subir al servidor los archivos de un sitio web, descargar una copia de seguridad o corregir un archivo de configuración en un editor cómodo de tu propio ordenador. Para eso existe SFTP, un protocolo de transferencia de archivos que funciona sobre SSH. Si ya te conectas al servidor por SSH, SFTP ya lo tienes y no hace falta instalar nada más. En este artículo veremos cómo funciona SFTP, aprenderemos a transferir archivos desde el terminal y con FileZilla, y después crearemos un usuario aparte que solo puede trabajar con los archivos de una carpeta y no puede entrar al servidor por SSH. Hemos probado todos los ejemplos en un servidor de pruebas con Debian 12.
Cómo funciona SFTP
A pesar del nombre parecido, SFTP no tiene nada que ver con el viejo protocolo FTP. Es una parte de SSH. Cuando te conectas por SFTP, el cliente abre una conexión SSH normal al puerto 22, pasa la misma comprobación de contraseña o de clave y, en lugar de la línea de comandos, inicia en el servidor un programa especial para trabajar con archivos. En la configuración de SSH de nuestro servidor con Debian 12 viene activado por defecto con la línea Subsystem sftp /usr/lib/openssh/sftp-server.
De aquí se desprenden tres propiedades prácticas. En primer lugar, todo lo que se transmite se cifra igual que una sesión SSH, así que ni la contraseña ni los archivos viajan por la red en texto abierto. En segundo lugar, no hace falta abrir puertos nuevos en el cortafuegos ni instalar un servidor FTP aparte. En tercer lugar, para entrar sirven los mismos usuarios y claves que para SSH.
Esto también tiene su lado malo. Un usuario normal que puede conectarse por SFTP también puede entrar por SSH y ver todos los archivos que tiene permiso para leer. Si una persona necesita acceso solo para subir archivos, por ejemplo el desarrollador de un sitio web, es mejor crearle un usuario que tenga solo SFTP y solo una carpeta. Esto se hace con las herramientas integradas de SSH, y lo veremos en el paso 3.
Qué necesitas
- Un servidor con Debian 12 o Ubuntu 24.04 y acceso a él por SSH. Cómo conectarte se explica en el artículo sobre Termius.
- El programa
sftpen tu ordenador. En macOS y Linux ya viene instalado. En Windows 10 y 11 forma parte del componente OpenSSH Client. Si el comando no se encuentra, añade este componente en la sección de características opcionales de Windows, Optional Features.
Paso 1. Conéctate por SFTP desde el terminal
Abre el terminal en tu ordenador y conéctate al servidor. En lugar de IP-del-servidor, indica la dirección de tu VPS.
sftp root@IP-del-servidorEl programa te pedirá la contraseña, como en una conexión SSH normal, y en la primera conexión te pedirá que confirmes la clave del servidor. Si has reinstalado el servidor y ha aparecido el aviso de que la clave ha cambiado, te ayudará el artículo sobre REMOTE HOST IDENTIFICATION HAS CHANGED. Después de entrar aparecerá el indicador sftp>.
Paso 2. Transfiere archivos
En una sesión SFTP tienes dos directorios actuales, el del servidor y el de tu ordenador. Los comandos para el servidor se escriben como siempre, y los de tu ordenador, con la letra l al principio, de la palabra local.
| Comando | Qué hace |
|---|---|
pwd y lpwd | Mostrar la carpeta actual en el servidor y en el ordenador |
ls y lls | Lista de archivos en el servidor y en el ordenador |
cd y lcd | Ir a una carpeta en el servidor y en el ordenador |
put archivo | Subir un archivo del ordenador al servidor |
get archivo | Descargar un archivo del servidor al ordenador |
put -R carpeta y get -R carpeta | Subir o descargar una carpeta entera |
reput archivo y reget archivo | Continuar una subida o una descarga interrumpida |
mkdir, rm, rename | Crear una carpeta, borrar un archivo, cambiar el nombre |
bye | Cerrar la sesión |
A continuación verás una sesión real desde nuestro ordenador. Creamos una carpeta en el servidor, subimos a ella un archivo, comprobamos que estaba en su sitio y lo descargamos de vuelta con otro nombre.
mkdir site-backup
cd site-backup
put report.txt
ls -l
get report.txt report-copy.txt
bye
El archivo se ha subido al servidor y se ha descargado de vuelta
El comando put toma el archivo de la carpeta actual de tu ordenador, y get guarda el archivo en esa misma carpeta. Por eso, antes de empezar conviene ir con el comando lcd a la carpeta que necesites en tu ordenador.
Cómo conectarse con FileZilla
Si te resulta más cómodo arrastrar los archivos con el ratón, usa FileZilla, un programa gratuito para Windows, macOS y Linux. Según las instrucciones oficiales de FileZilla, la conexión por SFTP se hace así.
- En la barra de conexión rápida de la parte superior de la ventana, escribe en el campo de la dirección la dirección del servidor con el prefijo
sftp://, por ejemplosftp://203.0.113.10. - Indica el nombre de usuario y la contraseña.
- El puerto puedes dejarlo vacío, para SFTP se usa por defecto el 22.
- Pulsa el botón de conexión rápida Quickconnect o la tecla Enter.
Después de conectarte, a la izquierda verás los archivos de tu ordenador y a la derecha, los del servidor. Los archivos se pasan de un lado a otro arrastrándolos.
No olvides el prefijo sftp://
Sin él, FileZilla se conectará por FTP normal al puerto 21. En un VPS donde no hay servidor FTP, esa conexión no funcionará.
Paso 3. Crea un usuario solo para SFTP
Ahora crearemos el usuario sftpuser, que podrá trabajar con los archivos solo en una carpeta y no podrá entrar por SSH. Para eso, SSH sabe encerrar al usuario en un directorio con ayuda de chroot. Para ese usuario, la carpeta indicada se convierte en la raíz del sistema de archivos y no puede subir más arriba.
chroot tiene una regla estricta. La propia carpeta en la que se encierra al usuario y todas las carpetas por encima de ella deben pertenecer a root, y nadie más que root debe tener permiso de escritura en ellas. Por eso, el usuario pondrá los archivos en una subcarpeta files, que ya le pertenece a él.
Crea un grupo y un usuario sin acceso a la línea de comandos.
bashgroupadd sftponly useradd -m -d /home/sftpuser -s /usr/sbin/nologin -G sftponly sftpuser passwd sftpuserEl comando
passwdte pedirá que introduzcas dos veces la contraseña del nuevo usuario. Con esa contraseña se conectará por SFTP.Crea la carpeta para chroot y la carpeta para los archivos con los propietarios correctos.
bashmkdir -p /srv/sftp/sftpuser/files chown root:root /srv/sftp /srv/sftp/sftpuser chmod 755 /srv/sftp /srv/sftp/sftpuser chown sftpuser:sftpuser /srv/sftp/sftpuser/filesHaz una copia de seguridad de los ajustes de SSH y ábrelos.
bashcp /etc/ssh/sshd_config /root/sshd_config.bak nano /etc/ssh/sshd_configAñade al final del todo del archivo el bloque de abajo y guarda el archivo. SSH sustituirá
%upor el nombre del usuario, así que un solo bloque sirve para todos los futuros usuarios del gruposftponly.bashMatch Group sftponly ChrootDirectory /srv/sftp/%u ForceCommand internal-sftp -d /files AllowTcpForwarding no X11Forwarding noComprueba los ajustes y aplícalos. Si
sshd -tmuestra un error, no recargues SSH, corrige el archivo.bashsshd -t && systemctl reload ssh
No cierres la conexión actual
Mientras cambias los ajustes de SSH, mantén abierta la ventana en la que trabajas. Primero comprueba en una ventana nueva que la entrada al servidor sigue funcionando y solo después cierra la antigua. Nosotros lo hicimos así, y la entrada de root siguió funcionando después del cambio.
Conéctate con el nuevo usuario con el comando sftp sftpuser@IP-del-servidor. Aparece enseguida en la carpeta /files, puede subir archivos a ella y no puede subir más arriba. En la raíz solo ve la carpeta files, y la carpeta /etc del servidor para él sencillamente no existe.

El usuario está encerrado en su carpeta
Si ese mismo usuario intenta entrar por SSH, el servidor responderá This service allows sftp connections only. y cerrará la conexión.
Para añadir otro usuario así, repite los pasos 1 y 2 con su nombre. No hace falta cambiar el bloque de sshd_config.
Preguntas frecuentes
fatal: bad ownership or modes for chroot directory
La carpeta chroot o una de las carpetas por encima de ella no pertenece a root o tiene permiso de escritura para alguien más. El cliente solo ve Connection closed, pero la causa se puede encontrar en el registro con el comando journalctl -u ssh -n 20. Nosotros obtuvimos este error cuando hicimos propietario de /srv/sftp/sftpuser al propio usuario. Devuelve el propietario con los comandos chown root:root /srv/sftp/sftpuser y chmod 755 /srv/sftp/sftpuser.
dest open "/report.txt": Permission denied
El usuario intenta escribir un archivo en la raíz de su carpeta chroot, y esa carpeta pertenece a root. Así debe ser. Los archivos hay que ponerlos en la subcarpeta files, a la que el usuario llega nada más entrar.
This service allows sftp connections only.
Esto no es un error. Un usuario del grupo sftponly solo puede trabajar por SFTP, y se le prohíbe entrar a la línea de comandos por SSH.
Permission denied (publickey,password)
El servidor no ha aceptado ni la clave ni la contraseña. Obtuvimos este error al conectarnos con el usuario sftpuser sin clave y sin contraseña. Comprueba el nombre de usuario y la contraseña, y si todavía no has puesto una contraseña, créala con el comando passwd sftpuser. Si entras con clave, la clave pública hay que ponerla en /home/sftpuser/.ssh/authorized_keys, justo en la carpeta personal y no en la carpeta chroot. Encontrarás más información sobre las claves en el artículo sobre las claves SSH.
Nuestros recursos
Canal de Telegram: https://t.me/f3cloud_news
Web del hosting: https://f3cloud.com