Handcuffs-Jail

[Synology] Comment mettre en place un Chroot SSH ?

Cet article a été rédigé il y a 4 années ! Il commence à dater, mais n'est pas forcément obsolète.. Lisez-le en gardant cela en tête !
Bonjour, Par défaut sur le Syno vous remarquerez que la plupart des dossiers dans le /volume1/ sont en permissions 777. Si vous souhaitez laisser un accès ssh à certains de vos utilisateurs vous conviendrez que cela n’est pas très commode et créé des trous de sécurités très importants. Nous allons voir dans cet article comment réorganiser l’architecture de votre Syno pour palier à ces problèmes ! Lorsque je parle de trous de sécurité, je fais référence à plusieurs choses. En effet, vous laissez aux membres l’accès à tous les homes, aux fichiers systèmes, aux services web etc.. Il n’y a donc plus aucun intérêt par exemple d’avoir une Photostation pour gèrer les droits de ces membres puisqu’ils ont accès à toutes vos photos, et pire même vos clefs rsa.. Une solution simple : le Chroot SSH  

I) Principe

En effet, je n’ai rien trouvé de mieux pour protéger les données de chacun que de créer une jailssh. Ce principe est très simple à réaliser une fois que l’on a compris la logique de l’idée. Un chroot c’est le principe de bloquer un ou plusieurs utilisateurs dans un sous-dossier pour l’empécher d’avoir accès à toutes les données. De cette façon, c’est vous, créateur du chroot, qui décidez de donner l’accès à certains dossiers ! Dans la pratique, l’idée est de copier les fichiers de fonctionnement de votre machine : /bin, /lib, etc.. De cette façon vous aurez une sorte de machine dans votre machine ! Et l’utilisateur chargera la sous-machine..

II) Passons à la pratique

1. Montage des fichiers systèmes et configuration du service ssh

Pour la mise en place sur votre Syno, je vous propose de vous servir  à nouveau de Geasy. Vous n’avez alors qu’à lancer la commande suivante après avoir installé le gestionnaire de paquets.
geasy install jailssh
Cette commande créée un fichier de démarrage/extinction automatique qui montera et démontra les dossiers du système réel nécessaire au fonctionnement de la sous-machine. (Les dossiers sont "dev, etc, bin, lib, var, usr, home", sur le principe cela fonctionne aussi pour d’autres systèmes). De plus la commande modifiera la configuration du service ssh. En effet, il vous faut changer les paramètres sur service ssh, car par défaut le syno créé des fichiers avec le umask 000. C’est pas jojo ! Il faut donc que par défaut le système écrive avec un umask 066 ou 000 par exemple. Pour que les membres n’aient pas accès à celles des autres. Il vous faudra aussi configurer le chroot pour le groupe users. En sachant que admin et git (si vous l’avez créé au tuto git-gitolite) font partis du groupe user, donc la commande créera une exception pour ces membres. De plus de nombreux services nécessite le bit de lecture pour les droits others. C’est pourquoi j’ai volontairement laissé les droits 755 pour l’utilisateur admin afin de pouvoir modifier le dossier musique, photos, web etc.. ! Attention : Je vous rappelle que si vous souhaitez pouvoir utiliser des commandes d’écriture, tel que fwrite en php pour écrire dans des fichiers, il faudra changer le propriétaire du dossier et mettre l’utilisateur nobody:nobody. Toutefois ce problème se pose déjà avec l’organisation de classique du Syno lorsque l’on édite avec l’utilisateur admin:users les fichiers web par exemple ! Enfin il vous faudra redémarrer votre syno pour pouvoir mettre à jour la configuration du service ssh. En effet même en redémarrant le service via le script .sh, les modifications du fichier sshd_config ne seront prises en compte que lorsque vous aurez redémarré votre Syno.. (Je suis preneur si vous avez une meilleur solution!! Laissez moi un commentaire..)

2. Autoriser la connexion SSH d’un utilisateur

