138 votes

Comment puis-je chrooter les utilisateurs de sftp-only SSH dans leurs maisons ?

Je veux donner à un client l'accès à mon serveur, mais je veux limiter ces utilisateurs à leurs répertoires personnels. Je vais lier le montage de tous les fichiers que je veux qu'ils puissent voir.

J'ai créé un utilisateur appelé bob et l'a ajouté à un nouveau groupe appelé sftponly . Ils ont un répertoire personnel à l'adresse /home/bob . J'ai changé leur Shell en /bin/false pour arrêter les connexions SSH. Voici leur /etc/passwd ligne :

bob:x:1001:1002::/home/bob:/bin/false

J'ai également modifié le /etc/ssh/sshd_config pour inclure les éléments suivants :

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Lorsque j'essaie de me connecter en tant que tel, voici ce que je vois

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Si je commente le ChrootDirectory Je peux me connecter par SFTP, mais ils ont alors le champ libre sur le serveur. J'ai constaté que ChrootDirectory /home fonctionne, mais il leur donne toujours accès à n'importe quel répertoire personnel. J'ai explicitement essayé ChrootDirectory /home/bob mais ça ne marche pas non plus.

Qu'est-ce que je fais de mal ? Comment puis-je limiter bob à /home/bob/ ?

----EDIT-----

Ok, donc je viens de jeter un coup d'oeil à /var/log/auth.log et j'ai vu ça :

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Je ne suis pas entièrement sûr de ce qui se passe ici, mais cela suggère que quelque chose ne va pas avec le répertoire utilisateur. Voici le ls -h /home sortie :

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

135voto

Mufaka Points 54

Tout ce mal est dû à plusieurs problèmes de sécurité comme décrit ici . Fondamentalement, le répertoire chroot doit appartenir à root et il ne peut pas y avoir d'accès en écriture de groupe. Charmant. Donc vous avez essentiellement besoin de transformer votre chroot en cellule de détention et dans que vous pouvez avoir votre contenu modifiable.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

Et bam, vous pouvez vous connecter et écrire en /writable .

64voto

Boyd Points 681

Pour chrooter un répertoire SFTP, vous devez

  1. Créer un utilisateur et forcer root à être propriétaire de celui-ci

    sudo mkdir /home/john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
  2. Changez l'emplacement du sous-système sur /etc/ssh/sshd_config :

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp

    et créez une section utilisateur à la fin du fichier (ssh peut mourir en respawning s'il est placé après Sous-système ligne) :

    Match User john
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no

8voto

mihai.ile Points 91

J'ai passé toute la journée à essayer d'obtenir un partage de réseau sur mon raspberry. Je voulais verrouiller l'utilisateur pour qu'il ne puisse pas naviguer dans tout le système de fichiers, pas d'accès à la connexion ssh et je voulais avoir un accès en écriture au partage réseau.

Et voici comment je l'ai fait fonctionner :

J'ai d'abord créé un utilisateur :

sudo useradd netdrive

Puis édité /etc/passwd et s'assurer qu'il a /bin/false pour l'utilisateur, donc la ligne était :

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

J'ai édité /etc/ssh/sshd_config à inclure :

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Changement du propriétaire et des permissions du répertoire personnel :

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Ok, donc après tout ça, j'ai pu me connecter en utilisant sshfs mais en mode lecture seule. Ce que j'ai dû faire pour obtenir un dossier accessible en écriture :

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Et voilà, ça a marché sans autre modification. Notez que je n'ai que des droits d'écriture sur le fichier utilisateur et non à la groupe comme beaucoup d'autres solutions en ligne. J'ai pu créer/supprimer/modifier/renommer des fichiers/dossiers sans problème.

Lors de l'accès en utilisant sshfs avec le netdrive en raison de la configuration du chroot, je ne verrais que les éléments stockés dans le serveur. /home/netdrive/ répertoire, parfait. La répétition /home/netdrive/home/netdrive/ La structure de répertoire est ce qui m'a permis d'avoir une structure de chroot ssh en écriture solution.

Je vais maintenant expliquer ci-dessous les problèmes que j'ai rencontrés :

Vous ne devriez probablement pas exécuter les paragraphes suivants :

Après avoir examiné les solutions ci-dessus (et beaucoup d'autres sur le net qui utilisaient même des acl (listes de contrôle d'accès)) Je n'ai toujours pas réussi à le faire fonctionner car ce que j'ai fait ensuite était :

Ce qui suit a été fait NO travailler pour moi :

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Parce que le netdrive L'utilisateur n'était toujours pas en mesure d'écrire dans ce /home/netdrive/writable/ malgré le fait qu'il possède le dossier et les autorisations. Alors j'ai fait sudo chmod 775 /home/netdrive/writable/ Et maintenant je pouvais créer un répertoire et le supprimer mais je ne pouvais pas l'éditer parce qu'il était créé sans les droits d'écriture du groupe. Voici ce que j'ai vu sur le net que les gens utilisent acl pour le réparer. Mais je n'étais pas satisfait de cela, car j'ai dû installer acl puis configurer les points de montage, etc. Je ne vois pas non plus pourquoi j'aurais besoin de groupe l'autorisation d'écrire dans un dossier appartenant au même utilisateur.

Il semble que pour une raison quelconque, la création /home/netdrive/home/netdrive et en donnant la propriété au dernier netdrive j'ai pu faire en sorte que tout fonctionne sans avoir à modifier le dossier groupe les permissions.

2voto

user109764 Points 481

J'ai suivi este article mais ça n'a pas marché. Il a commencé à fonctionner après avoir fait ce changement (suggéré dans les réponses ci-dessus) :

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

De plus, j'ai créé un répertoire personnel propre à la racine, sous lequel j'ai créé un sous-répertoire inscriptible pour l'utilisateur (comme décrit ci-dessus).

La nouvelle chose utile que je souhaite ajouter à cette réponse est que vous pouvez simplifier la configuration en spécifiant simplement %h comme répertoire d'origine de l'utilisateur :

ChrootDirectory %h

Je l'ai découvert grâce à este lien.

0voto

jrishaw Points 71

J'ai créé un script à partir de la réponse de @Oli :

#!/bin/bash

# 1. adds a user to the group sftponly, which have only access to their home directory
# 2. creates a writable folder in the users home directory
# 3. mounts a folder into the users home directory with bind
# see https://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes

if [ "$1" == "" ]; then
  echo "usage: $0 [username] [path to share] [local foldername]"
  exit 0
fi
U=$1

if [ "$2" == "" ]; then
  echo "no 2. param path to share given (without trailing slash)"
  exit 0
fi
PATH_TO_SHARE="$2"

if [ "$3" == "" ]; then
  echo "no 3. param local foldername given"
  exit 0
fi
LOCAL_FOLDER_NAME="$3"

set -ex

adduser $U
adduser $U sftponly
sudo chown root /home/$U
sudo chmod go-w /home/$U
sudo mkdir /home/$U/writable
sudo chown $U:sftponly /home/$U/writable
sudo chmod ug+rwX /home/$U/writable
mkdir -p "/home/$U/$LOCAL_FOLDER_NAME/"
mount --bind "$PATH_TO_SHARE/" "/home/$U/$LOCAL_FOLDER_NAME/"

echo "$PATH_TO_SHARE/ /home/$U/$LOCAL_FOLDER_NAME/ none defaults,bind 0 0">>/etc/fstab

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X