shell avec droit restreint

BUT : Créer un utilisateur qui accède à un shell avec des droits restreints, par exemple pour un développeur qui doit gérer un site via le ssh mais qui ne doit pas avoir tous les droits d’accès au serveur

Même si la gestion des utilisateurs linux permet de gérer les droits au niveau utilisateur et/ou groupe, l’accès à un terminal shell en ssh permet trop d’autorisation sans possibilité d’en faire une gestion fine.

Le shell restreint n’autorise pas :
– le changement de répertoire (commande ‘cd’ inactive)
– la modification des variables systèmes : $PATH, $SHELL, $BASH_ENV, $ENV
– les redirections de sortie
– les commandes avec des chemins (pas de ‘/’ utilisable)

Le lancement du shell restreint se fait par la commande ‘rbash’, certain linux n’ont pas de lien déjà créé entre rbash et bash et il faut explicitement le créer via ‘sudo ln -s /bin/bash /bin/rbash’ mais c’est inutile sous ubuntu.

bzg@uc:~$ ls -l /bin/rbash lrwxrwxrwx 1 root root 4 mars 7 13:30 /bin/rbash -> bash*

Un simple ‘ll’ permet de voir que la commande rbash est un lien vers bash

Il existe deux façon simple de lancer un shell restreint : ‘bash -r’ ou ‘rbash’

bzg@uc:~$ bash -r 
bzg@uc:~$ cd Images 
bash: cd: restreint 
bzg@uc:~$ exit exit 
bzg@uc:~$ rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ exit exit 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$

Dans les deux cas, nous ne pouvons pas changer de répertoire alors que dès la sortie du shell restreint tout fonctionne parfaitement.

Mais il est simple de contourner la restriction en lançant un programme qui permet de lancer une commande en interne, telque vim, telnet, ftp, etc

bzg@uc:~$ # Vérifions que nous sommes dans un bash standard 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$ cd 
bzg@uc:~$ # Lançons rbash 
bzg@uc:~$ rbash 
bzg@uc:~$ # Vérifions que nous sommes dans rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ # Lançons ftp puis une commande ouvrant un nouveau bash 
bzg@uc:~$ ftp 
ftp> !/bin/bash 
bzg@uc:~$ # Vérifions que nous sommes dans un bash standard 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$ # Sortons du bash standard 
bzg@uc:~/Images$ exit 
exit 
ftp> quit
bzg@uc:~$ # Vérifions que nous sommes de nouveau dans le rbash 
bzg@uc:~$ cd Images 
rbash: cd: restreint 
bzg@uc:~$ # Sortons 
bzg@uc:~$ exit 
bzg@uc:~$ # Vérifions que nous sommes sortie du rbash 
bzg@uc:~$ cd Images 
bzg@uc:~/Images$

Création d’un utilisateur restreint :

Cet utilisateur s’appelle ‘devel’ il ne pourra accéder qu’à son répertoire et n’exécuter que les commandes qui lui seront autorisées.

Création de son répertoire personnel (‘home’) et d’un répertoire de commandes via la commande ‘sudo mkdir -p /home/devel/bin’ (l’option -p créé les répertoires intermédiaires s’ils n’existent pas)

bzg@uc:~$ sudo mkdir -p /home/devel/bin

Création de l’utilisateur via ‘sudo useradd devel -s /bin/rbash’ et de son mot de passe via ‘sudo passwd devel’ (si l’utilisateur existe déjà changer son shell via ‘sudo usermod -s /bin/rbash devel’) :

bzg@uc:~$ sudo useradd devel -s /bin/rbash 
bzg@uc:~$ sudo passwd devel 
Nouveau mot de passe : 
Retapez le nouveau mot de passe : 
passwd : le mot de passe a été mis à jour avec succès

En se connectant en tant que ‘devel’, l’utilisateur se trouve dans un shell restreint mais il peut toujours s’en échapper via la comme ‘ftp’ :

devel@uc:~$ # La commande cd ne fonctionne pas puisque nous sommes restreint 
devel@uc:~$ cd 
rbash: cd: restreint 

devel@uc:~$ # Après le lancement de ftp puis d'un bash 
devel@uc:~$ ftp 
ftp> !/bin/bash
 devel@uc:~$ # Il n'y a pas d'erreur puisque nous sommes dans un bash standard 
 devel@uc:~$ cd 
 devel@uc:~$ # Sortie du bash standard 
 devel@uc:~$ exit 
 exit 
 ftp> quit

