Comment activer SFTP sans accès au shell sur Ubuntu 18.04

introduction

SFTP représente le protocoleSSHFileTransferP. Comme son nom l’indique, c’est un moyen sécurisé de transférer des fichiers entre ordinateurs à l’aide d’une connexion SSH chiffrée. Malgré son nom, il s’agit d’un protocole complètement différent de celui deFTP (FileTransferProtocol), bien qu’il soit largement pris en charge par les clients FTP modernes.

SFTP est disponible par défaut sans configuration supplémentaire sur tous les serveurs sur lesquels l'accès SSH est activé. Sécurisé et facile à utiliser, il présente toutefois un inconvénient: dans une configuration standard, le serveur SSH accorde l’accès au transfert de fichiers et l’interface terminal shell à tous les utilisateurs disposant d’un compte sur le système.

Dans certains cas, vous pouvez souhaiter que seuls certains utilisateurs soient autorisés à effectuer des transferts de fichiers et aucun accès SSH. Dans ce didacticiel, nous allons configurer le démon SSH de manière à limiter l’accès SFTP à un répertoire sans accès SSH autorisé par utilisateur.

Conditions préalables

Pour suivre ce didacticiel, vous devez avoir accès à un serveur Ubuntu 18.04. Ce serveur doit avoir un utilisateur non root avec les privilègessudo, ainsi qu'un pare-feu activé. Pour obtenir de l'aide sur la configuration, suivez nosInitial Server Setup Guide for Ubuntu 18.04.

[[step-1 -—- creating-a-new-user]] == Étape 1 - Création d'un nouvel utilisateur

Commencez par créer un nouvel utilisateur auquel seul le transfert de fichiers sera autorisé à accéder au serveur. Ici, nous utilisons le nom d'utilisateursammyfiles, mais vous pouvez utiliser le nom d'utilisateur de votre choix.

sudo adduser sammyfiles

Vous serez invité à créer un mot de passe pour le compte, suivi de quelques informations sur l'utilisateur. Les informations utilisateur sont facultatives, vous pouvez donc appuyer surENTER pour laisser ces champs vides.

Vous venez de créer un nouvel utilisateur qui se verra accorder l'accès au répertoire restreint. Dans l'étape suivante, nous allons créer le répertoire pour les transferts de fichiers et définir les autorisations nécessaires.

[[step-2 -—- creation-a-directory-for-file-transferts]] == Étape 2 - Création d'un répertoire pour les transferts de fichiers

Afin de limiter l’accès SFTP à un seul répertoire, nous devons d’abord nous assurer que le répertoire est conforme aux conditions d’autorisation du serveur SSH, qui sont très particulières.

Plus précisément, le répertoire lui-même et tous les répertoires situés au-dessus de lui dans l'arborescence du système de fichiers doivent appartenir àroot et ne peuvent être écrits par personne d'autre. Par conséquent, il n’est pas possible d’accorder simplement un accès restreint au répertoire personnel d’un utilisateur, car les répertoires personnels appartiennent à l’utilisateur et non àroot.

[.note] #Note: Certaines versions d'OpenSSH n'ont pas d'exigences aussi strictes pour la structure et la propriété des répertoires, mais la plupart des distributions Linux modernes (y compris Ubuntu 18.04) le font.
#

Il existe plusieurs façons de contourner ce problème de propriété. Dans ce didacticiel, nous allons créer et utiliser/var/sftp/uploads comme répertoire de téléchargement cible. /var/sftp appartiendra àroot et ne sera pas accessible en écriture par d'autres utilisateurs; le sous-répertoire/var/sftp/uploads appartiendra àsammyfiles, de sorte que l'utilisateur pourra y télécharger des fichiers.

Tout d'abord, créez les répertoires.

sudo mkdir -p /var/sftp/uploads

Définissez le propriétaire de/var/sftp surroot.

sudo chown root:root /var/sftp

Donnez àroot les droits d'écriture sur le même répertoire et donnez aux autres utilisateurs uniquement les droits de lecture et d'exécution.

sudo chmod 755 /var/sftp

Changez la propriété du répertoireuploads ensammyfiles.

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

Maintenant que la structure de répertoires est en place, nous pouvons configurer le serveur SSH lui-même.

[[step-3 -—- restricting-access-to-one-directory]] == Étape 3 - Restreindre l'accès à un répertoire

Dans cette étape, nous allons modifier la configuration du serveur SSH pour interdire l'accès au terminal poursammyfiles mais autoriser l'accès au transfert de fichiers.

Ouvrez le fichier de configuration du serveur SSH à l'aide denano ou de votre éditeur de texte préféré.

sudo nano /etc/ssh/sshd_config

