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électionnerCan 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 dossiernode_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.