SUDO : Déléguer des droits sous Linux

SUDO : Déléguer des droits sous Linux

Sudo est un logiciel libre permettant à un administrateur système de déléguer des droits et de donner la possibilité aux utilisateurs d’exécuter certaines commandes (ou même n’importe quelle commande) en tant que root ou tout autre utilisateur du système.

Introduction

La commande « sudo » est un outil crucial dans les systèmes d’exploitation Linux. Son nom est un acronyme de « Superuser Do » ou « Substitute User Do », ce qui illustre bien sa fonctionnalité principale : permettre à un utilisateur d’exécuter des commandes avec les privilèges d’un autre utilisateur, souvent celui du superutilisateur (aussi appelé « root »). En d’autres termes, « sudo » autorise un utilisateur à effectuer des tâches qui nécessitent des permissions élevées, habituellement réservées à l’administrateur du système.

Typiquement, un utilisateur standard peut utiliser « sudo » pour exécuter une commande en tant que superutilisateur après avoir fourni son propre mot de passe. Cela permet un contrôle granulaire sur les opérations système, améliorant ainsi la sécurité en limitant l’accès aux actions sensibles aux utilisateurs autorisés. L’usage de « sudo » est recommandé pour des raisons de sécurité, car il réduit l’exposition aux risques en limitant l’accès en tant que superutilisateur seulement lorsque nécessaire, et évite de devoir définir et partager un mot de passe pour l’utilisateur root.

Installation de « sudo »

Bien évidemment l’installation de sudo dépend de la distribution que vous utilisez voire même du type d’installation que vous faites.

Dans la plupart des installations classiques et ce pour la plupart des distributions, sudo sera déjà installé. Un moyen simple de le vérifier est d’essayer d’afficher la version du logiciel:

Bash
sudo --version
afficher la version de sudo

Si sudo n’est pas déjà installé, vous pouvez le faire directement depuis les dépôts officiels de votre distribution. Il vous faudra lancer l’installation avec l’utilisateur root. En cas de besoins vous pouvez vous référer aux articles sur apt, dnf et pacman.

Installer « sudo » sous Debian, Ubuntu et dérivés (deb)

Bash
apt install sudo

Installer « sudo » sous Red Hat, CentOS, Rocky Linux, Fedora, Almalinux (rpm)

Bash
dnf install sudo

Installer « sudo » sous Arch Linux

Bash
pacman -S sudo

Utilisation de base de « sudo »

Comme expliqué dans l’introduction, sudo permet d’exécuter une commande, un script, … en prenant l’identité d’un autre utilisateur. A défaut de préciser quel utilisateur ou groupe, ce sera l’identité de root qui sera utilisée.

L’utilisation la plus simple de sudo est donc la suivante:

Bash
sudo commande

Si nous avons le droit d’exécuter la commande via sudo, nous devons alors entrer notre propre mot de passe. Si cette authentification est réussie, par défaut elle restera valable pendant 5 minutes, ce qui nous évite de devoir entrer notre mot de passe à chaque commande.

exécution simple de la commande sudo

Concrètement, à chaque fois que nous devons exécuter une commande qui requiert des privilèges élevés (l’identité de root) nous ferons appel à sudo.

Comment ça marche ?

Si nous voulons l’utiliser correctement, nous devons comprendre comment sudo fonctionne.

« sudo » a le bit setUID activé

Le premier point se cache dans les attributs de la commande:

sudo a le bit setUID activé

Nous pouvons voir ici que la commande sudo a le setUID qui est activé. Cela signifie que quand cette commande est exécutée ce sont les droits du propriétaire de la commande (dans ce cas: root) qui sont utilisés et non ceux de celui qui l’exécute.

Les fichiers « sudoers »

Ensuite il faut nous intéresser au fichiers /etc/sudoers qui est lu et interprété par sudo à l’excécution de la commande et qui contient les règles permettant ou non aux utilisateurs d’utiliser la commande sudo.

Voici par exemple le contenu du fichier /etc/sudoers sous Ubuntu 22.04 LTS

/etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults	use_pty

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"

# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"

# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"

# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"

# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"

# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

Les lignes qui nous intéressent le plus les suivantes (notez qu’elles peuvent différer d’une distribution à l’autre):

root	ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo	ALL=(ALL:ALL) ALL

Ce sont là les règles qui définissent qui peut utiliser sudo et ce que nous pouvons faire avec. Pour l’instant comprenez simplement que ces trois lignes définissent que l’utilisateur root, le groupe admin et le groupe sudo peuvent utiliser la commande sudo pour exécuter n’importe quelle commande sous l’identité de n’importe quel utilisateur et n’importe quel groupe.

Par extension nous pouvons donc donner ces mêmes droits à n’importe quel utilisateur en l’ajoutant simplement au groupe sudo (sous Rocky Linux c’est le groupe wheel qui est utilisé à la place).

D’ailleurs si sudo est installé de base avec votre distribution, le premier utilisateur créé est généralement ajouté au groupe sudo ou wheel ou admin selon les distributions, ce que nous pouvons vérifier avec la commande id.

vérifier les groupes auquel on appartient

Si un utilisateur n’est pas listé dans ce fichier et qu’aucun groupe auquel il appartient n’y est listé non plus, alors il ne pourra pas utilisé la commande sudo.