Faites défiler jusqu'au bas du fichier et ajoutez l'extrait de configuration suivant:

/etc/ssh/sshd_config

. . .

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Puis enregistrez et fermez le fichier.

Voici ce que chacune de ces directives fait:

  • Match User indique au serveur SSH d'appliquer les commandes suivantes uniquement à l'utilisateur spécifié. Ici, nous spécifionssammyfiles.

  • ForceCommand internal-sftp force le serveur SSH à exécuter le serveur SFTP lors de la connexion, interdisant l'accès au shell.

  • PasswordAuthentication yes autorise l'authentification par mot de passe pour cet utilisateur.

  • ChrootDirectory /var/sftp/ garantit que l'utilisateur ne sera pas autorisé à accéder à quoi que ce soit au-delà du répertoire/var/sftp.

  • AllowAgentForwarding no,AllowTcpForwarding no. etX11Forwarding no désactive le transfert de port, le tunneling et le transfert X11 pour cet utilisateur.

Cet ensemble de commandes, commençant parMatch User, peut être copié et répété pour différents utilisateurs également. Assurez-vous de modifier le nom d'utilisateur dans la ligneMatch User en conséquence.

[.Remarque]##

Note: vous pouvez omettre la lignePasswordAuthentication yes et configurer à la place un accès par clé SSH pour une sécurité accrue. Suivez la sectionCopying your Public SSH Key du didacticielSSH Essentials: Working with SSH Servers, Clients, and Keys pour ce faire. Assurez-vous de le faire avant de désactiver l'accès au shell pour l'utilisateur.

Dans l'étape suivante, nous testerons la configuration en SSH localement avec un accès par mot de passe, mais si vous configurez des clés SSH, vous aurez plutôt besoin d'accéder à un ordinateur avec la paire de clés de l'utilisateur.

Pour appliquer les modifications de configuration, redémarrez le service.

sudo systemctl restart sshd

Vous avez maintenant configuré le serveur SSH pour restreindre l'accès au transfert de fichiers uniquement poursammyfiles. La dernière étape consiste à tester la configuration pour vous assurer qu'elle fonctionne comme prévu.

[[step-4 -—- verifying-the-configuration]] == Étape 4 - Vérification de la configuration

Veillons à ce que notre nouvel utilisateursammyfiles ne puisse transférer que des fichiers.

La connexion au serveur en tant quesammyfiles en utilisant un accès shell normal ne devrait plus être possible. Essayons:

ssh sammyfiles@localhost

Le message suivant s’affiche avant d’être renvoyé à votre invite initiale:

Error messageThis service allows sftp connections only.
Connection to localhost closed.

Cela signifie quesammyfiles ne peut plus accéder au shell du serveur en utilisant SSH.

Ensuite, vérifions si l’utilisateur peut accéder avec succès à SFTP pour le transfert de fichiers.

sftp sammyfiles@localhost

Au lieu d'un message d'erreur, cette commande affiche un message de connexion réussi avec une invite interactive.

SFTP promptConnected to localhost.
sftp>

Vous pouvez lister le contenu du répertoire en utilisantls dans l'invite:

ls

Cela affichera le répertoireuploads qui a été créé à l'étape précédente et vous ramènera à l'invitesftp>.

SFTP file list outputuploads

Pour vérifier que l'utilisateur est effectivement restreint à ce répertoire et ne peut accéder à aucun répertoire situé au-dessus, vous pouvez essayer de changer le répertoire.

cd ..

Cette commande ne générera pas d'erreur, mais le fait de répertorier le contenu du répertoire comme auparavant ne changera rien, ce qui prouvera que l'utilisateur n'a pas pu passer au répertoire parent.

Vous avez maintenant vérifié que la configuration restreinte fonctionne comme prévu. L'utilisateursammyfiles nouvellement créé ne peut accéder au serveur qu'en utilisant le protocole SFTP pour le transfert de fichiers et n'a pas la possibilité d'accéder au shell complet.

Conclusion

Vous avez limité un utilisateur à un accès SFTP uniquement à un répertoire unique sur un serveur sans accès shell complet. Bien que ce didacticiel utilise un seul répertoire et un seul utilisateur par souci de brièveté, vous pouvez étendre cet exemple à plusieurs utilisateurs et à plusieurs annuaires.

Le serveur SSH permet des schémas de configuration plus complexes, notamment la limitation de l'accès à des groupes ou à plusieurs utilisateurs à la fois, voire l'accès limité à certaines adresses IP. Vous pouvez trouver des exemples d'options de configuration supplémentaires et une explication des directives possibles dans lesOpenSSH Cookbook. Si vous rencontrez des problèmes avec SSH, vous pouvez les déboguer et les résoudre avec cetroubleshooting SSH series.