Configuration d'un environment chrooted pour une connexion SSH sécuritaire (PLESK)

Configuration d'un environment chrooted pour une connexion SSH sécuritaire (PLESK)

Problème

Avec un accès standard, les utilisateurs de Plesk peuvent se connecter par SSH et ont accès à pratiquement l'ensemble des fichiers du serveur, ce qui cause une faille de sécurité majeure.

Solution

Il convient d'utiliser un environnement chrooted qui limite les accès d'un utilisateur qui se connecte en SSH, et permet à l'administrateur de contrôler spécifiquement ce qui est accessible ou non.

Étape 1 : créer le template chrooted et l'appliquer aux domaines

Si vous prévoyez utiliser git et/ou ssh avec les comptes utilisateurs chrooted, il faut les ajouter au chroot template de Plesk puisqu'ils ne sont pas actifs par défaut.

Connectez-vous en root au serveur par SSH, puis exécuter le code suivant dans votre dossier home (~) :

wget https://raw.githubusercontent.com/plesk/kb-scripts/master/update-chroot/update-chroot.sh
chmod u+x ./update-chroot.sh
./update-chroot.sh --devices tty
./update-chroot.sh --add env
./update-chroot.sh --add ssh
./update-chroot.sh --add touch
./update-chroot.sh --add which
./update-chroot.sh --add nano
./update-chroot.sh --add curl
./update-chroot.sh --add patch
./update-chroot.sh --add whoami
./update-chroot.sh --add chown
./update-chroot.sh --add /usr/bin/git*
./update-chroot.sh --apply all

Sur un environnement AlmaLinux 8.9 il ne faut pas mettre ./update-chroot.sh --devices tty car ça brise le terminal en se connectant par ssh chrooted. Pour faire fonctionner git sur AlamLinux 8.9, j'ai aussi dû exécuter les commandes suivantes:

mkdir -p /var/www/vhosts/chroot/etc/ssl/certs/
mkdir -p /var/www/vhosts/chroot/etc/pki/
cp -a /etc/ssl/certs/* /var/www/vhosts/chroot/etc/ssl/certs/
cp -a /etc/pki/* /var/www/vhosts/chroot/etc/pki/
mkdir /var/www/vhosts/chroot/usr/share/git-core
./update-chroot.sh --add /usr/libexec/git-core/git-remote-http
./update-chroot.sh --add /usr/libexec/git-core/git-remote-https
./update-chroot.sh --apply all

Pour faire fonctionner git sur un environnement Ubuntu 20.04.5 LTS (OVH), j'ai aussi dû exécuter les commandes suivantes :

mkdir -p /var/www/vhosts/chroot/etc/ssl/certs/
mkdir -p /var/www/vhosts/chroot/usr/share/ca-certificates/
cp -a /etc/ssl/certs/* /var/www/vhosts/chroot/etc/ssl/certs/
cp -a /usr/share/ca-certificates/* /var/www/vhosts/chroot/usr/share/ca-certificates/
mkdir /var/www/vhosts/chroot/usr/share/git-core
./update-chroot.sh --add /usr/lib/git-core/git-remote-http
./update-chroot.sh --add /usr/lib/git-core/git-remote-https
./update-chroot.sh --apply all

Si vous voulez ajouter plus de fonctionnalités à l'environnement, vous pouvez le faire avec la commande ./update_chroot.sh --add <nom-du-programme> et ensuite appliquer les changements ./update_chroot.sh --apply all.

Étape 2 : activer l'environnement chrooted dans Plesk

  • Dans Plesk, créer un nouveau Service Plan SSH Chrooted Access
  • Dans l'onglet Permissions, pour l'option Management of access to the server over SSH, sélectionner Can allow access only to a chrooted environment afin de prévenir l'utilisation d'un shell non-chrooted par les utilisateurs.
  • Appliquer ce Service Plan aux comptes ayant un accès SSH.

Les utilisateurs ne devraient plus avoir accès au serveur en entier et peuvent maintenant seulement voir leurs propres fichiers.

NOTE: Comme les symlinks ne fonctionnent pas comme prévus dans un environnement chrooted, si une subscription utilise un symlink pour pointer un dossier vers un autre disque, vous devez utiliser mount à la place pour faire pointer le dossier. Plus de détails ici

Étape 3 : Utilisation de Git de Plesk

Utiliser la formule suivante pour accéder au repositories git gérés par Plesk, sans ajouter ssh:// :

<user>@<hostname>:~/git/<gitrepo>

par exemple :

jmcouillard@jmcouillard.com:~/git/jmcouillard.git

Situations spéciales et spécifiques à certains languages

PHP et mise à jour du composant Composer

Important : Plesk a de la nouvelle documentation pertinente pour configurer PHP et Composer. Les instructions qui s'y trouve permettent entre autre de régler le problème de PHP's phar extension is missing. Composer requires it to run. et /opt/plesk/php/8.0/bin/php: No such file or directory. Suivre les étapes "Add Plesk PHP" ou prendre exemple sur ce qui suit. Changer la version de PHP dans la première ligne selon la version souhaitée. Ajouter Composer : Instructions

VHOSTS=`grep HTTPD_VHOSTS_D /etc/psa/psa.conf | awk '{print $2}'`
# Important: ajouter le zoneinfo sinon Composer ne fonctionnera pas. Et cette instruction n'est pas dans les instructions de Plesk
mkdir $VHOSTS/chroot/usr/share
cp -a /usr/share/zoneinfo $VHOSTS/chroot/usr/share/zoneinfo

PHPPATH='/opt/plesk/php/8.2'
./update-chroot.sh --add $PHPPATH/bin/php
for i in $PHPPATH/lib64/php/modules/*.so; do ./update-chroot.sh --add $i; done
mkdir -p $VHOSTS/chroot$PHPPATH/etc/
cp -a $PHPPATH/etc/ $VHOSTS/chroot$PHPPATH/; rm -rf $VHOSTS/chroot$PHPPATH/etc/php-fpm.d
sed -i.bkp 's/;date.timezone =/date.timezone = America\/Toronto/' $VHOSTS/chroot/$PHPPATH/etc/php.ini

Les composants ne sont pas nécessairement mis à jour automatiquement dans l'environnement chrooted. Pour mettre à jour Composer par exemple, utilisez les commandes suivantes :

Sur CentOS et AlmaLinux:

./update-chroot.sh --add /usr/bin/composer
mkdir -p /var/www/vhosts/chroot/usr/lib64/plesk-9.0/
cp -f /usr/lib64/plesk-9.0/composer.phar /var/www/vhosts/chroot/usr/lib64/plesk-9.0/composer.phar
./update-chroot.sh --add env
./update-chroot.sh --apply all

Sur Ubuntu:

./update-chroot.sh --add /usr/bin/composer
mkdir /var/www/vhosts/chroot/usr/lib/plesk-9.0/
cp -f /usr/lib/plesk-9.0/composer.phar /var/www/vhosts/chroot/usr/lib/plesk-9.0/composer.phar
./update-chroot.sh --add env
./update-chroot.sh --apply all

Cette commande doit être exécuter à chaque fois que nous souhaitons mettre à jour Composer.

Node.JS, NPM et NPX

Sur notre serveur CentOS 7

Avec notre configuration de serveur actuel, il est facile d'utiliser node pour un CI/CD qui fonctionne bien. Voici une exemple testé avec Node 16 :

export PATH="$PATH:/opt/plesk/node/16/bin" && npm install --scripts-prepend-node-path > npm.log 2>&1
export PATH="$PATH:/opt/plesk/node/16/bin" && npx webpack build --config ./webpack.config.js > npx-webpack.log 2>&1
export PATH="$PATH:/opt/plesk/node/16/bin" && npx grunt-cli buildcss > npx-css.log 2>&1
touch ./tmp/restart.txt

Sur des serveurs plus récents

Sur ma plus récente installation de Plesk, j'ai eu plus de difficultées. J'ai dû ajouter explicitement Node.js pour arriver à mes fins et exécuter webpack sur le serveur.

rsync -avR /opt/plesk/node/ /var/www/vhosts/chroot/
./update-chroot.sh --apply all

Sur un autre installation encore plus récente et neuve (2023-02) sous Ubuntu 22.04.2 LTS, j'ai en plus eu à exécuter :

./update-chroot.sh --add /usr/lib/x86_64-linux-gnu/libdl*
./update-chroot.sh --add /usr/lib/x86_64-linux-gnu/libstdc*
./update-chroot.sh --add /usr/lib/x86_64-linux-gnu/libpthread*

Malgré ces ajouts, npm install en chroot ne fonctionnaient pas avec des modules plus complexes (c'est-à-dire des packages qui nécessitent node-gyp tels que sqlite4 ou sass). Je dois faire la première installation (pour que la compilation s'exécute) d'une des manière suivantes :

  • En utilisant l'interface Git de Plesk
  • En utilisant une connexion SSH root et en attribuant (chown) le dossier node_modules à l'utilisateur courant.

Heureusement, les Deploy actions fonctionnaient bien avec une syntaxe un peu particulière :

/opt/plesk/node/18/bin/npm install --include=dev --python=/usr/bin/python3 --verbose --scripts-prepend-node-path > npm.log 2>&1
/opt/plesk/node/18/bin/node ./node_modules/.bin/webpack build --config ./webpack.config.js > npx-webpack.log 2>&1
/opt/plesk/node/18/bin/node ./node_modules/.bin/grunt buildcss > npx-css.log 2>&1
touch ./tmp/restart.txt

Dans cet environnement, il m'a été impossible d'utilise npx directement.