Comment dépanner les erreurs SFTP « Permission refusée » sur Linux

LinuxBeginner
Pratiquer maintenant

Introduction

Le SFTP (Secure File Transfer Protocol) est une solution puissante et sécurisée pour le transfert de fichiers sur un réseau. Ce tutoriel vous guidera à travers la compréhension du SFTP, le dépannage des erreurs "Permission Denied" (Permission refusée), et la résolution des problèmes de permissions SFTP sur votre système Linux. Vous apprendrez comment configurer un serveur SFTP, créer des utilisateurs avec les permissions appropriées, et diagnostiquer les problèmes de permissions courants qui surviennent lors des transferts de fichiers.

Configuration d'un serveur SFTP sur Ubuntu

Le SFTP (Secure File Transfer Protocol) fournit une méthode sécurisée pour le transfert de fichiers entre systèmes. Contrairement au FTP classique, le SFTP chiffre à la fois les commandes et les données pendant la transmission, protégeant ainsi vos informations contre tout accès non autorisé.

Dans cette étape, nous allons configurer un serveur SFTP de base sur notre système Ubuntu.

Installation du serveur OpenSSH

Tout d'abord, assurons-nous que notre système est à jour et installons le serveur OpenSSH, qui inclut les capacités SFTP :

sudo apt update
sudo apt install -y openssh-server

Après avoir exécuté ces commandes, vous devriez voir une sortie similaire à :

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

Vérification de l'état du service SSH

Étant donné que nous sommes dans un conteneur Docker, la commande systemctl standard ne fonctionnera pas. Vérifions si le service SSH est en cours d'exécution à l'aide de la commande d'état du processus :

ps aux | grep sshd

Vous devriez voir une sortie indiquant que sshd est en cours d'exécution :

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

Création d'un utilisateur de test pour SFTP

Créons un utilisateur dédié pour tester la fonctionnalité SFTP :

sudo adduser sftpuser

Lorsque vous y êtes invité, entrez un mot de passe simple comme password123 et vous pouvez appuyer sur Entrée pour ignorer les champs d'informations utilisateur supplémentaires. Vous devriez voir une sortie similaire à :

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

Création de fichiers de test pour le transfert SFTP

Maintenant, créons quelques fichiers de test dans notre répertoire personnel que nous utiliserons pour les transferts SFTP :

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

Vérifions que les fichiers ont été créés correctement :

ls -l testfile.txt restrictedfile.txt

Vous devriez voir une sortie similaire à :

-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

Par défaut, les deux fichiers ont des permissions de lecture et d'écriture pour le propriétaire et le groupe, et des permissions de lecture seule pour les autres. Nous allons expérimenter la modification de ces permissions dans les étapes suivantes.

Comprendre les permissions de fichiers et leur impact sur SFTP

Avant d'explorer les problèmes de permissions SFTP, comprenons le système de permissions de fichiers Linux et comment il affecte les opérations SFTP.

Notions de base sur les permissions de fichiers Linux

Sous Linux, chaque fichier et répertoire possède trois types de permissions :

  • Lecture (r) : Permet de visualiser le contenu du fichier ou de lister le contenu du répertoire
  • Écriture (w) : Permet de modifier les fichiers ou de créer/supprimer des fichiers dans un répertoire
  • Exécution (x) : Permet d'exécuter des fichiers ou d'accéder à un répertoire

Ces permissions sont attribuées à trois catégories d'utilisateurs :

  • Propriétaire (Owner) : L'utilisateur qui a créé le fichier
  • Groupe (Group) : Le groupe attribué au fichier
  • Autres (Others) : Tous les autres

Visualisation des permissions actuelles

Vérifions les permissions actuelles de nos fichiers de test :

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

Vous verrez une sortie similaire à :

