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.