Une fois la commande lancée, il vous faudra changer le contenu du fichier /etc/passwd, car par défaut le Syno ne permet pas la connexion des utilisateurs. Ce fichier contient toutes les informations à propos des utilisateurs, il faudra donc changer quelques lignes. Par défaut une ligne contient :
mickael:x:1030:100::/var/services/homes/mickael:/sbin/nologin
Le dernier paramètre est à modifier de cette façon pour autoriser la connexion ssh.
mickael:x:1030:100::/var/services/homes/mickael:/bin/ash
Et ainsi vous permettrez à l’utilisateur mickael de se connecter en ssh.  

III) Test du chroot

Enfin, il vous suffira de vous connecter avec votre utilisateur correctement configuré pour vérifier que vous vous trouvez bien sur le chroot et non votre système global.
ssh mickael@ssh.domaine.tld
Sinon n’hésitez pas à m’écrire un commentaire pour régler les problèmes !  

Conclusion,

Vous disposez à présent, une fois le syno redémarré, d’un service ssh chrooté pour les users permettant ainsi de protéger vos données. Si vous voulez leur laisser un accès ssh. Ceci sera d’ailleurs très utile dans la suite de mes articles, où je proposerai par exemple un service de Free DNS Dynamique sur votre Syno. N’hésitez pas à donner votre avis sur ce tutoriel en posant un petit commentaire 😉

