Problème nodejs et jail ssh

Tags: #<Tag:0x00007f1ef7eb3f80>

Bonjour à tous, voici mon problème :

Je loue un serveur dédié tournant sous debian 9 pour un usage personnel et je voudrais héberger des bots discord dessus avec nodejs et pm2 pour gérer les processus. Jusque là pas de souci tout est installé et fonctionnel.
Je voudrais donner l’accès à quelqu’un en ssh et ftp pour qu’il puisse gérer les bots mais il est évident qu’il ne doit pas pouvoir se balader ailleurs que dans son home. Proftpd est facilement configurable pour ça mais pour ssh j’ai du configurer un environnement chroot qui fonctionne avec les commandes de base, mais je rencontre un problème avec les modules node.

node semble fonctionner :
node -v
v12.13.1

Par contre ses modules non :
npm -v
internal/modules/cjs/loader.js:800
throw err;
^

    Error: Cannot find module '../lib/utils/unsupported.js'
    Require stack:
    - /usr/bin/npm
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:797:15)
        at Function.Module._load (internal/modules/cjs/loader.js:690:27)
        at Module.require (internal/modules/cjs/loader.js:852:19)
        at require (internal/modules/cjs/helpers.js:74:18)
        at /usr/bin/npm:19:21
        at Object.<anonymous> (/usr/bin/npm:153:3)
        at Module._compile (internal/modules/cjs/loader.js:959:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
        at Module.load (internal/modules/cjs/loader.js:815:32)
        at Function.Module._load (internal/modules/cjs/loader.js:727:14) {
      code: 'MODULE_NOT_FOUND',
      requireStack: [ '/usr/bin/npm' ]
    }

Même chose pour pm2, erreur de type Cannot find module.

Le dossier /usr/lib/node_modules est pourtant bien présent dans le jail à la même place. Je l’ai copié dans chroot/usr/local/lib/ sans succès et les seules réponses que j’ai trouvé concernant ce type d’erreur ne concernent pas un jail ssh et préconisent une réinstallation de node. Etant donné que tout fonctionne en environnement normal je n’ai pas testé, je pense que le problème vient de mon jail mais je suis coincé.
Aurais - je oublié quelque chose?

Merci d’avance pour vos réponses.

Je ne sais pas trop ou est … au moment de cette exécution, mais il va chercher ses modules dans un chemin qui contient /lib/utils/, donc sans doute pas dans /usr/lib/node_modules et je parie que /usr/local/lib/ n’est pas non plus le chemin cherché dans le chroot.

Où se trouve logé le fichier unsupported.js ou bien les répertoires “internal” en dehors du jail ?

Autre piste: il n’y aurait pas un fichier de config dans /etc (notament dans /etc/default) pour configurer les paths d’include de nodejs ou autre ?
Une config que tu aurais oublié de remettre dans ton chroot ?

Merci de ta réponse.

Le chemin est bon :
find / -name unsupported.js
/chroot/usr/lib/node_modules/npm/lib/utils/unsupported.js
/usr/lib/node_modules/npm/lib/utils/unsupported.js

C’est ce à quoi je pense, une configuration d’un path quelque-part mais je ne sais pas ou chercher.
Il n’y a rien qui se rapporte à node dans /etc/default.

Dis moi, tu te logues comment dans ton chroot pour y tester tes commandes ?
Tu le testes en ssh direct ?
Tu chroot puis tu su sous le nom de l’user ? Le su en user, avec ou sans tiret ?

Oui j’ouvre une connexion avec user@ip et je me logue avec le mot de passe. Si j’accède à cet user via su - user je tombe dans son home d’origine et les commandes fonctionnent.

Et dans ton sshd_config, tu as bien une section Match user <ton user>, avec une entrée ChrootDirectory <tonchroot> ?

Oui j’ai suivi ce tuto pour créer le jail :
https://www.tecmint.com/restrict-ssh-user-to-directory-using-chrooted-jail/

Dans le tuto, as tu suivi strictement la même mécanique de création de l’user concerné, c’est à dire la création de l’user avec useradd (plutôt qu’adduser) ?
Ou bien est ce que tu as “appliqué le tuto” en faisant ton jail sur le home d’un user déjà créé ?
Tu n’as pas omis l’étape 6, avec la création d’un /chroot/home/tonuser ?
Ce sont juste des questions comme ça, je n’ai vraiment aucune idée précise.

J’avais déjà créé cet user avec adduser avant de faire le jail pour tester et configurer pm2 et que ce soit cet utilisateur qui lance les processus des bots. Je pensais qu’on pouvait limiter un user dans son home facilement en ssh, mais que neni… Du coup mon jail est dans le home de cet user, tu crois que le souci peut venir de là?

Ben justement, on parle de paths, et je me demande si il ne manque pas certains fichiers de config du “skel”, dans le home user du chroot, peut être pas aussi évident qu’un .bashrc ou un .login, mais un truc dans le genre qui manquerait dans l’env utilisateur.

Peut être en recopiant le contenu de ton /home/tonuser dans /chroot/home/tonuser ?

Stop !
Moins con:
tu vérifies que ton /chroot/home/user est vide, et tu remontes en --bind /home/user dessus, ça donne:
mount --bind /home/user /chroot/home/user

[Edit: et si ça marche, tu mettras le bind en fstab:

(...)
/home/user /chroot/home/user none bind
(...)

]

Ca ne fonctionne pas j’ai toujours la même erreur, par contre l’invite de commande une fois connecté est passé de -bash-4.4$ à I have no name!@myhostname:~$.:sweat_smile:
Ca m’a gonflé je crois que je vais tout recommencer en utilisant cet utilitaire que j’ai trouvé pendant mes recherches : https://olivier.sessink.nl/jailkit/.

Comme dit plus haut je suis reparti de zéro pour créer le jail en utilisant jailkit et ça fonctionne! Cet utilitaire est très pratique pour créer un jail en quelques lignes de commandes.
Merci de ton aide Mattotop!