Limitation des commandes de l’utilisateur ‘devel’ :

Nous allons modifier son fichier ‘.bash_profile’ afin de limiter ses commandes au contenu de son répertoire ‘bin’ en y mettant ‘PATH=$HOME/bin’, nous allons changer le propriétaire des fichiers du répertoire utilisateur, puis assigner le fichier .bash_profile à l’utilisateur ‘root’ en autorisant ‘devel’ à l’exécuter

bzg@uc:/home/devel$ sudo nano /home/devel/.bash_profile
bzg@uc:/home/devel$ # Ajoutons PATH=$HOME/bin à la fin du fichier puis vérifions
bzg@uc:/home/devel$ cat .bash_profile 
PATH=$HOME/bin
bzg@uc:/home/devel$ sudo chown -R devel:devel /home/devel 
bzg@uc:/home/devel$ sudo chown root:root /home/devel/.bash_profile 
bzg@uc:/home/devel$ sudo chmod 755 /home/devel/.bash_profile 
bzg@uc:/home/devel$ ls -l /home/devel 
total 4 drwxr-xr-x 2 devel devel 4096 avril 6 18:52 bin 
bzg@uc:/home/devel$ ls -l /home/devel/.bash_profile 
-rwxr-xr-x 1 root root 15 avril 6 19:09 /home/devel/.bash_profile

Désormais l’utilisateur ‘devel’ ne peux accéder qu’aux commandes internes du bash (echo, etc), mais aucune commandes externes n’est utilisables, même pas ftp ou ls. Ce sera beaucoup plus difficile pour s’échapper de ce shell :

devel@uc:~$ echo $PATH 
/home/devel/bin 

devel@uc:~$ pwd 
/home/devel 

devel@uc:~$ ftp 
-rbash: /usr/lib/command-not-found : restriction : « / » ne peut pas être spécifié dans un nom de commande 
devel@uc:~$ ls 
-rbash: /usr/lib/command-not-found : restriction : « / » ne peut pas être spécifié dans un nom de commande

Donner accès aux commandes utiles à l’utilisateur ‘devel’ :

Nous devons simplement créer un lien entre la commande autorisée et le répertoire ‘bin’ de l’utilisateur comme dans l’exemple suivant :

bzg@uc:/home/devel$ sudo ln -s /bin/ls /home/devel/bin 
bzg@uc:/home/devel$ sudo ln -s /bin/cat /home/devel/bin

L’utilisateur ‘devel’ possède maintenant les commandes internes du bash et les commandes se trouvant dans ‘bin’ :

devel@uc:~$ pwd 
/home/devel 
devel@uc:~$ ls 
bin 

devel@uc:~$ cd bin 
-rbash: cd: restreint

Mais toujours pas la possibilité de passer outre les restrictions.

Enfin l’usage des restrictions peuvent être utilisées au sein d’un script bash, soit en démarrant le script par ‘#!/bin/rbash’ soit en armant le flag ‘r’ avec la commande ‘set -r’ :

Premier script :

#!/bin/rbash
echo « Mode restreint – commande autorisée »
pwd
echo « Mode restreint – commande non autorisée »
cd

bzg@uc:~$ nano script-1.sh 
bzg@uc:~$ chmod +x script-1.sh 
bzg@uc:~$ cat script-1.sh 
#!/bin/rbash 
echo "Mode restreint - commande autorisée" 
pwd 
echo "Mode restreint - commande non autorisée" 
cd 
bzg@uc:~$ ./script-1.sh 
Mode restreint - commande autorisée 
/home/bzg 
Mode restreint - commande non autorisée 
./script-1.sh: ligne 5 : cd: restreint

Deuxième script :

#!/bin/bash
echo « Mode standard »
pwd
cd
#!/bin/rbash
set -r
echo « Mode restreint »
pwd
cd

bzg@uc:~$ nano script-2.sh 
bzg@uc:~$ chmod +x script-2.sh 
bzg@uc:~$ cat script-2.sh 
#!/bin/bash 
echo "Mode standard" 
pwd 
cd 
#!/bin/rbash 
set -r echo "Mode restreint" 
pwd 
cd 
bzg@uc:~$ ./script-2.sh 
Mode standard 
/home/bzg 
Mode restreint 
/home/bzg 
./script-2.sh: ligne 9 : cd: restreint

En résumé : L’utilisation du bash en mode restreint permet de donner l’accès shell à un utilisateur en limitant ses autorisations.