Article mis à jour le 26/03/2016
INDEX
Configuration du deamon OpenSSH pour chrooter certains users
sudo nano /etc/ssh/sshd_config
Sur une instance EC2, autoriser le login par password :
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication yes
Ne pas utiliser le serveur SFTP d’OpenSSH :
#Subsystem sftp /usr/lib/openssh/sftp-server
Utiliser le serveur sftp par défaut, et chrooter les utilisateurs du groupe chrootedusers
dans le dossier /var/chroot/%u
(où %u
est le login) :
Subsystem sftp internal-sftp
Match Group chrootedusers
ChrootDirectory /var/chroot/%u
#ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
Au passage on peut désactiver la vérification du DNS au login, si votre ISP n’a pas associé bien le reverse DNS à votre IP (coucou Completel tu te reconnais ?) :
UseDNS no
Redémarrer le service SSH :
sudo service ssh restart
ssh stop/waiting
ssh start/running, process 11670
Créer le groupe chrootedusers
et configurer le dossier de jail
sudo groupadd chrootedusers
Configurer le dossier de chroot
/$ cd /var/
/var$ sudo mkdir chroot
/var$ cd chroot/
Créer les répertoires des exécutables, puis copier bash
et rsync
:
/var/chroot$ sudo mkdir {bin,lib,lib64}
/var/chroot$ sudo cp /bin/bash bin/
/var/chroot$ sudo cp /usr/bin/rsync bin/
/var/chroot$ sudo ldd /bin/bash linux-vdso.so.1 => (0x00007fff9f7fe000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f36bf793000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f36bf58f000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f36bf1c8000) /lib64/ld-linux-x86-64.so.2 (0x00007f36bf9c6000) /var/chroot$ sudo mkdir lib/x86_64-linux-gnu /var/chroot$ sudo cp -p /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/libtinfo.so.5
etc…
La même chose pour rsync
/var/chroot$ sudo ldd /usr/bin/rsync linux-vdso.so.1 => (0x00007fffc6b9d000) libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f7586286000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f758606d000) libpopt.so.0 => /lib/x86_64-linux-gnu/libpopt.so.0 (0x00007f7585e60000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7585a9a000) libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f7585895000) /lib64/ld-linux-x86-64.so.2 (0x00007f7586498000) /var/chroot$ sudo cp -p /lib/x86_64-linux-gnu/libacl.so.1 lib/x86_64-linux-gnu/libacl.so.1
etc…
Pensez à rire un bon coup en copiant la librairie « saucisse » 😀
Un script qui copie les libs des binaries automatiquement !
U NEED DIS: https://www.metashock.de/2012/11/export-binary-with-lib-dependencies/
Modifier un utilisateur existant
/var/chroot$ sudo nano /etc/passwd
L’utilisateur importé ou précédemment créé devrait ressembler à :
italic_174:x:1031:1031::/home/italic_174:/bin/bash
Mettre /
en homedir correspond en fait à /var/chroot/%u
définit dans la config d’OpenSSH :
italic_174:x:1032:1032::/:/bin/bash
Penser à lui créer son répertoire perso dans le dossier de jail :
/var/chroot$ sudo mkdir italic_174
Et à l’ajouter dans le groupe des utilisateurs chrootés :
/var/chroot$ sudo usermod -a -G chrootedusers italic_174
Surtout, penser à lui copier les exécutables, étant donné que, chrooté dans /var/chroot/%u
l’utilisateur n’aura pas accès à /bin/bash
ni même /var/chroot/bin/bash
etc.
/var/chroot$ sudo cp -Rr bin/ lib* italic_174/
Configuration des fichiers par défaut dans le homedir et création d’un nouvel utilisateur
Pour éviter de se cogner tous les fichiers à copier à chaque fois, on utilise le skeleton lors de la création d’un utilisateur.
/var/chroot$ sudo mkdir skel
/var/chroot$ sudo mv bin/ lib* skel/
L’utilisation dans la commande de création d’un utilisateur :
sudo useradd -U -G chrootedusers -d /var/chroot/<username> -m -k /var/chroot/skel -s /bin/bash <username>
Explications :
-U
: créer un groupe du même nom que l’utilisateur, et lui affecte-G
: ajoute l’utilisateur dans le groupe spécifié-d
: configure la création du homedir dans le dossier spécifié-m
: demande de créer le homedir-k
: indique quel « squelette » utiliser pour créer le homedir-s
: le shell voulu pour l’utilisateur,/bin/bash
si on veut du rsync over SSH, sinon/sbin/nologin
Le problème est que le homedir spécifié sera /var/chroot/<username>, alors qu’on a besoin de /. Du coup…
sudo usermod -d / test1
Résultat :
/var/chroot$ id test1 uid=1106(test1) gid=1106(test1) groups=1106(test1),1105(chrootedusers)
Et :
sudo nano /var/etc/passwd
test1:x:1106:1106::/var/chroot/test1:/bin/bash
Petit problème en testant la connexion :
➜ ~ slogin test1@debugg.in test1@debugg.in's password: Write failed: Broken pipe
Pourquoi ?
tail -f /var/log/auth.log May 21 00:15:58 ip-172-31-29-241 systemd-logind[1047]: New session 69 of user test1. May 21 00:15:59 ip-172-31-29-241 sshd[18637]: fatal: bad ownership or modes for chroot directory "/var/chroot/test1" May 21 00:15:59 ip-172-31-29-241 sshd[18584]: pam_unix(sshd:session): session closed for user test1
Ah ben oui…
/var/chroot$ sudo chown root:root test1
On réessaie :
➜ ~ ssh test1@debugg.in test1@debugg.in's password: Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
Ça va mieux 🙂
Test de la connexion en SSH
➜ ~ slogin italic_174@debugg.in italic_174@debugg.in's password: Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64) Last login: Tue May 20 21:18:34 2014 from 46.218.202.194
Vérifions tout d’abord que l’on est bien chrooté :
-bash-4.3$ pwd /
Ensuite, que l’on a accès à rsync mais pas aux autres commandes :
-bash-4.3$ cp -bash: cp: command not found -bash-4.3$ rsync rsync version 3.1.0 protocol version 31
Restriction de la connexion par mot de passe par IP
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication no
PasswordAuthentication no
Et ajouter en fin de fichier
Match Address XXX.XXX.XXX.XXX
PasswordAuthentication yes
Récupération d’anciens utilisateurs
S’assurer que l’utilisateur est bien dans le groupe chrootedusers :
getent group chrootedusers
Si tel n’était pas le cas :
sudo usermod -G chrootedusers leclaireur_227
Ne pas oublier pour prendre en compte ce changement :
sudo update-passwd
Test de transfert en SFTP
Pour contrôler ce qui se passe durant l’identification :
tail -f /var/log/auth.log
May 20 20:27:39 ip-172-31-29-241 sshd[12077]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key May 20 20:27:39 ip-172-31-29-241 sshd[12077]: Accepted password for italic_174 from 46.218.202.201 port 59818 ssh2 May 20 20:27:39 ip-172-31-29-241 sshd[12077]: pam_unix(sshd:session): session opened for user italic_174 by (uid=0) May 20 20:27:39 ip-172-31-29-241 systemd-logind[1047]: New session 14 of user italic_174.
WTF : Could not load host key: /etc/ssh/ssh_host_ed25519_key
D’après mes recherches, c’est un bug dans OpenSSH. Pas bien méchant mais quand même un bug. Bravo les gars. Ça se corrige comme ça :
/var/chroot$ sudo ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ed25519_key -N '' Generating public/private ecdsa key pair. Your identification has been saved in /etc/ssh/ssh_host_ed25519_key. Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub. The key fingerprint is: 9c:9f:88:53:ca:2d:26:6f:7f:45:95:0f:fd:8a:ec:59 root@ip-172-31-29-241 The key's randomart image is: +--[ECDSA 256]---+ | o | | + .| | . o.| | . . . o| | S o . . | | . = o .+ E | | . B o oo o | | +.o . o | | ..... | +-----------------+
Anyway, nous sommes loggés.
Problème :
Ce qui est somme toute logique, étant donné que /var/chroot/italic_174
appartient à root
.
Il faut donc créer un (ou plusieurs) sous-dossiers appartenant à l’utilisateur :
/var/chroot$ cd italic_174/
/var/chroot/italic_174$ sudo mkdir www
/var/chroot/italic_174$ sudo chown -R italic_174:italic_174 www/
Et voilà, envoyé c’est pesé :
Test de transfert via rsync
En ligne de commande, avec un tunnel SSH :
➜ ~ rsync -azvcu -e "ssh" /Users/germain/Sites/_repositories/7lieues/mailing.e/www/maquette/jpg italic_174@debugg.in:/www/ italic_174@debugg.in's password: building file list ... done sent 457 bytes received 20 bytes 136.29 bytes/sec total size is 9418305 speedup is 19744.87
Avec l’excellent DropSync :
NB : les copies d’écrans suivantes sont réalisées dans une version beta privée de DropSync 3 mais le principe reste le même pour DropSync 2.
Un test de transfert left to right devrait logiquement annoncer le transfert de tout www :
Sauf bien sûr si vous aviez déjà effectué le transfert en ligne de commande avant :
Conclusion
Et bah c’était pas simple, cette histoire.