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.