Notez que sur certaines distributions comme Ubuntu ou Debian vous trouverez l’instruction @includedir /etc/sudoers.d dans le fichier /etc/sudoers. Celle-ci permet d’importer tout fichier présent dans le dossier /etc/sudoers.d, ce qui permet d’ajouter des règles et droits sans changer les fichiers de base de sudo.

Connaître ses droits

Nous pouvons à tout moment afficher les droits que nous avons à travers la commande sudo:

Bash
sudo -l

Voici le résultat pour un utilisateur ayant des droits sudo…

un utilisateur ayant des droits sudo

Et maintenant pour un utilisateur n’ayant aucun droit avec la commande sudo…

un utilisateur n'ayatant aucun droit sudo

Utilisation avancée de « sudo »

Outre le fait de simplement utiliser sudo pour exécuter une commande avec les privilèges de l’utilisateur root, nous pouvons l’utiliser pour ouvrir un shell ou encore pour exécuter une action sous l’identité d’un utilisateur ou un groupe bien spécifique.

Voici les principales options de la commande sudo:

Option courteOption longueDescription
-b--backgroundExécute la commande en arrière plan
-g--groupExécute la commande sous l’identité du groupe donné
-i--loginLance un login shell sous l’identité de l’utilisateur donné (root par défaut)
-l--listListe les privilèges de l’utilisateur
-s--shellLance un shell (sans login) sous l’identité de l’utilisateur donné (root par défaut)
-u--userExécute la commande sous l’identité de l’utilisateur spécifié

Exemples d’utilisation de la commande « sudo »

Voici une série d’exemple d’utilisation de la commande sudo. Nous partons du principe ici que l’utilisateur a bien les privilèges requis pour l’exécution de sudo.

Exécuter une commande en tant que root

Bash
sudo commande
sudo apt update

Lancer un shell en tant que root

Bash
sudo -s
sudo -s

Lancer une commande avec l’identité d’un utilisateur spécifique

Bash
sudo -u utilisateur commande
sudo -u joe touch /home/joe/test.txt

Lancer un shell avec l’identité d’un utilisateur spécifique

Bash
sudo -s -u utilisateur
sudo -s -u joe

Les fichiers de configuration « sudoers »

Comme nous déjà vu, les droits et privilèges accordés aux utilisateurs sont décrits dans le fichier /etc/sudoers. Si nous voulons profiter pleinement de cet outil, nous pouvons personnaliser les règles qui y sont décrites mais aussi en ajouter de nouvelles.

ATTENTION: il est fortement déconseillé d’éditer le fichier /etc/sudoers directement à l’aide d’un éditeur de texte. Si vous voulez modifier ce fichier, il faut passer par la commande visudo, sans quoi vous obtiendrai des résultats incohérents.

En ce qui me concerne je préfère de très loin laisser le fichier /etc/sudoers intact et ajouter mes modifications dans des fichiers annexes localisés dans le dossier /etc/surdoers.d. Ceci dit, cela ne change rien au résultat, les règles que nous créons sont exactement les mêmes.

Structure d’une règle « sudoers »

La structure d’une règle « sudo » est la suivante:

Plaintext
IDENTIFIANT  HOTE=(UTILISATEUR:GROUPE)  COMMANDES
  • IDENTIFIANT: un nom d’utilisateur ou de groupe, le nom d’un groupe est précédé de %.
  • HOTE: Sur quel hôte la commande sudo peut être exécutée.
  • UTILISATEUR: Quel identité d’utilisateur peut être utilisée.
  • GROUPE: Quel identité de groupe peut être utilisée.
  • COMMANDES: la liste des commandes qui peuvent être utilisées.

Il existe une série de mots clés prédéfinis que nous pouvons utiliser pour généraliser une règle. Par exemple ALL peut être utilisé pour signifier n’importe quel hôte, utilisateur, groupe ou même n’importe quelle commande.

Notez que la plupart du temps, la partie HOTE est ignorée (et définie à ALL), les spécifications d’hôtes n’ont de sens que si la configuration de sudo est centralisée.

Exemples de règles « sudoers »

Dans les exemples suivants, nous partirons du principe que nous avons un utilisateur « joe » et un groupe « techos » qui existent sur le système.

Ces règles peuvent être ajoutées dans /etc/sudoers en utilisant la commande visudo ou, si l’instruction @includedir /etc/sudoers.d est présente, dans n’importe quel fichier de ce dossier.

Donner tous les droits à un utilisateur

Plaintext
joe  ALL=(ALL:ALL)  ALL

Donner tous les droits à un groupe

Plaintext
%techos  ALL=(ALL:ALL)  ALL

N’autoriser que l’utilisation de l’identité de root pour n’importe quelle commande

Plaintext
joe  ALL=(root:root)  ALL

N’autoriser que l’utilisation des commandes « ps » et « ls » en tant que « root »

Plaintext
joe  ALL=(root:root)  /usr/bin/ls,/usr/bin/ps

Donner tous les privilèges et ne pas demander de mot de passe

Plaintext
joe  ALL=(ALL:ALL)  NOPASSWD:ALL

Notez que cette règle est extrêmement pratique et qu’il est tentant de l’utiliser tout le temps, mais l’utilisation d’un mot de passe est un gage de sécurité supplémentaire. Cette solution n’est à utiliser que dans des situations très spécifiques (ex: un labo de test).

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.