19 réponses à “[Synology] Comment mettre en place un Chroot SSH ?

  1. Tout d’abord bravo pour votre super blog très instructif.
    J’ai installer en ssh sur mon syno 413j geasy mais etant en DSM5 puis-je installer le jailsshDSM4?
    Merci.

    1. Bonjour,

      Alors pour jailssh en effet il y a une différence à faire en DSM 4 et DSM 5. J’ai eu quelques problèmes avec le passage du DSM4 à 5, du coup j’ai pas eu le temps de faire le paquet DSM 5 quand j’ai remarqué l’erreur. Mais vu que je vois que la jailssh intéresse des gens, voici la correction !!

      J’ai unifié les paquets du coup vous n’avez plus qu’à lancer la commande geasy install jailssh et suivre les instructions !
      N’hésitez pas à me récrire si jamais il y a un problème 🙂

  2. Un grand merci pour cette modification a la volé. Je vais tester ca.
    J’ai une question subsidiaire ^^ le sous système se monte automatiquement pour tout les utilisateurs sauf admin si j’ai bien compris mais serais il envisageable de mettre une exclusion sur un autre compte en plus d’admin?
    Autre question de débutant la jailssh ne remet pas en cause les droits d’accès en cas de ficher partager sur le nas ou a filestation? En gros si l’utilisateur a un lecteur réseau monter dans un dossier partager le montage du sous system ne le bloquera pas?

    1. Salut ! De rien de rien pour la modification ça prend que quelques secondes quand c’est pas trop compliqué 🙂

      Il est tout à fait envisageable de creer un groupe jailssh et de modifier le fichier /etc/sshd_config pour permettre aux utilisateurs par défaut d’avoir accès en ssh (sous réserve d’avoir modifié le fichier /etc/passwd) et puis que les gens dans le groupe jailssh soit restreint. Si je devais le refaire je le ferai comme ça mais là actuellement je l’ai fait avec le groupe par défaut car personnellement je me connecte en ssh à mon serveur que avec le compte root, utilisateur qui n’appartient pas au groupe user.

      Et puis sinon j’ai créer des exceptions sur les utilisateurs admin et git car ils gèrent entre autre la base pgSQL et mon serveur git respectivement. Du coup ça interférait avec les services de mon syno.
      Néanmoins je me suis dit que si par hasard je me trompais dans la configuration du fichier /etc/passwd ça serait bête que qqn est accès à tout mon syno du coup je me suis dit je met tous les users dedans et puis basta.

      Pour répondre à ta deuxième question, non les utilisateurs n’interfèrent pas avec les services du Syno ou la lecture de disques montés quand tu y accès depuis le Syno. J’ai toujours accès à mes dossiers partagés depuis le DSM pour mon compte personnel.

  3. Apres test c’est nickel pour les droits l’utilisateur est bien confiné a ses dossiers.
    Par contre bizarrement sous putty je peu me connecter en ssh sous ROOT mais pas en admin il met "Permission denied please try again"..

    Je souhaite utiliser la connexion ssh comme proxy socks j’ai bien modifier le fichier /etc/ssh/sshd_config
    pour mettre le tcp forwarding yes
    En root pas de problème mais pas avec un user standard aurais tu une idée de quelle paramètre pourrais bloquer?

    1. Sinon en effet root fonctionne. Parcontre chez moi admin fonctionne toujours et est en dehors de la jailssh tout comme l’utilisateur git qui gère mon serveur git comme dit plus haut.

      J’ai du la mettre pour éviter que admin soit aussi confiné dans la jailssh sinon l’indexation des fichiers vidéo, audio, photos buggait car c’est admin qui gère la base de données pgSQL visiblement (tout du moins en DSM4)

      Toutefois chez moi le compte admin peut toujours se connecter en ssh c’était l’intérêt de l’exception ssh. Regarde voir du côté du /etc/passwd à la ligne "admin:x:…" regarde si l’interpréteur n’est pas /sbin/nologin ou autre mais bien /bin/sh ou /bin/ash.

      Peux-tu m’en dire plus concernant les proxy socks je ne connais pas trop. C’est dans quel objectif ? Je pense que tu dois pouvoir rajouter la propriété "tcp forwarding yes" en ajoutant la ligne après la ligne "Match Group users" pour un utilisateur quelconque

  4. Alors j’ai ca :
    DiskStation> vi /etc/passwd
    admin:x:1024:100:System default user:/var/services/homes/admin:/bin/sh
    anonymous:x:21:21:Anonymous FTP User:/nonexist:/sbin/nologin
    benoit:x:1033:100::/var/services/homes/benoit:/bin/sh
    dovecot:x:143:143:Dovecot User:/nonexist:/sbin/nologin
    ftp:x:21:21:Anonymous FTP User:/nonexist:/sbin/nologin
    guest:x:1025:100:Guest:/nonexist:/bin/sh
    http:x:1023:1023::/var/services/web:/bin/false
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mysql:x:66:66::/var/services/mysql:/bin/false
    nobody:x:99:99::/:/bin/false
    postfix:x:125:125:Postfix User:/nonexist:/sbin/nologin
    postgres:x:55:55::/var/services/pgsql:/bin/sh
    root:x:0:0:root:/root:/bin/ash
    smmsp:x:25:25:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
    spamfilter:x:783:99:Spamassassin User:/var/spool/postfix:/sbin/nologin
    ~

    bizarement Benoit arrive a se connecter en ssh mais pas admin.. je pige pas.

    Pour le proxy socks le but c’est de se servir de nas comme proxy via un tunnel ssh dans sshd_config on met yes sur le tcp forwarding ce qui reroute les paquets.
    Dans le navigateur on met un proxy localhost socks v5 sur le port du tunnel ssh et c’est comme si je surfais de chez moi depuis n’importe que hotel ou boulot sans filtrage ni bridage youtube et autre vive la fibre ^^
    Par contre meme la session benoit qui a acces au ssh na pas acces au net il doit y avoir un autre parametre que tcp forwarding pour les autre user..

    sshd_config j’ai ca :

    # $OpenBSD: sshd_config,v 1.82 2010/09/06 17:10:19 naddy Exp $

    # This is the sshd server system-wide configuration file. See
    # sshd_config(5) for more information.

    # This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented. Uncommented options change a
    # default value.

    #Port 22
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::

    # The default requires explicit activation of protocol 1
    #Protocol 2

    # HostKey for protocol version 1
    #HostKey /etc/ssh/ssh_host_key
    # HostKeys for protocol version 2
    #HostKey /etc/ssh/ssh_host_rsa_key
    #HostKey /etc/ssh/ssh_host_dsa_key
    #HostKey /etc/ssh/ssh_host_ecdsa_key

    # Lifetime and size of ephemeral version 1 server key
    #KeyRegenerationInterval 1h
    #ServerKeyBits 1024

    # Logging
    # obsoletes QuietMode and FascistLogging
    #SyslogFacility AUTH
    #LogLevel INFO

    # Authentication:

    #LoginGraceTime 2m
    #PermitRootLogin yes
    #StrictModes yes
    #MaxAuthTries 6
    #MaxSessions 10

    #RSAAuthentication yes
    #PubkeyAuthentication yes
    #AuthorizedKeysFile .ssh/authorized_keys

    # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    #RhostsRSAAuthentication no
    # similar for protocol version 2
    #HostbasedAuthentication no
    # Change to yes if you don’t trust ~/.ssh/known_hosts for
    # RhostsRSAAuthentication and HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don’t read the user’s ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes

    # To disable tunneled clear text passwords, change to no here!
    #PasswordAuthentication yes
    #PermitEmptyPasswords no

    # Change to no to disable s/key passwords
    #ChallengeResponseAuthentication yes
    ChallengeResponseAuthentication no

    # Kerberos options
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosGetAFSToken no

    # GSSAPI options
    #GSSAPIAuthentication no
    #GSSAPICleanupCredentials yes

    # Set this to ‘yes’ to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication and
    # PasswordAuthentication. Depending on your PAM configuration,
    # PAM authentication via ChallengeResponseAuthentication may bypass
    # the setting of "PermitRootLogin without-password".
    # If you just want the PAM account and session checks to run without
    # PAM authentication, then enable this but set PasswordAuthentication
    # and ChallengeResponseAuthentication to ‘no’.
    UsePAM yes
    #UsePAM no

    #AllowAgentForwarding yes
    AllowTcpForwarding yes
    #GatewayPorts no
    #X11Forwarding no
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #PrintMotd yes
    #PrintLastLog yes
    #TCPKeepAlive yes
    #UseLogin no
    #UsePrivilegeSeparation yes
    #PermitUserEnvironment no
    #Compression delayed
    #ClientAliveInterval 0
    #ClientAliveCountMax 3
    UseDNS no
    #PidFile /var/run/sshd.pid
    #MaxStartups 10
    #PermitTunnel no
    ChrootDirectory none
    #ChrootDirectory /var/services/homes/%u
    #DenyUsers admin

    # no default banner path
    #Banner none

    # override default of no subsystems
    #Subsystem sftp /usr/libexec/sftp-server
    #Subsystem sftp internal-sftp -f DAEMON -l VERBOSE -u 000
    Subsystem sftp internal-sftp -f DAEMON -u 066
    #Subsystem sftp /usr/syno/sbin/sftp-server -l DEBUG3

    # the following are HPN related configuration options
    # tcp receive buffer polling. disable in non autotuning kernels
    #TcpRcvBufPoll yes

    # allow the use of the none cipher
    #NoneEnabled no

    # disable hpn performance boosts.
    #HPNDisabled no

    # buffer size for hpn to non-hpn connections
    #HPNBufferSize 2048

    # Example of overriding settings on a per-user basis
    Match User root
    # X11Forwarding no
    AllowTcpForwarding yes
    # ForceCommand cvs server
    Match User git
    ChrootDirectory none
    AllowTcpForwarding no
    X11Forwarding no
    Match User admin
    ChrootDirectory none
    AllowTcpForwarding yes
    X11Forwarding no
    ForceCommand internal-sftp -f DAEMON -u 022
    Match Group users
    ChrootDirectory /volume1/@chroot
    AllowTcpForwarding yes
    X11Forwarding no

    mais avec la session benoit j’ai :

    DiskStation> ping google.fr
    PING google.fr (74.125.132.94): 56 data bytes
    ping: permission denied (are you root?)

    Désoler pour le pavé ^^

  5. Pas de soucis pour le pavé, ça m’a fait de la lecture, lol 🙂 Je vais tacher de t’aider comme je peux.

    Essaie peut-être de regarder les droits d’accès sur le home du compte admin. Je vois pas trop sinon cela peut peut-être venir de la configuration particulière du compte admin. Essaie de la commenter voir si tu arrives à te connecter comme un membre du groupe Users. Sinon autre chose, connecte toi à ton compte root. Et après lance la commande "su admin" voir si tu arrives à te connecter à ton compte admin.

    C’est intéressant l’idée du Proxy Sock, mais pourquoi ne pas simplement utiliser l’ipkg pour installer un serveur proxy. Ou bien utiliser le paquet SquidGuard disponible sur le repo de la SynoCommunity pour faire cela ? Plutôt que de modifier la configuration plus "interne" du Syno. Toutefois rien ne t’empêches ensuite de créer un fichier .cfg (à configurer dans ton navigateur) et qui gère le cas où ton Syno n’est pas accessible, car cela ne m’étonnerai pas que ton Syno soit bloqué selon le réseau dans lequel tu te trouves, si il est bien organisé.
    Ou encore mieux utiliser une connexion VPN pour passer par ta connexion maison ? Mais je ne sais pas si dans ce cas, tu passes obligatoirement par le proxy de ton boulot.

    Sinon concernant le ping c’est tout à fait normal que cela ne marche pas, car par défaut sur le Syno l’utilisateur autre que root n’as pas les permissions pour lancer un ping. Je crois que ping est un lien symbolique sur la busybox qui ne permet de donner accès que à root (peut-être admin aussi, je ne sais pas). Pour pinger ou lancer toutes autres commandes avec les droits adéquates, il faut que tu installes le paquet "sudo" depuis l’ipkg et que tu rajoutes la commande dans la configuration du paquet permettant de donner l’accès à tes utilisateurs aux commandes.
    Si tu veux tester la connexion lance plutôt la commande curl. Genre "curl ip.gauss-it.net" devrait te renvoyer ton adresse ip.

  6. Si tu ne veux pas avoir à utiliser sudo, que je trouve personnellement contraignant sinon tu peux utiliser le bit SUID sur la busybox. Mais je ne sais pas si c’est très recommander, car cela signifie que quelqu’un est capable de lancer des commandes ping peut aussi lancer des commandes tel que umount ou d’autres.

    chmod u+s /bin/busybox

    Ceci dit, l’utilisateur peut correctement pinger ^^

  7. Effectivement en commentant les 3 lignes du sshd_config du user admin la connections ssh remarche.. mais du coup admin va être jailssher ? ^^

    Au passage a quoi sert : "ForceCommand internal-sftp -f DAEMON -u 022″

    Du coups en admin ou root avec le tunnel SSH je peu surfer avec le proxy configuer dans firefox.. mais pas avec le user benoit.

    Pour le proxy squid je l’avais envisager mais un peu peur qu’il soit compliqué de le configurer.. et tant que je me connectais en root ou admin ca marchais bien en ssh.
    Mais si je veux dépanner un collègue sans qu’il ait accès a tout en ssh le jailSSH est parfais.. il manque juste le paramètre qui bloque le compte benoit..

    1. Peux tu me dire sur quoi tu tombes quand tu te connectes en ssh avec admin, car en effet admin devrait être jailsshé, sauf que tu me dis que tu a accès au proxy docks avec admin.

      Sinon ForceCommand ça force l’utilisation de l’internal-sftp mais avec les droits 755 car admin doit pouvoir écrire de manière general. Le problème étant que tu ne peux pas laisser admin dans jailssh au risque de ne plus pouvoir utiliser certains services syno.

  8. DiskStation> ls
    CloudStation
    DiskStation> cd ..
    DiskStation> ls
    admin benoit
    DiskStation> cd ..
    DiskStation> ls
    homes
    DiskStation> cd ..
    DiskStation> ls
    services
    DiskStation> cd ..
    DiskStation> ls
    bin dev etc home lib opt usr var

    voila sur quoi je tombe en admin.

    1. J’ai cherché concernant le Proxy Sock en effet c’est plutôt pas mal d’avoir un proxy en place en n’ayant rien à installer. Je risque de faire un article dessus du coup, il s’agit d’une fonctionnalité très intéressante surtout quand je serai au boulot cet été 🙂

      Concernant la configuration de sshd_config, comme je t’ai dis essaie de voir quand le problème apparait en ajoutant les lignes une à une. Toutefois est-ce que tu as accès au proxy sock avec le compte admin quand tu retires l’exception ?
      J’ai procédé à quelques tests et j’ai utilisé Proxy Sock pour me connecter via le Syno. J’ai réussi à mis connecter avec tous mes comptes incluant ceux dans la jailssh !
      J’aimerai quand même savoir ce qui ne passe pas chez toi !

      http://partage.gauss-it.net/syno/sshd_config

  9. quand je commente "ForceCommand internal-sftp -f DAEMON -u 022″ je peux me logguer en ssh admin sinon in me jette.

    Au passage pour restart le service SSH sans redémarrer le nas la commande a changer sur syno :
    /usr/syno/etc.defaults/rc.d/S95sshd.sh restart avant DSM5
    Il faut utiliser ca : synoservicectl –reload sshd
    Moi j’ai bien chercher ^^..

    Par contre aujourd’hui le user benoit a bien accès au proxy ça passe.. peut être suite a un redémarrage du syno..
    On arrive au bout 😉

  10. Ah super ! Enfin une bonne nouvelle.

    Bon et bien maintenant tu sais d’où vient le problème concernant admin. A noter que la commande ForceCommand est une commande assez classique étonnant que cela créé un problème chez toi. Quoiqu’il en soit, jète un coup d’oeil quand même aux droits d’écriture du compte admin (je pense que tu auras rwx–x–x pour les dossiers et rw——- pour les fichier ^^ Donc il faut que tu arrives à contourner ce problème de la commande ForceCommand). Pour vérifier cela connecte toi en ssh et dans son home lance la commande.

    mkdir test_dir
    touch test_file
    ls -l | grep "test_*"
    rm -r test_dir test_file

    Regarde alors si tu as bien les droits rwxr-xr-x pour le dossier et rw-r–r– pour le fichier. Car sans cela, tu risques d’avoir des problèmes de droits quand tu écris depuis le compte admin dans les dossiers partagés comme je l’expliquais plus haut dans mon article.
    Peut-etre en modifiant le fichier .profile du compte admin et en changeant le umask cela corrigerai le problème, mais la solution serait quand même un peu du genre cas particulier.

    Merci pour l’infos sinon, je connaissais : /usr/syno/etc.defaults/rc.d/S95sshd.sh restart
    Néanmoins cette commande ne permettait pas de prendre en compte correctement les modifications faites sur le fichier sshd_config. (Probablement pour cela que benoit n’avait pas d’accès, une fois la commande TcpForwarding changée)
    Toutefois la seconde commande me plait beaucoup plus merci, j’ai mis à jour le paquet en conséquence !

  11. En Admin dans son home

    DiskStation> ls -l |grep "test_*"
    drwxr-xr-x 2 admin users 4096 Mar 23 15:57 test_dir
    -rw-r–r– 1 admin users 0 Mar 23 15:57 test_file

    ca a l’air tout bon ?

    1. En effet, c’est parfait, pas de problème d’écriture.
      Fait aussi le test avec un client sftp genre Filezilla pour voir et pour moi c’est bon 🙂

  12. Je testerais a l’occasion en SFTP mais j’avais désactiver le ftp a cause des tentatives de brut force venant de chine ^^
    En tout cas je te remercie pour tout et je suis ton blog et tes autres articles syno 😀

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *