Aller au contenu principal

SUDO et le principe de moindre privilège

sudo

Lorsqu'il s'agit de gérer un système Linux, l'accès à des privilèges élevés est souvent nécessaire pour effectuer certaines tâches administratives. Cependant, avec un grand pouvoir vient une grande responsabilité, et c'est là qu'entre en jeu l'outil sudo. Il est essentiel de comprendre comment utiliser sudo de manière adéquate pour garantir la sécurité de votre système.

Sudo, abréviation de "Substitute User Do," est une commande qui permet aux utilisateurs de Unix et Linux d'exécuter des commandes avec les privilèges d'un autre utilisateur, généralement l'utilisateur root (administrateur). Cette fonctionnalité est cruciale car elle permet de limiter l'accès aux ressources système sensibles tout en permettant aux utilisateurs autorisés d'accomplir des tâches administratives.

Historique

Pour comprendre pleinement l'importance de la commande sudo, il est essentiel de plonger dans son histoire. L'origine de sudo remonte aux premiers jours des systèmes Unix et Linux, et son développement a été guidé par la nécessité de gérer efficacement les privilèges sur ces systèmes.

Sudo a été développé en 1980 par Bob Coggeshall et Cliff Spencer à l'Université de Californie à Berkeley, qui était l'un des centres de développement pionniers pour les systèmes Unix. À l'origine, sudo avait pour but de résoudre un problème critique : comment permettre à des utilisateurs normaux d'exécuter des commandes avec les privilèges de l'utilisateur root, généralement réservés à l'administrateur du système.

Au fil des ans, sudo a évolué pour devenir un outil de gestion des privilèges flexible et puissant. Il a été adopté par de nombreuses distributions Linux ainsi que par d'autres systèmes Unix. Son utilisation s'est étendue au-delà de l'Université de Californie à Berkeley pour devenir une norme de facto dans le monde Unix/Linux.

Fondamentaux

Pour comprendre pleinement l'utilisation de la commande sudo, il est essentiel de maîtriser les fondamentaux qui sous-tendent son fonctionnement. Dans ce chapitre, nous aborderons le concept clé du "moindre privilège", le rôle de la commande sudo, et son utilisation de base.

Le Principe du "Moindre Privilège"

Le principe du "moindre privilège" est un concept fondamental en sécurité informatique. Il stipule que les utilisateurs et les processus doivent avoir le niveau de privilège le plus bas nécessaire pour accomplir leurs tâches. En d'autres termes, ne donnez pas plus de privilèges que ce qui est strictement requis. Ce principe vise à réduire les risques de sécurité en limitant la surface d'attaque potentielle.

Le Rôle de la Commande Sudo

La commande sudo est l'outil clé pour mettre en œuvre le principe du "moindre privilège" dans les systèmes Unix et Linux. Elle permet à un utilisateur d'exécuter des commandes avec les privilèges d'un autre utilisateur, généralement l'utilisateur root (administrateur). Cela signifie que même un utilisateur non administrateur peut accomplir des tâches administratives spécifiques sans avoir accès à l'ensemble des privilèges root.

Utilisation Courante de Sudo

Sudo est couramment utilisé dans les scénarios suivants :

  • Installation de Logiciels : Les utilisateurs peuvent utiliser sudo pour installer des logiciels système sans avoir besoin d'accès administratif complet.
  • Mise à Jour du Système : Les mises à jour du système, y compris la mise à jour de sécurité, sont généralement effectuées avec sudo.
  • Gestion des Services : Redémarrer des services, démarrer/arrêter des démons système, etc.
  • Configuration Réseau : Modifier les paramètres réseau, ajouter des routes, etc.

Utilisation de Base de Sudo

L'utilisation de base de sudo consiste à préfixer une commande avec "sudo" lors de son exécution. Par exemple, au lieu d'utiliser simplement "ls" pour lister le contenu d'un répertoire, vous pouvez utiliser "sudo ls" pour exécuter la commande en tant qu'administrateur, ce qui peut être nécessaire pour accéder à certains répertoires.

Exemple d'utilisation de base :

sudo commande

La première fois que vous utilisez sudo dans une session, il vous sera généralement demandé de saisir le mot de passe de votre propre compte utilisateur pour confirmer votre identité. Une fois authentifié, vous pouvez exécuter des commandes avec les privilèges accordés par sudo.

