¿Cómo Solucionar Errores de Permiso Denegado en SFTP en Linux?

LinuxBeginner
Practicar Ahora

Introducción

SFTP (Secure File Transfer Protocol) es una solución potente y segura para la transferencia de archivos a través de una red. Este tutorial le guiará a través de la comprensión de SFTP, la solución de problemas de errores de 'Permission Denied' (Permiso Denegado) y la resolución de problemas de permisos de SFTP en su sistema Linux. Aprenderá a configurar un servidor SFTP, crear usuarios con los permisos apropiados y diagnosticar problemas de permisos comunes que ocurren durante las transferencias de archivos.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 88%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Configuración del Servidor SFTP en Ubuntu

SFTP (Secure File Transfer Protocol) proporciona un método seguro para transferir archivos entre sistemas. A diferencia del FTP normal, SFTP encripta tanto los comandos como los datos durante la transmisión, protegiendo su información del acceso no autorizado.

En este paso, configuraremos un servidor SFTP básico en nuestro sistema Ubuntu.

Instalación del Servidor OpenSSH

Primero, asegurémonos de que nuestro sistema esté actualizado e instalemos el servidor OpenSSH, que incluye las capacidades de SFTP:

sudo apt update
sudo apt install -y openssh-server

Después de ejecutar estos comandos, debería ver una salida similar a:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
openssh-server is already the newest version (1:8.9p1-3ubuntu0.1).

Verificación del Estado del Servicio SSH

Dado que estamos en un contenedor Docker, el comando systemctl estándar no funcionará. Verifiquemos si el servicio SSH se está ejecutando usando el comando de estado del proceso:

ps aux | grep sshd

Debería ver una salida que indique que sshd se está ejecutando:

root      1234  0.0  0.1  12016  5604 ?        Ss   10:20   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

Creación de un Usuario de Prueba para SFTP

Creemos un usuario dedicado para probar la funcionalidad SFTP:

sudo adduser sftpuser

Cuando se le solicite, ingrese una contraseña simple como password123 y puede presionar Enter para omitir los campos de información de usuario adicionales. Debería ver una salida similar a:

Adding user `sftpuser' ...
Adding new group `sftpuser' (1001) ...
Adding new user `sftpuser' (1001) with group `sftpuser' ...
Creating home directory `/home/sftpuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully

Creación de Archivos de Prueba para la Transferencia SFTP

Ahora, creemos algunos archivos de prueba en nuestro directorio de inicio que usaremos para las transferencias SFTP:

cd ~/project
echo "This is a test file for SFTP transfers" > testfile.txt
echo "This file has different permissions" > restrictedfile.txt

Verifiquemos que los archivos se crearon correctamente:

ls -l testfile.txt restrictedfile.txt

Debería ver una salida similar a:

-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 restrictedfile.txt
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 testfile.txt

De forma predeterminada, ambos archivos tienen permisos de lectura y escritura para el propietario y el grupo, y permisos de solo lectura para otros. Experimentaremos con el cambio de estos permisos en los siguientes pasos.

Comprensión de los Permisos de Archivo y su Impacto en SFTP

Antes de explorar los problemas de permisos de SFTP, comprendamos el sistema de permisos de archivos de Linux y cómo afecta a las operaciones de SFTP.

Conceptos Básicos de los Permisos de Archivo en Linux

En Linux, cada archivo y directorio tiene tres tipos de permisos:

  • Lectura (r): Permite ver el contenido del archivo o listar el contenido del directorio
  • Escritura (w): Permite modificar archivos o crear/eliminar archivos en un directorio
  • Ejecución (x): Permite ejecutar archivos o acceder a un directorio

Estos permisos se asignan a tres categorías de usuarios:

  • Propietario (Owner): El usuario que creó el archivo
  • Grupo (Group): El grupo asignado al archivo
  • Otros (Others): Todos los demás

Visualización de los Permisos Actuales

Verifiquemos los permisos actuales de nuestros archivos de prueba:

ls -l ~/project/testfile.txt ~/project/restrictedfile.txt

Verá una salida similar a:

-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt

La cadena de permisos -rw-rw-r-- se puede desglosar de la siguiente manera:

  • El primer carácter - indica un archivo regular (sería d para un directorio)
  • Los siguientes tres caracteres rw- muestran los permisos del propietario (lectura, escritura, sin ejecución)
  • Los siguientes tres caracteres rw- muestran los permisos del grupo (lectura, escritura, sin ejecución)
  • Los últimos tres caracteres r-- muestran los permisos de otros (solo lectura)

Modificación de los Permisos de Archivo

Modifiquemos los permisos de nuestros archivos para crear escenarios que podrían conducir a errores de permiso denegado en SFTP:

## Make testfile.txt readable by everyone but writable only by owner
chmod 644 ~/project/testfile.txt

## Make restrictedfile.txt accessible only to the owner
chmod 600 ~/project/restrictedfile.txt

Ahora, verifiquemos los cambios:

ls -l ~/project/testfile.txt ~/project/restrictedfile.txt

Debería ver los permisos actualizados:

-rw-r--r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw------- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt

Configuración de un Directorio para Pruebas SFTP

Creemos un directorio dedicado para las pruebas de SFTP:

mkdir -p ~/project/sftp_test
echo "This file is in the SFTP test directory" > ~/project/sftp_test/test_file.txt
chmod 755 ~/project/sftp_test

Ahora, creemos un directorio con permisos restringidos:

mkdir -p ~/project/restricted_sftp
echo "This file is in the restricted directory" > ~/project/restricted_sftp/restricted_file.txt
chmod 700 ~/project/restricted_sftp

Verifiquemos los permisos del directorio:

ls -ld ~/project/sftp_test ~/project/restricted_sftp

Debería ver:

drwxr-xr-x 2 labex labex 4096 Sep 28 10:35 /home/labex/project/sftp_test
drwx------ 2 labex labex 4096 Sep 28 10:35 /home/labex/project/restricted_sftp

Se puede acceder al directorio sftp_test por cualquier persona, mientras que solo el propietario (usuario labex) puede acceder al directorio restricted_sftp.

Experimentando y Diagnosticando Errores de Permiso Denegado en SFTP

En este paso, nos conectaremos a nuestro servidor SFTP y experimentaremos de primera mano los errores de permiso denegado. Esto nos ayudará a comprender cómo la configuración de permisos afecta a las operaciones de SFTP.

Conexión al Servidor SFTP Localmente

Dado que estamos trabajando en un entorno local, podemos conectarnos a nuestro servidor SFTP utilizando la dirección localhost. Conectémonos usando el usuario sftpuser que creamos anteriormente:

sftp sftpuser@localhost

Cuando se le solicite la contraseña, ingrese la contraseña que configuró para la cuenta sftpuser (por ejemplo, password123). Si la conexión es exitosa, verá un mensaje como:

Connected to localhost.
sftp>

Si encuentra problemas de conexión, podría deberse a que el servicio SSH no se está ejecutando correctamente en el contenedor. Puede intentar salir con exit y continuar con los siguientes pasos utilizando ejemplos teóricos.

Comandos Básicos de SFTP

Exploremos algunos comandos básicos de SFTP:

  1. Ver el directorio actual en el servidor remoto:
sftp> pwd
Remote working directory: /home/sftpuser
  1. Listar archivos en el directorio actual:
sftp> ls
  1. Navegar a un directorio diferente:
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
  1. Regresar a su directorio de inicio:
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser

Intentando Acceder a Archivos con Diferentes Permisos

Ahora, intentemos acceder a nuestros archivos de prueba desde la sesión SFTP:

  1. Intente obtener un archivo de nuestro directorio del proyecto:
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied

Notará un error de "Permission denied" (Permiso denegado). Esto se debe a que el usuario sftpuser no tiene permiso para acceder a los archivos en el directorio de inicio del usuario labex.

Salir de la Sesión SFTP

Salgamos de la sesión SFTP para continuar:

sftp> exit

Comprensión de los Errores de Permiso Denegado

Hay varias razones comunes para los errores de "Permission denied" (Permiso denegado) en SFTP:

  1. Permisos de Archivo: El usuario no tiene acceso de lectura/escritura al archivo
  2. Permisos de Directorio: El usuario no puede acceder al directorio que contiene el archivo
  3. Problemas de Propiedad: El archivo/directorio pertenece a un usuario o grupo diferente
  4. Restricciones de Travesía de Ruta: La configuración de SFTP podría restringir a los usuarios a ciertos directorios

Hagamos que uno de nuestros archivos de prueba sea accesible para nuestro usuario SFTP:

## Create a directory that can be accessed by others
mkdir -p /tmp/shared
echo "This is a shared file for SFTP testing" > /tmp/shared/shared_file.txt
chmod 777 /tmp/shared
chmod 666 /tmp/shared/shared_file.txt

Ahora, vuelva a conectarse a SFTP e intente acceder a este archivo:

sftp sftpuser@localhost

Después de conectarse, intente:

sftp> get /tmp/shared/shared_file.txt
Fetching /tmp/shared/shared_file.txt to shared_file.txt
/tmp/shared/shared_file.txt                        100%   36     1.0KB/s   00:00

Esto debería funcionar porque hemos dado a todos los permisos de lectura/escritura tanto al directorio como al archivo.

Salga de la sesión SFTP nuevamente:

sftp> exit

Uso de SFTP con Modo de Depuración

Para obtener más información sobre los errores de permiso, puede usar SFTP en modo de depuración:

sftp -v sftpuser@localhost

La salida detallada le mostrará información detallada sobre la conexión y cualquier error que ocurra:

debug1: Sending subsystem: sftp
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2876 bytes, in 0.1 seconds
Bytes per second: sent 30074.7, received 35857.2
debug1: Exit status 0

Resolución de Errores de Permiso Denegado en SFTP

Ahora que entendemos cómo los permisos afectan el acceso SFTP, aprendamos cómo resolver los errores comunes de permiso denegado.

Solución 1: Ajuste de los Permisos de Archivos y Directorios

La solución más directa a los problemas de permisos es ajustar los permisos de archivos y directorios. Creemos un nuevo caso de prueba:

## Create a new test file with restrictive permissions
echo "This file has restricted permissions" > ~/project/restricted_access.txt
chmod 600 ~/project/restricted_access.txt

Verifique los permisos actuales:

ls -l ~/project/restricted_access.txt

Salida:

-rw------- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt

Ahora, hagamos que este archivo sea accesible para otros cambiando sus permisos:

chmod 644 ~/project/restricted_access.txt
ls -l ~/project/restricted_access.txt

Salida:

-rw-r--r-- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt

Con estos permisos (644), el propietario del archivo (labex) puede leer y escribir en el archivo, mientras que los miembros del grupo y otros solo pueden leerlo.

Solución 2: Cambio de la Propiedad del Archivo

Otra solución es cambiar la propiedad de los archivos para que coincida con el usuario SFTP. Creemos otro archivo de prueba:

echo "This file will be owned by sftpuser" > ~/project/ownership_test.txt

Ahora, cambiemos la propiedad a nuestro usuario SFTP:

sudo chown sftpuser:sftpuser ~/project/ownership_test.txt
ls -l ~/project/ownership_test.txt

Salida:

-rw-rw-r-- 1 sftpuser sftpuser 36 Sep 28 11:10 /home/labex/project/ownership_test.txt

Ahora el archivo es propiedad de sftpuser, quien puede leer y escribir en él.

Solución 3: Creación de un Directorio Compartido

Una solución común para compartir archivos SFTP es crear un directorio con los permisos apropiados a los que puedan acceder varios usuarios:

## Create a new shared directory with appropriate permissions
mkdir -p /tmp/sftp_shared
sudo chown labex:labex /tmp/sftp_shared
chmod 755 /tmp/sftp_shared

## Create a subdirectory for uploads that's writable by everyone
mkdir -p /tmp/sftp_shared/uploads
chmod 777 /tmp/sftp_shared/uploads

## Create a sample file in the shared directory
echo "This file is in the shared SFTP directory" > /tmp/sftp_shared/sample.txt
chmod 644 /tmp/sftp_shared/sample.txt

Verifiquemos nuestra configuración:

ls -la /tmp/sftp_shared/

Salida:

total 12
drwxr-xr-x 3 labex   labex   4096 Sep 28 11:15 .
drwxrwxrwt 4 root    root    4096 Sep 28 11:15 ..
-rw-r--r-- 1 labex   labex     39 Sep 28 11:15 sample.txt
drwxrwxrwx 2 labex   labex   4096 Sep 28 11:15 uploads

Con esta configuración:

  • El directorio principal es legible y ejecutable por todos, pero solo escribible por el propietario
  • El subdirectorio de cargas es escribible por todos (adecuado para cargas SFTP)
  • El archivo sample.txt es legible por todos, pero solo escribible por el propietario

Esta configuración permite al usuario SFTP:

  • Navegar al directorio compartido
  • Leer el archivo de muestra
  • Cargar archivos en el directorio de cargas

Solución 4: Uso de ACLs para un Control más Detallado

Las Listas de Control de Acceso (ACLs) proporcionan una gestión de permisos más detallada. Instalemos el paquete necesario y usemos ACLs:

sudo apt install -y acl

Ahora, creemos un archivo y establezcamos permisos específicos usando ACLs:

echo "This file uses ACLs for permissions" > ~/project/acl_test.txt

## Set basic permissions
chmod 640 ~/project/acl_test.txt

## Add ACL permission for sftpuser
sudo setfacl -m u:sftpuser:r ~/project/acl_test.txt

## View the ACL settings
getfacl ~/project/acl_test.txt

Salida:

## file: /home/labex/project/acl_test.txt
## owner: labex
## group: labex
user::rw-
user:sftpuser:r--
group::r--
mask::r--
other::---

Esta configuración de ACL permite:

  • Al propietario del archivo (labex) leer y escribir
  • Al sftpuser leer el archivo
  • Al grupo leer el archivo
  • Otros no tienen acceso

Mejores Prácticas para la Gestión de Permisos SFTP

En este paso final, cubriremos algunas de las mejores prácticas para gestionar los permisos SFTP y solucionar los problemas de permisos de manera efectiva.

Creación de un Grupo de Usuarios SFTP Dedicado

Es una buena práctica crear un grupo dedicado para los usuarios SFTP:

sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser

Verifique que el usuario se haya agregado al grupo:

groups sftpuser

Salida:

sftpuser : sftpuser sftp_users

Configuración de un Directorio Gestionado por el Grupo

Ahora, creemos un directorio que sea gestionado por el grupo sftp_users:

## Create a new directory for the SFTP group
sudo mkdir -p /tmp/sftp_group_shared
sudo chown labex:sftp_users /tmp/sftp_group_shared
sudo chmod 770 /tmp/sftp_group_shared

## Set the SGID bit to ensure new files inherit the group
sudo chmod g+s /tmp/sftp_group_shared

## Create a test file in this directory
echo "This file is in the SFTP group directory" > /tmp/sftp_group_shared/group_file.txt

Verifiquemos los permisos:

ls -la /tmp/sftp_group_shared/

Salida:

total 12
drwxrws--- 2 labex    sftp_users 4096 Sep 28 11:25 .
drwxrwxrwt 5 root     root       4096 Sep 28 11:25 ..
-rw-rw-r-- 1 labex    sftp_users   42 Sep 28 11:25 group_file.txt

La s en los permisos del grupo indica que el bit SGID está configurado, lo que significa que los nuevos archivos creados en este directorio heredarán el grupo sftp_users.

Comandos Comunes de Solución de Problemas para Permisos SFTP

Al solucionar problemas de permisos SFTP, estos comandos son particularmente útiles:

  1. Verifique los permisos de los archivos:
ls -la /path/to/file
  1. Verifique los grupos de usuarios:
groups username
  1. Verifique los ID de usuario y grupo actuales:
id
  1. Vea los registros del servidor SFTP:
## In a production system, you would check system logs
## For our lab environment, we can simulate viewing logs
grep "sshd" /var/log/auth.log | tail
  1. Pruebe el acceso a archivos desde la línea de comandos:
sudo -u sftpuser cat /path/to/file

Árbol de Decisiones de Errores de Permiso Denegado

Cuando encuentre un error de permiso denegado en SFTP, siga este árbol de decisiones:

  1. ¿Puede el usuario SFTP acceder al directorio principal?

    • Verifique con: sudo -u sftpuser ls -la /path/to/directory/
    • Solucione con: chmod o+x /path/to/directory/
  2. ¿Puede el usuario SFTP leer el archivo?

    • Verifique con: sudo -u sftpuser cat /path/to/file
    • Solucione con: chmod o+r /path/to/file o setfacl -m u:sftpuser:r /path/to/file
  3. ¿Puede el usuario SFTP escribir en el archivo o directorio?

    • Verifique con: sudo -u sftpuser touch /path/to/directory/test_file
    • Solucione con: chmod o+w /path/to/directory/ o setfacl -m u:sftpuser:w /path/to/directory/

Creación de un Script de Prueba para Permisos SFTP

Creemos un script de prueba simple que verifique si el usuario SFTP puede acceder a archivos y directorios específicos:

cat > ~/project/check_sftp_permissions.sh << 'EOF'
#!/bin/bash

USER="sftpuser"
echo "Testing SFTP permissions for user: $USER"
echo "-------------------------------------------"

## Test directories
for DIR in /tmp/shared /tmp/sftp_shared /tmp/sftp_group_shared /home/labex/project; do
  echo -n "Can $USER access $DIR? "
  if sudo -u $USER ls -la $DIR &>/dev/null; then
    echo "YES"
  else
    echo "NO"
  fi
done

## Test files
for FILE in /tmp/shared/shared_file.txt /tmp/sftp_shared/sample.txt /home/labex/project/testfile.txt; do
  echo -n "Can $USER read $FILE? "
  if sudo -u $USER cat $FILE &>/dev/null; then
    echo "YES"
  else
    echo "NO"
  fi
done

echo "-------------------------------------------"
echo "Testing complete!"
EOF

chmod +x ~/project/check_sftp_permissions.sh

Ahora ejecute el script de prueba:

sudo ~/project/check_sftp_permissions.sh

Debería ver una salida que indica a qué directorios y archivos puede acceder el usuario SFTP. Esto le ayuda a identificar los problemas de permisos rápidamente.

Consejos Finales para la Gestión de Permisos SFTP

  1. Utilice el principio del mínimo privilegio: Solo otorgue los permisos mínimos necesarios
  2. Audite los permisos regularmente: Use herramientas como find para identificar archivos con permisos inapropiados
  3. Documente su estructura de permisos: Realice un seguimiento de qué usuarios y grupos tienen acceso a qué directorios
  4. Considere el uso de jaulas chroot SFTP: Para entornos de producción, restrinja a los usuarios a directorios específicos
  5. Pruebe desde la perspectiva del usuario: Siempre verifique los permisos probando como el usuario SFTP real

Resumen

En este tutorial, ha aprendido a configurar un servidor SFTP, crear usuarios con los permisos apropiados y solucionar los errores comunes de permiso denegado. Ha adquirido experiencia práctica con:

  • La instalación y configuración de un servidor SFTP en Ubuntu
  • La comprensión de los permisos de archivos de Linux y su impacto en el acceso SFTP
  • La experiencia y el diagnóstico de errores de permiso denegado
  • La implementación de varias soluciones para resolver problemas de permisos
  • La aplicación de las mejores prácticas para la gestión de permisos SFTP

Estas habilidades le ayudarán a gestionar eficazmente las transferencias de archivos en un entorno seguro, minimizando los problemas relacionados con los permisos. Recuerde que la gestión adecuada de los permisos es esencial para mantener un servidor SFTP seguro y funcional, equilibrando los requisitos de seguridad con las necesidades de acceso de los usuarios.