-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 chaîne de permissions -rw-rw-r-- peut être décomposée comme suit :

  • Le premier caractère - indique un fichier régulier (serait d pour un répertoire)
  • Les trois caractères suivants rw- montrent les permissions du propriétaire (lecture, écriture, pas d'exécution)
  • Les trois caractères suivants rw- montrent les permissions du groupe (lecture, écriture, pas d'exécution)
  • Les trois derniers caractères r-- montrent les permissions des autres (lecture seule)

Modification des permissions de fichiers

Modifions les permissions de nos fichiers pour créer des scénarios qui pourraient entraîner des erreurs de permission refusée (permission denied) en SFTP :

## Rendre testfile.txt lisible par tous, mais accessible en écriture uniquement par le propriétaire
chmod 644 ~/project/testfile.txt

## Rendre restrictedfile.txt accessible uniquement au propriétaire
chmod 600 ~/project/restrictedfile.txt

Maintenant, vérifions les modifications :

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

Vous devriez voir les permissions mises à jour :

-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

Configuration d'un répertoire pour les tests SFTP

Créons un répertoire dédié aux tests 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

Maintenant, créons un répertoire avec des permissions restreintes :

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

Vérifions les permissions du répertoire :

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

Vous devriez voir :

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

Le répertoire sftp_test est accessible par tout le monde, tandis que le répertoire restricted_sftp n'est accessible que par le propriétaire (utilisateur labex).

Expérimenter et diagnostiquer les erreurs de permission refusée (Permission Denied) en SFTP

Dans cette étape, nous allons nous connecter à notre serveur SFTP et expérimenter directement les erreurs de permission refusée. Cela nous aidera à comprendre comment les paramètres de permission affectent les opérations SFTP.

Connexion au serveur SFTP localement

Puisque nous travaillons dans un environnement local, nous pouvons nous connecter à notre serveur SFTP en utilisant l'adresse localhost. Connectons-nous en utilisant l'utilisateur sftpuser que nous avons créé précédemment :

sftp sftpuser@localhost

Lorsque vous êtes invité à entrer le mot de passe, entrez le mot de passe que vous avez défini pour le compte sftpuser (par exemple, password123). Si la connexion réussit, vous verrez une invite comme :

Connected to localhost.
sftp>

Si vous rencontrez des problèmes de connexion, cela peut être dû au fait que le service SSH ne fonctionne pas correctement dans le conteneur. Vous pouvez essayer de quitter avec exit et de poursuivre les étapes suivantes en utilisant des exemples théoriques.

Commandes SFTP de base

Explorons quelques commandes SFTP de base :

  1. Afficher le répertoire courant sur le serveur distant :
sftp> pwd
Remote working directory: /home/sftpuser
  1. Lister les fichiers dans le répertoire courant :
sftp> ls
  1. Naviguer vers un autre répertoire :
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
  1. Revenir à votre répertoire personnel :
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser

Tentative d'accès aux fichiers avec différentes permissions

Maintenant, essayons d'accéder à nos fichiers de test depuis la session SFTP :

  1. Essayez d'obtenir un fichier de notre répertoire projet :
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied

Vous remarquerez une erreur "Permission denied". C'est parce que l'utilisateur sftpuser n'a pas la permission d'accéder aux fichiers dans le répertoire personnel de l'utilisateur labex.

Quitter la session SFTP

Quittons la session SFTP pour continuer :

sftp> exit

Comprendre les erreurs de permission refusée

Il existe plusieurs raisons courantes pour les erreurs "Permission denied" en SFTP :

  1. Permissions de fichier : L'utilisateur n'a pas d'accès en lecture/écriture au fichier
  2. Permissions de répertoire : L'utilisateur ne peut pas accéder au répertoire contenant le fichier
  3. Problèmes de propriété : Le fichier/répertoire appartient à un autre utilisateur ou groupe
  4. Restrictions de parcours de chemin : La configuration SFTP peut restreindre les utilisateurs à certains répertoires

Rendons l'un de nos fichiers de test accessible à notre utilisateur SFTP :

## Créer un répertoire accessible par tous
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

Maintenant, reconnectez-vous à SFTP et essayez d'accéder à ce fichier :

sftp sftpuser@localhost

Après la connexion, essayez :

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

Cela devrait fonctionner car nous avons donné à tout le monde les permissions de lecture/écriture pour le répertoire et le fichier.

Quittez à nouveau la session SFTP :

sftp> exit

Utilisation de SFTP avec le mode débogage

Pour obtenir plus d'informations sur les erreurs de permission, vous pouvez utiliser SFTP en mode débogage :

sftp -v sftpuser@localhost

La sortie verbose vous montrera des informations détaillées sur la connexion et toutes les erreurs qui se produisent :

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

Résoudre les erreurs de permission refusée (Permission Denied) en SFTP

Maintenant que nous comprenons comment les permissions affectent l'accès SFTP, apprenons à résoudre les erreurs de permission refusée courantes.

Solution 1 : Ajuster les permissions des fichiers et des répertoires

La solution la plus simple aux problèmes de permission est d'ajuster les permissions des fichiers et des répertoires. Créons un nouveau cas de test :

## Créer un nouveau fichier de test avec des permissions restrictives
echo "This file has restricted permissions" > ~/project/restricted_access.txt
chmod 600 ~/project/restricted_access.txt

Vérifiez les permissions actuelles :

ls -l ~/project/restricted_access.txt

Sortie :

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

Maintenant, rendons ce fichier accessible aux autres en modifiant ses permissions :

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

Sortie :

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

Avec ces permissions (644), le propriétaire du fichier (labex) peut lire et écrire dans le fichier, tandis que les membres du groupe et les autres ne peuvent que le lire.

Solution 2 : Modifier la propriété du fichier

Une autre solution consiste à modifier la propriété des fichiers pour qu'elle corresponde à l'utilisateur SFTP. Créons un autre fichier de test :

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

Maintenant, modifions la propriété pour notre utilisateur SFTP :

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

Sortie :

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

Maintenant, le fichier appartient à sftpuser, qui peut le lire et y écrire.

Solution 3 : Créer un répertoire partagé

Une solution courante pour le partage de fichiers SFTP consiste à créer un répertoire avec les permissions appropriées auquel plusieurs utilisateurs peuvent accéder :

## Créer un nouveau répertoire partagé avec les permissions appropriées
mkdir -p /tmp/sftp_shared
sudo chown labex:labex /tmp/sftp_shared
chmod 755 /tmp/sftp_shared

## Créer un sous-répertoire pour les téléchargements accessible en écriture par tous
mkdir -p /tmp/sftp_shared/uploads
chmod 777 /tmp/sftp_shared/uploads

## Créer un exemple de fichier dans le répertoire partagé
echo "This file is in the shared SFTP directory" > /tmp/sftp_shared/sample.txt
chmod 644 /tmp/sftp_shared/sample.txt

Vérifions notre configuration :

ls -la /tmp/sftp_shared/

Sortie :

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

Avec cette configuration :

  • Le répertoire principal est lisible et exécutable par tous, mais accessible en écriture uniquement par le propriétaire
  • Le sous-répertoire uploads est accessible en écriture par tous (adapté aux téléchargements SFTP)
  • Le fichier sample.txt est lisible par tous mais accessible en écriture uniquement par le propriétaire

Cette configuration permet à l'utilisateur SFTP de :

  • Naviguer vers le répertoire partagé
  • Lire le fichier exemple
  • Télécharger des fichiers dans le répertoire uploads

Solution 4 : Utiliser les ACL pour un contrôle plus précis

Les listes de contrôle d'accès (ACL) fournissent une gestion des permissions plus détaillée. Installons le paquet nécessaire et utilisons les ACL :

sudo apt install -y acl

Maintenant, créons un fichier et définissons des permissions spécifiques à l'aide des ACL :

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

## Définir les permissions de base
chmod 640 ~/project/acl_test.txt

## Ajouter la permission ACL pour sftpuser
sudo setfacl -m u:sftpuser:r ~/project/acl_test.txt

## Afficher les paramètres ACL
getfacl ~/project/acl_test.txt

Sortie :

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

Cette configuration ACL permet :

  • Au propriétaire du fichier (labex) de lire et d'écrire
  • À sftpuser de lire le fichier
  • Au groupe de lire le fichier
  • Aux autres de ne pas avoir accès

Bonnes pratiques pour la gestion des permissions SFTP

Dans cette dernière étape, nous allons aborder quelques bonnes pratiques pour gérer les permissions SFTP et dépanner efficacement les problèmes de permission.

Création d'un groupe d'utilisateurs SFTP dédié

C'est une bonne pratique de créer un groupe dédié aux utilisateurs SFTP :

sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser

Vérifiez que l'utilisateur a été ajouté au groupe :

groups sftpuser

Sortie :

sftpuser : sftpuser sftp_users

Configuration d'un répertoire géré par le groupe

Créons maintenant un répertoire géré par le groupe sftp_users :

## Créer un nouveau répertoire pour le groupe SFTP
sudo mkdir -p /tmp/sftp_group_shared
sudo chown labex:sftp_users /tmp/sftp_group_shared
sudo chmod 770 /tmp/sftp_group_shared

## Définir le bit SGID pour s'assurer que les nouveaux fichiers héritent du groupe
sudo chmod g+s /tmp/sftp_group_shared

## Créer un fichier de test dans ce répertoire
echo "This file is in the SFTP group directory" > /tmp/sftp_group_shared/group_file.txt

Vérifions les permissions :

ls -la /tmp/sftp_group_shared/

Sortie :

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

Le s dans les permissions du groupe indique que le bit SGID est défini, ce qui signifie que les nouveaux fichiers créés dans ce répertoire hériteront du groupe sftp_users.

Commandes de dépannage courantes pour les permissions SFTP

Lors du dépannage des problèmes de permission SFTP, ces commandes sont particulièrement utiles :

  1. Vérifier les permissions des fichiers :
ls -la /path/to/file
  1. Vérifier les groupes d'utilisateurs :
groups username
  1. Vérifier les ID d'utilisateur et de groupe actuels :
id
  1. Afficher les journaux du serveur SFTP :
## Dans un système de production, vous vérifieriez les journaux système
## Pour notre environnement de laboratoire, nous pouvons simuler l'affichage des journaux
grep "sshd" /var/log/auth.log | tail
  1. Tester l'accès aux fichiers depuis la ligne de commande :
sudo -u sftpuser cat /path/to/file

Arbre de décision des erreurs de permission refusée

Lorsque vous rencontrez une erreur de permission refusée en SFTP, suivez cet arbre de décision :

  1. L'utilisateur SFTP peut-il accéder au répertoire parent ?

    • Vérifiez avec : sudo -u sftpuser ls -la /path/to/directory/
    • Corrigez avec : chmod o+x /path/to/directory/
  2. L'utilisateur SFTP peut-il lire le fichier ?

    • Vérifiez avec : sudo -u sftpuser cat /path/to/file
    • Corrigez avec : chmod o+r /path/to/file ou setfacl -m u:sftpuser:r /path/to/file
  3. L'utilisateur SFTP peut-il écrire dans le fichier ou le répertoire ?

    • Vérifiez avec : sudo -u sftpuser touch /path/to/directory/test_file
    • Corrigez avec : chmod o+w /path/to/directory/ ou setfacl -m u:sftpuser:w /path/to/directory/

Création d'un script de test pour les permissions SFTP

Créons un script de test simple qui vérifie si l'utilisateur SFTP peut accéder à des fichiers et des répertoires spécifiques :

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

Maintenant, exécutez le script de test :

sudo ~/project/check_sftp_permissions.sh

Vous devriez voir une sortie indiquant quels répertoires et fichiers l'utilisateur SFTP peut accéder. Cela vous aide à identifier rapidement les problèmes de permission.

Conseils finaux pour la gestion des permissions SFTP

  1. Utilisez le principe du moindre privilège : N'accordez que les permissions minimales nécessaires
  2. Auditez régulièrement les permissions : Utilisez des outils comme find pour identifier les fichiers avec des permissions inappropriées
  3. Documentez votre structure de permissions : Gardez une trace des utilisateurs et des groupes qui ont accès à quels répertoires
  4. Envisagez d'utiliser les chroot jails SFTP : Pour les environnements de production, limitez les utilisateurs à des répertoires spécifiques
  5. Testez du point de vue de l'utilisateur : Vérifiez toujours les permissions en testant en tant qu'utilisateur SFTP réel

Résumé

Dans ce tutoriel, vous avez appris à configurer un serveur SFTP, à créer des utilisateurs avec les permissions appropriées et à dépanner les erreurs courantes de permission refusée. Vous avez acquis une expérience pratique avec :

  • L'installation et la configuration d'un serveur SFTP sur Ubuntu
  • La compréhension des permissions de fichiers Linux et de leur impact sur l'accès SFTP
  • L'expérience et le diagnostic des erreurs de permission refusée
  • La mise en œuvre de diverses solutions pour résoudre les problèmes de permission
  • L'application des meilleures pratiques pour la gestion des permissions SFTP

Ces compétences vous aideront à gérer efficacement les transferts de fichiers dans un environnement sécurisé tout en minimisant les problèmes liés aux permissions. Rappelez-vous qu'une gestion appropriée des permissions est essentielle pour maintenir un serveur SFTP sécurisé mais fonctionnel, en équilibrant les exigences de sécurité avec les besoins d'accès des utilisateurs.