Emplacement du Fichier de Configuration

Le fichier de configuration de sudo est généralement situé à /etc/sudoers ou dans le répertoire /etc/sudoers.d/. Il est important de noter que ce fichier doit être édité avec précaution, car des erreurs de syntaxe peuvent entraîner des problèmes de sécurité.

Syntaxe du Fichier de Configuration

Le fichier de configuration de sudo est le pivot de son fonctionnement. Il détermine qui peut exécuter quelles commandes avec sudo et avec quels privilèges. Comprendre sa syntaxe est essentiel pour une utilisation efficace de sudo.

  1. Lignes de Commentaires : Les lignes commençant par le caractère dièse # sont des commentaires et sont ignorées par sudo. Vous pouvez les utiliser pour ajouter des notes ou des explications au fichier.

    Exemple :

    # Ceci est un commentaire
  2. Définition des Alias : Vous pouvez définir des alias pour rendre le fichier plus lisible et modulaire. Les alias sont utilisés pour regrouper des commandes, des utilisateurs, des groupes, etc.

    Exemple :

    User_Alias     ADMINS = johndoe, janedoe
    Cmnd_Alias UPDATE = /usr/bin/apt update, /usr/bin/apt upgrade

    Dans cet exemple, ADMINS est un alias pour les utilisateurs "johndoe" et "janedoe", et UPDATE est un alias pour les commandes apt.

  3. Définition des Utilisateurs et des Groupes : Vous pouvez spécifier des utilisateurs et des groupes de la manière suivante :

    • utilisateur : Pour spécifier un utilisateur individuel.
    • %groupe : Pour spécifier un groupe.
    • ALL : Pour faire correspondre tous les utilisateurs ou tous les groupes.

    Exemple :

    johndoe   ALL=(ALL:ALL)   ALL
    %admins ALL=(ALL:ALL) ALL

    Dans cet exemple, "johndoe" a des autorisations sudo pour toutes les commandes, et le groupe "admins" a également des autorisations sudo pour toutes les commandes.

  4. Spécification des Commandes : Vous pouvez spécifier les commandes ou les commandes alias que les utilisateurs sont autorisés à exécuter. Utilisez (ALL:ALL) pour spécifier tous les utilisateurs et tous les groupes, ou limitez les autorisations à des combinaisons spécifiques d'utilisateurs et de groupes.

    Exemple :

    johndoe   ALL=(ALL:ALL)   /usr/bin/apt update
    %admins ALL=(ALL:ALL) (root) NOPASSWD: /usr/bin/reboot

    Dans cet exemple, "johndoe" est autorisé à exécuter la commande "apt update", tandis que le groupe "admins" peut exécuter la commande "reboot" en tant qu'administrateur (root) sans mot de passe.

  5. Options de Sécurité : Vous pouvez spécifier des options de sécurité pour les règles sudo, telles que NOPASSWD (pas de mot de passe requis), PASSWD (mot de passe requis), NOPASSWD: (défini au niveau de la commande), PASSWD: (défini au niveau de la commande), etc.

    Exemple :

    johndoe   ALL=(ALL:ALL)   NOPASSWD: /usr/bin/apt update

    Dans cet exemple, "johndoe" peut exécuter la commande "apt update" sans nécessiter de mot de passe.

  6. Directive par Défaut : Vous pouvez spécifier des directives par défaut qui s'appliquent à tous les utilisateurs et commandes qui ne sont pas explicitement définis dans le fichier.

    Exemple :

    Defaults    requiretty

    Dans cet exemple, la directive "requiretty" est activée par défaut, ce qui signifie qu'un terminal est requis pour exécuter des commandes sudo.

  7. Directive Inclure : Vous pouvez inclure d'autres fichiers de configuration sudoers à l'aide de la directive "Include".

    Exemple :

    # Inclure d'autres fichiers de configuration
    # Inclut le fichier /etc/sudoers.d/01_custom
    # Inclut tous les fichiers dans /etc/sudoers.d/
    # (le caractère * est un caractère générique)
    # Inclut tous les fichiers dans /etc/sudoers.d/ sauf 99_disable
    Include /etc/sudoers.d/01_custom
    Include /etc/sudoers.d/*
    Exclude /etc/sudoers.d/99_disable

    Dans cet exemple, nous montrons comment inclure des fichiers de configuration supplémentaires et comment exclure certains fichiers spécifiques.

  8. Syntaxe de Fichier : Assurez-vous de suivre la syntaxe du fichier sudoers pour éviter les erreurs. Une syntaxe incorrecte peut rendre sudo inutilisable.

Ces sont les éléments de base de la syntaxe du fichier sudoers. Il est essentiel de comprendre cette syntaxe pour configurer correctement les autorisations sudo sur un système Unix/Linux. Veillez à toujours faire preuve de prudence lors de la modification du fichier sudoers, car une erreur de configuration peut entraîner des problèmes de sécurité graves. Pour éviter cela, il est recommandé d'utiliser la commande visudo pour éditer le fichier sudoers, car elle effectue des vérifications de syntaxe avant d'enregistrer les modifications.

Exemples de Syntaxe

Voici quelques exemples de syntaxe couramment utilisés dans le fichier de configuration de sudo :

web_admin   ALL=(www-data) /usr/bin/systemctl restart apache2

Dans cet exemple, l'utilisateur web_admin est autorisé à exécuter la commande /usr/bin/systemctl restart apache2 en tant qu'utilisateur www-data sans avoir besoin d'entrer un mot de passe.

Vérification de la Syntaxe du Fichier

Avant de sauvegarder des modifications dans le fichier de configuration sudoers, il est recommandé de vérifier la syntaxe pour éviter les erreurs potentielles. Vous pouvez le faire en utilisant la commande visudo, qui ouvre le fichier de configuration dans un éditeur spécifique à sudo et effectue une vérification de syntaxe avant de permettre la sauvegarde.

La syntaxe du fichier de configuration de sudo peut sembler complexe au début, mais avec de la pratique et en suivant les bonnes pratiques, vous pourrez gérer efficacement les privilèges des utilisateurs sur votre système Unix ou Linux.

Utilisation des Rôles

Les rôles dans sudo permettent de définir des ensembles spécifiques de privilèges pour un utilisateur ou un groupe d'utilisateurs. Cette fonctionnalité est extrêmement utile pour organiser et gérer les autorisations de manière plus granulaire, tout en maintenant la sécurité de votre système.

Création de Rôles

Pour créer un rôle dans sudo, vous devez éditer le fichier de configuration (/etc/sudoers) en utilisant visudo. Voici comment créer un rôle :

role_name   host=(user:group) command
  • role_name : Le nom du rôle que vous souhaitez créer.
  • host : L'hôte sur lequel le rôle est valable (généralement ALL pour tous les hôtes).
  • (user:group) : L'utilisateur et le groupe auxquels la commande peut être exécutée.
  • command : La commande spécifique autorisée pour ce rôle.

Exemples d'Utilisation des Rôles

Supposons que vous ayez un groupe d'utilisateurs responsables de la gestion des mise à jour de packages. Vous pouvez créer un rôle spécifique pour eux :

# Role apt_manager to manage system updates
Cmnd_Alias APT_COMMANDS = /usr/bin/apt update, /usr/bin/apt upgrade, /usr/bin/apt dist-upgrade, /usr/bin/apt autoremove

# Allow members of the apt_manager group to run APT_COMMANDS
%apt_manager ALL=(root) NOPASSWD: APT_COMMANDS

Dans cet exemple :

  • Nous utilisons Cmnd_Alias pour créer un alias nommé "APT_COMMANDS" qui regroupe plusieurs commandes apt, notamment la mise à jour, la mise à niveau, la mise à niveau de distribution et la suppression des paquets obsolètes.
  • Ensuite, nous autorisons tous les membres du groupe "apt_manager" à exécuter ces commandes sans nécessiter de mot de passe. Assurez-vous que le groupe "apt_manager" existe et ajoutez les utilisateurs souhaités à ce groupe.
sudo useradd test
sudo groupadd apt_manager
sudo usermod -a -G apt_manager test
sudo su - test
$ sudo apt update
Atteint :1 http://fr.archive.ubuntu.com/ubuntu jammy InRelease
Atteint :2 http://fr.archive.ubuntu.com/ubuntu jammy-updates InRelease
Atteint :3 https://apt.releases.hashicorp.com jammy InRelease
Atteint :4 http://fr.archive.ubuntu.com/ubuntu jammy-backports InRelease
Atteint :5 http://security.ubuntu.com/ubuntu jammy-security InRelease
Atteint :6 https://deb.nodesource.com/node_18.x nodistro InRelease
Réception de :7 https://dl.cloudsmith.io/public/infisical/infisical-cli/deb/ubuntu jammy InRelease [5142 B]
5142 o réceptionnés en 0s (12,7 ko/s)
Lecture des listes de paquets... Fait

Cela fonctionne !

Avantages de l'Utilisation des Rôles

L'utilisation de rôles présente plusieurs avantages :

  • Gestion Facilitée : Vous pouvez attribuer des privilèges spécifiques à des groupes d'utilisateurs sans avoir à éditer le fichier de configuration pour chaque utilisateur individuellement.
  • Sécurité Renforcée : En limitant les commandes autorisées pour chaque rôle, vous réduisez les risques potentiels liés à l'abus de privilèges.
  • Organisation Claire : Les rôles simplifient la gestion des autorisations en les regroupant de manière logique, ce qui facilite la maintenance.

L'utilisation judicieuse des rôles dans sudo est un élément essentiel de la gestion des privilèges sur les systèmes Unix et Linux. Elle permet de concilier sécurité et efficacité dans la gestion des ressources et des services.

Fonctionnement de sudo

Le fonctionnement de sudo :

  1. Commande Utilisateur : Tout commence quand un utilisateur entre une commande précédée de sudo. sudo est une commande Unix qui permet d'exécuter des commandes avec les privilèges du superutilisateur ou d'un autre utilisateur, selon la configuration.

  2. Sudo : Lorsque la commande sudo est exécutée, elle initie le processus de vérification et d'autorisation.

  3. Vérification du Fichier Sudoers : sudo consulte le fichier sudoers. Ce fichier contient les règles qui déterminent quels utilisateurs ou groupes peuvent exécuter quelles commandes et sur quels hôtes.

  4. Vérifications Multiples :

    • Permissions Utilisateur : sudo vérifie si l'utilisateur a les droits nécessaires pour exécuter la commande demandée.
    • Alias de Commande : Si la commande correspond à un alias défini dans le fichier sudoers, cette correspondance est vérifiée.
    • Spécifications de l'Hôte : sudo vérifie si la commande est autorisée à être exécutée sur l'hôte actuel.
    • Alias 'Run as' : Il détermine si l'utilisateur est autorisé à exécuter la commande en tant qu'un autre utilisateur ou groupe (par exemple, root).
  5. Décision d'Autorisation : Basé sur les résultats de ces vérifications, sudo décide si l'utilisateur a la permission d'exécuter la commande.

  6. Résultat de la Permission :

    • Oui : Si l'utilisateur a la permission, la commande est exécutée avec les privilèges de superutilisateur ou ceux de l'utilisateur cible spécifié.
    • Non : Si l'utilisateur n'a pas la permission, l'accès est refusé et un message d'erreur est affiché.
  7. Exécution de la Commande : Si la permission est accordée, la commande est exécutée avec les privilèges élevés.

  8. Message d'Erreur : Si la permission est refusée, sudo affiche un message d'erreur.

Ce processus permet de contrôler l'accès aux commandes nécessitant des privilèges élevés, assurant ainsi une sécurité accrue du système.

Lister les sudo's

Pour lister tous les utilisateurs et groupes qui ont des autorisations sudo sur un système Unix/Linux, vous pouvez utiliser la commande sudo avec l'option -l (list).

  1. Pour lister les utilisateurs et groupes ayant des autorisations sudo :

    sudo -l
  2. Pour lister les autorisations sudo d'un utilisateur spécifique, remplacez "nom_utilisateur" par le nom de l'utilisateur :

    sudo -lU nom_utilisateur

    Par exemple, pour lister les autorisations sudo de l'utilisateur "test" :

    sudo -lU tes

    Entrées Defaults correspondant pour test sur internal :
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty, log_input, log_output

    L'utilisateur test peut utiliser les commandes suivantes sur internal :
    (root) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade, /usr/bin/apt dist-upgrade, /usr/bin/apt autoremove

Ces commandes afficheront les autorisations sudo correspondantes pour l'utilisateur ou le groupe spécifié. Assurez-vous de disposer des droits d'administration pour exécuter ces commandes.

Audit

La journalisation des activités de sudo est une étape essentielle pour maintenir la sécurité et la transparence de votre système. L'audit de l'utilisation de sudo permet de savoir qui a exécuté des commandes avec des privilèges élevés, quelles commandes ont été exécutées et quand elles l'ont été. Cela facilite la détection d'éventuelles activités suspectes et la conformité aux politiques de sécurité.

Configuration de l'Audit

Pour activer l'audit des commandes sudo, vous devez éditer le fichier de configuration sudoers avec visudo et ajouter les options de journalisation appropriées. Voici un exemple de configuration pour activer l'audit des entrées et des sorties :

Defaults    log_input, log_output
  • log_input : Cette option enregistre l'entrée de chaque commande exécutée avec sudo, ce qui inclut la commande elle-même et ses arguments.
  • log_output : Cette option enregistre la sortie de chaque commande exécutée avec sudo, ce qui inclut le résultat de la commande.

Consultation des Journaux

Une fois l'audit activé, les informations de journalisation sont stockées dans les fichiers de logs système, généralement dans /var/log/auth.log (ou /var/log/secure sur certaines distributions). Vous pouvez utiliser des outils de visualisation de logs comme grep ou des outils de gestion de logs plus avancés pour analyser ces fichiers.

Exemple de commande pour consulter les logs de sudo :

grep sudo /var/log/auth.log

Dec 9 18:47:37 internal sudo: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Dec 9 18:47:44 internal sudo: test : TTY=pts/19 ; PWD=/usr/lib/security ; USER=root ; TSID=0I ; COMMAND=/usr/bin/apt update

Interprétation des Logs

Les logs de sudo enregistrent des informations précieuses telles que l'utilisateur qui a utilisé sudo, la commande exécutée, la date et l'heure de l'exécution. Il est important de surveiller régulièrement ces logs pour détecter toute activité anormale ou non autorisée.

Voici un exemple d'entrée de log :

Jan 10 15:30:45 myserver sudo: johndoe : TTY=pts/0 ; PWD=/home/johndoe ; USER=root ; COMMAND=/usr/bin/apt update
  • johndoe : L'utilisateur qui a utilisé sudo.
  • PWD : Le répertoire de travail de l'utilisateur.
  • USER=root : L'utilisateur en tant que lequel la commande a été exécutée.
  • COMMAND : La commande spécifique qui a été exécutée.

Importance de l'Audit

L'audit des activités de sudo est essentiel pour plusieurs raisons :

  • Sécurité : Il permet de détecter les tentatives d'utilisation abusive de privilèges et les accès non autorisés.
  • Conformité : Dans de nombreuses organisations, l'audit est requis pour se conformer aux réglementations de sécurité et de confidentialité des données.
  • Résolution de Problèmes : En cas de problème, les logs de sudo peuvent aider à comprendre ce qui s'est passé et à résoudre les problèmes.

L'audit est une composante clé de la gestion sécurisée de sudo, et il ne doit pas être négligé.

Bonnes Pratiques

L'utilisation de sudo, un outil puissant dans les systèmes d'exploitation basés sur Unix, permet aux utilisateurs d'exécuter des commandes avec les privilèges du superutilisateur ou d'un autre utilisateur. Bien que sudo soit essentiel pour la gestion des systèmes, une mauvaise utilisation peut entraîner des failles de sécurité majeures. Cela est particulièrement critique en lien avec des outils, qui peuvent être utilisés pour abuser des binaires autorisés par sudo pour exécuter des commandes en tant que superutilisateur.

GTFOBins est une base de données de méthodes pour exploiter les binaires Unix afin de contourner les restrictions de sécurité locales. Il répertorie des binaires qui peuvent être utilisés pour contourner les restrictions de sudo. Il est important de noter qu'il ne s'agit pas d'une liste d'exploits et que les programmes répertoriés ici ne sont pas vulnérables en soi. Il s'agit plutôt un recueil sur la façon de vivre de la terre lorsque vous ne disposez que de certains binaires.

Conclusion

Ce guide sur sudo nous a permis de plonger dans l'univers complexe de la gestion des privilèges sur les systèmes Unix et Linux. En comprenant ces concepts fondamentaux et en explorant les détails de la configuration de sudo, vous avez acquis une base solide pour gérer efficacement les privilèges sur les systèmes Unix et Linux. Continuez à pratiquer et à approfondir vos connaissances pour devenir un expert de sudo et garantir la sécurité de vos systèmes.