Pour un rendu optimal, activez JavaScript

Partage sftp avec docker

 ·  ☕ 4 min de lecture  ·  🩊 Propositionjoe

SĂ©cure et facile.

Je continue sur ma lancĂ©e de proposition de containers docker pour se doter de service rapidement. AprĂšs un papier sur jellyfin, et sur la construction d’une base de centralisĂ©e pour vos platines kodi, je vous explique aujourd’hui comment je compte partager le rĂ©pertoire d’un serveur distant sur mon rĂ©seau local. Et si j’ai optĂ© une nouvelle fois pour docker c’est parce que c’est une solution simple Ă  mettre en place qui ne donne pas un vrai accĂšs SSH tout en Ă©vitant de chrooter un utilisateur. Bref du bon boulot.

L’installation est triviale: elle repose sur un fichier docker-compose, la gĂ©nĂ©ration des clĂ©s ssh nĂ©cessaires, le lancement du container, et le montage local du rĂ©pertoire distant.

Configuration du docker-compose

J’utilise pour se faire l’excellente image docker netresearch/sftp, complĂšte et efficace.
Créez un dossier sftp et collez-y un fichier docker-compose.yaml:

1
mkdir sftp
1
nano docker-compose.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.7'

services:
  sftp:
    image: netresearch/sftp
    container_name: sftp
    restart: unless-stopped
    volumes:
        - /repertoire-local-a-partager:/home/foo/repertoire-local-a-partager
        - ./etc/ssh_ed25519_key:/etc/ssh/ssh_host_ed25519_key
        - ./etc/ssh_rsa4096_key:/etc/ssh/ssh_rsa4096_key
        - ./home/ssh_ed25519_key.pub:/home/foo/.ssh/keys/ssh_ed25519_key.pub:ro
    command: foo::1000
    ports:
        - "2222:22"
    networks:
      - web

networks:
  web:
    external: true

Commentaires

  • repertoire-local-a-partager: correspond au rĂ©pertoire prĂ©sent sur le serveur distant qu’on souhaite monter dans le container, afin de le rendre ensuite accessible en sftp Ă  un serveur local.
  • ./etc/ssh_ed25519_key, ./etc/ssh_rsa4096_key et ./home/ssh_ed25519_key.pub: sont les deux clĂ©s ssh privĂ©s et la clĂ© publique requises pour Ă©tablir une connexion sftp sans mot de passe sereinement. Les clĂ©s privĂ©es vont ĂȘtre montĂ©es dans /etc/ssh du container afin que la clĂ© de signature soit persistante et n’engendre pas d’alerte dans votre serveur local lorsque vous devrez relancer le service (je propose une clĂ© ed25519 et une rsa4096 afin d’assurer une compatibilitĂ© avec d’ancien client). La clĂ© publique va quant Ă  elle ĂȘtre montĂ©e dans /home/foo/.ssh/keys et permette d’accomplir l’authentification entre le container (qui fait office de serveur ssh rĂ©duit au minimum dans notre cas) et le client (voir ici, ou lĂ  pour plus de dĂ©tail).
  • foo::1000: ici j’ai choisi de gĂ©nĂ©rer l’utilisateur foo avec UID 1000. Deux choses sont Ă  noter: l’UID n’est pas une sĂ©rie de chiffre Ă  nĂ©gliger si on souhaite s’Ă©viter les soucis de permission d’Ă©criture des futurs diffĂ©rents utilisateurs sur les rĂ©pertoires Ă  partager, pour le connaĂźtre taper id mon-utilisateur. Je n’ai pas renseignĂ© de mot de passe, ne souhaitant permettre de connexion que par clĂ©. Si je changeais d’avis Ă  l’avenir il me suffira d’Ă©crire foo:pass:1000.

Génération des clés SSH

Il faudra trois paires de clĂ© au total. Deux paires dont on n’utilisera que la version privĂ©e et que vous pourrez laisser dans ./etc/, elles servent au serveur local Ă  vĂ©rifier l’identitĂ© du serveur disant. La troisiĂšme paire publique/privĂ©e sera placĂ©e dans le ~/.ssh de son serveur local, quand seule la version publique sera quant Ă  elle montĂ©e dans le container.

CrĂ©ez le dossier etc et crĂ©ez ici votre clĂ© rsa4096, puis la clĂ© ed25519. Puis revenez en arriĂšre et crĂ©ez le dossier home pour y mettre l’autre clĂ© ed25519.

De type RSA 4096

1
ssh-keygen -t rsa -b 4096 -o -f ssh_rsa4096_key

De type ED25519

1
ssh-keygen -t ed25519 -a 64 -f ssh_ed25519_key
N’ajoutez pas de passphrase si vous souhaitez permettre le montage automatique du volume au dĂ©marrage du systĂšme.

Montez le répertoire distant

Commencez par lancer le service en vous plaçant dans le rĂ©pertoire sftp et en tapant la commande docker-compose up -d. Si vous ne voyez pas d’erreur vous pouvez passer Ă  la suite:

  • C’est Ă  dire copiez ./home/ssh_ed25519_key et ./home/ssh_ed25519_key.pub dans ~/.ssh/ de votre serveur local,
  • Puis de crĂ©ez le dossier de montage /sshfs/repertoire-local-a-partage sur votre serveur local,
  • Et d’enfin ajouteez une ligne dans /etc/fstab toujours localement.
1
mkdir -p /sshfs/repertoire-local-a-partage
1
nano /etc/fstab
1
sshfs#foo@IP-DISTANTE:/repertoire-local-a-partage /sshfs/repertoire-local-a-partage fuse port=2222,x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/USERNAME/.ssh/ssh_ed25519_key,allow_other,default_permissions,uid=1000,gid=1000 0 0
1
mount /sshfs/repertoire-local-a-partage
Pensez Ă  changer USERNAME par votre utilisateur local, et l'IP-DISTANTE par l’ip de votre serveur distant.

DĂ©bugage

Si le rĂ©pertoire ne se monte pas, vĂ©rifiez d’abord que vous disposez bien des dĂ©pendances fuse et sshfs (voir un prĂ©cĂ©dent papier sur ce sujet ici).
Surtout pour investiguer un peu et vous Ă©viter toute migraine excessive, vous pouvez utiliser cette commande:

1
sshfs -p 2222 -odebug,sshfs_debug,loglevel=debug -o Compression=no -o allow_root -o transform_symlinks foo@IP-DISTANTE:/repertoire-local-a-partage /sshfs/repertoire-local-a-partage

Happy SSHFS les amis !


Pour aller plus loin

🔗 https://doc.ubuntu-fr.org/sshfs
🔗 https://wiki.archlinux.org/index.php/SSHFS

Partagez

Propositionjoe
RÉDIGÉ PAR
Propositionjoe
Soyez rĂ©solus de ne servir plus et vous voilĂ  libres, Étienne de La BoĂ©tie, Bricoleur militant.