sudo, sudoedit — exécuter une commande en tant qu’un autre utilisateur
SYNOPSIS
sudo -h | -K | -k | -V
sudo -v [-ABkNnS] [-g groupe] [-h hôte] [-p invite] [-u utilisateur]
sudo -l [-ABkNnS] [-g groupe] [-h hôte] [-p invite] [-U utilisateur] [-u utilisateur] [commande [arg ...]]
sudo [-ABbEHnPS] [-C num] [-D répertoire] [-g groupe] [-h hôte] [-p invite] [-R répertoire]
[-r rôle] [-t type] [-T délai] [-u utilisateur] [VAR=valeur] [-i | -s] [commande [arg ...]]
sudoedit [-ABkNnS] [-C num] [-D répertoire] [-g groupe] [-h hôte] [-p invite] [-R répertoire]
[-r rôle] [-t type] [-T délai] [-u utilisateur] fichier ...
DESCRIPTION
sudo permet à un utilisateur autorisé d’exécuter une commande en tant que superutilisateur ou un autre utilisateur, comme spécifié
par la politique de sécurité. L’ID utilisateur réel (et non effectif) de l’utilisateur qui invoque la commande est utilisé pour déterminer
le nom d’utilisateur avec lequel interroger la politique de sécurité.
sudo prend en charge une architecture de plugins pour les politiques de sécurité, l’audit et la journalisation des entrées/sorties.
Des tiers peuvent développer et distribuer leurs propres plugins pour fonctionner de manière transparente avec l’interface frontale sudo.
La politique de sécurité par défaut est sudoers, qui est configurée via le fichier /etc/sudoers, ou via LDAP. Voir la section « Plugins » pour plus d’informations.
La politique de sécurité détermine les privilèges, le cas échéant, dont dispose un utilisateur pour exécuter sudo. La politique peut exiger que les utilisateurs s’authentifient avec un mot de passe ou un autre mécanisme d’authentification. Si l’authentification est requise, sudo quittera le programme si le mot de passe de l’utilisateur n’est pas entré dans un délai configurable. Ce délai est spécifique à la politique ; le délai d’invite par défaut pour le mot de passe pour la politique de sécurité sudoers est de 0 minute.
Les politiques de sécurité peuvent prendre en charge la mise en cache des informations d’identification afin de permettre à l’utilisateur d’exécuter sudo à nouveau pendant une certaine période sans nécessiter d’authentification. Par défaut, la politique sudoers met en cache les informations d’identification par terminal pendant 15 minutes. Voir les options timestamp_type et timestamp_timeout dans sudoers(5) pour plus d’informations. En exécutant sudo avec l’option -v, un utilisateur peut mettre à jour les informations d’identification mises en cache sans exécuter de commande.
Sur les systèmes où sudo est la méthode principale pour obtenir des privilèges d’administrateur, il est essentiel d’éviter les erreurs de syntaxe dans les fichiers de configuration de la politique de sécurité. Pour la politique de sécurité par défaut, sudoers(5), les modifications apportées aux fichiers de configuration doivent être effectuées à l’aide de l’utilitaire visudo(8), qui garantira qu’aucune erreur de syntaxe n’est introduite.
Lorsqu’il est invoqué en tant que sudoedit, l’option -e (décrite ci-dessous) est implicite.
Les politiques de sécurité et les plugins d’audit peuvent enregistrer les tentatives réussies et infructueuses d’exécution de sudo. Si un plugin d’E/S est configuré, les entrées et les sorties de la commande en cours d’exécution peuvent également être enregistrées.
Les options sont les suivantes :
-A, --askpass
Normalement, si sudo nécessite un mot de passe, il le lit à partir du terminal de l’utilisateur. Si l’option -A (askpass) est spécifiée, un programme d’assistance (éventuellement graphique) est exécuté pour lire le mot de passe de l’utilisateur et afficher le mot de passe sur la sortie standard. Si la variable d’environnement SUDO_ASKPASS est définie, elle spécifie le chemin d’accès au programme d’assistance. Sinon, si sudo.conf(5) contient une ligne spécifiant le programme askpass, cette valeur sera utilisée. Par exemple :
# Chemin d’accès au programme d’assistance askpass
Path askpass /usr/bin/ssh-askpass
Si aucun programme askpass n’est disponible, sudo quittera avec une erreur.
-B, --bell
Faire sonner la cloche dans le cadre de l’invite de mot de passe lorsqu’un terminal est présent. Cette option n’a aucun effet si un programme askpass est utilisé.
-b, --background
Exécuter la commande donnée en arrière-plan. Il n’est pas possible d’utiliser le contrôle des tâches du shell pour manipuler les processus d’arrière-plan démarrés par sudo. La plupart des commandes interactives échoueront à fonctionner correctement en mode arrière-plan.
-C num, --close-from=num
Fermer tous les descripteurs de fichiers supérieurs ou égaux à num avant d’exécuter une commande. Les valeurs inférieures à trois ne sont pas autorisées. Par défaut, sudo fermera tous les descripteurs de fichiers ouverts, à l’exception de l’entrée standard, de la sortie standard et de la sortie d’erreur, lors de l’exécution d’une commande. La politique de sécurité peut restreindre la capacité de l’utilisateur à utiliser cette option. La politique sudoers autorise uniquement l’utilisation de l’option -C lorsque l’administrateur a activé l’option closefrom_override.
-D directory, --chdir=directory
Exécuter la commande dans le répertoire spécifié au lieu du répertoire de travail actuel. La politique de sécurité peut renvoyer une erreur si l’utilisateur n’a pas la permission de spécifier le répertoire de travail.
-E, --preserve-env
Indiquer à la politique de sécurité que l’utilisateur souhaite conserver ses variables d’environnement existantes. La politique de sécurité peut renvoyer une erreur si l’utilisateur n’a pas la permission de conserver l’environnement.
--preserve-env=list
Indiquer à la politique de sécurité que l’utilisateur souhaite ajouter la liste d’environnement séparée par des virgules aux variables d’environnement conservées de son environnement. La politique de sécurité peut renvoyer une erreur si l’utilisateur n’a pas la permission de conserver l’environnement. Cette option peut être spécifiée plusieurs fois.
-e, --edit
Modifier un ou plusieurs fichiers au lieu d’exécuter une commande. Au lieu d’un chemin, la chaîne « sudoedit » est utilisée lors de la consultation de la politique de sécurité. Si l’utilisateur est autorisé par la politique, les étapes suivantes sont effectuées :
Des copies temporaires des fichiers à modifier sont créées, avec le propriétaire défini sur l’utilisateur qui invoque la commande.
L’éditeur spécifié dans la politique est exécuté pour modifier les fichiers temporaires. La politique sudoers utilise les variables d’environnement SUDO_EDITOR, VISUAL et EDITOR (dans cet ordre). Si aucune des variables d’environnement SUDO_EDITOR, VISUAL ou EDITOR n’est définie, le premier programme répertorié dans l’option editor de sudoers(5) est utilisé.
Si les fichiers ont été modifiés, les fichiers temporaires sont recopiés à leur emplacement d’origine et les versions temporaires sont supprimées.
Afin d’empêcher la modification de fichiers non autorisés, les restrictions suivantes sont appliquées, sauf si la politique de sécurité l’autorise explicitement :
Les liens symboliques ne peuvent pas être modifiés (version 1.8.15 et versions ultérieures).
Les liens symboliques situés sur le chemin à modifier ne sont pas suivis lorsque le répertoire parent est accessible en écriture pour l’utilisateur qui exécute la commande, sauf si cet utilisateur est root (version 1.8.16 et versions ultérieures).
Les fichiers situés dans un répertoire accessible en écriture pour l’utilisateur qui exécute la commande ne peuvent pas être modifiés, sauf si cet utilisateur est root (version 1.8.16 et versions ultérieures).
Les utilisateurs ne sont jamais autorisés à modifier les fichiers spéciaux de périphérique.
Si le fichier spécifié n’existe pas, il sera créé. Contrairement à la plupart des commandes exécutées avec sudo, l’éditeur est exécuté avec l’environnement de l’utilisateur qui exécute la commande, sans modification. Si, pour une raison quelconque, le fichier temporaire devient vide après la modification, l’utilisateur sera invité avant qu’il ne soit installé. Si, pour une raison quelconque, sudo n’est pas en mesure de mettre à jour un fichier avec sa version modifiée, l’utilisateur recevra un avertissement et la copie modifiée restera dans un fichier temporaire.
-g groupe, --group=groupe
Exécute la commande avec le groupe principal défini sur groupe au lieu du groupe principal spécifié dans la base de données des mots de passe de l’utilisateur cible. Le groupe peut être soit un nom de groupe, soit un ID de groupe numérique (GID) précédé du caractère « # » (par exemple, « #0 » pour le GID 0). Lorsqu’une commande est exécutée en tant que GID, de nombreux shells exigent que le « # » soit échappé avec une barre oblique inverse (« \ »). Si aucune option -u n’est spécifiée, la commande sera exécutée en tant qu’utilisateur qui exécute la commande. Dans les deux cas, le groupe principal sera défini sur groupe. La politique sudoers autorise l’utilisation de n’importe lequel des groupes de l’utilisateur cible via l’option -g, tant que l’option -P n’est pas utilisée.
-H, --set-home
Demande à la politique de sécurité de définir la variable d’environnement HOME sur le répertoire personnel spécifié dans la base de données des mots de passe de l’utilisateur cible. En fonction de la politique, cela peut être le comportement par défaut.
-h, --help
Affiche un court message d’aide sur la sortie standard et quitte.
-h hôte, --host=hôte
Exécute la commande sur l’hôte spécifié si le plug-in de politique de sécurité prend en charge les commandes à distance. Le plug-in sudoers ne prend pas en charge l’exécution de commandes à distance. Cela peut également être utilisé en conjonction avec l’option -l pour lister les privilèges d’un utilisateur pour l’hôte distant.
-i, --login
Exécute le shell spécifié dans la base de données des mots de passe de l’utilisateur cible en tant que shell de connexion. Cela signifie que les fichiers de ressources spécifiques à la connexion, tels que .profile, .bash_profile ou .login, seront lus par le shell. Si une commande est spécifiée, elle est transmise au shell en tant que commande simple à l’aide de l’option -c. La commande et tous ses arguments sont concaténés, séparés par des espaces, après avoir échappé chaque caractère (y compris les espaces) avec une barre oblique inverse (« \ »), à l’exception des caractères alphanumériques, des traits de soulignement, des tirets et des signes dollar. Si aucune commande n’est spécifiée, un shell interactif est exécuté. Sudo tente de se déplacer vers le répertoire personnel de cet utilisateur avant d’exécuter le shell. La commande est exécutée avec un environnement similaire à celui qu’un utilisateur recevrait lors de la connexion. La plupart des shells se comportent différemment lorsqu’une commande est spécifiée par rapport à une session interactive ; consultez le manuel du shell pour plus de détails. La section Environnement de commande dans le manuel sudoers(5) documente la manière dont l’option -i affecte l’environnement dans lequel une commande est exécutée lorsque la politique sudoers est utilisée.
-K, --remove-timestamp
Similaire à l'option -k, mais supprime toutes les informations d'identification mises en cache pour l'utilisateur, quel que soit le terminal ou l'ID du processus parent. La prochaine fois que sudo est exécuté, un mot de passe doit être saisi si la politique de sécurité l'exige. Il n'est pas possible d'utiliser l'option -K en conjonction avec une commande ou une autre option. Cette option ne nécessite pas de mot de passe. Toutes les politiques de sécurité ne prennent pas en charge la mise en cache des informations d'identification.
-k, --reset-timestamp
Lorsqu'elle est utilisée sans commande, elle invalide les informations d'identification mises en cache de l'utilisateur pour la session actuelle. La prochaine fois que sudo est exécuté dans la session, un mot de passe doit être saisi si la politique de sécurité l'exige. Par défaut, la politique sudoers utilise un enregistrement distinct dans le cache d'informations d'identification pour chaque terminal (ou ID de processus parent s'il n'y a pas de terminal). Cela empêche l'option -k d'interférer avec les commandes sudo exécutées dans une session de terminal différente. Voir l'option timestamp_type dans sudoers(5) pour plus d'informations. Cette option ne nécessite pas de mot de passe et a été ajoutée pour permettre à un utilisateur de révoquer les autorisations sudo à partir d'un fichier .logout.
Lorsqu'elle est utilisée en conjonction avec une commande ou une option qui peut nécessiter un mot de passe, cette option fait que sudo ignore les informations d'identification mises en cache de l'utilisateur. Par conséquent, sudo invite à entrer un mot de passe (si cela est requis par la politique de sécurité) et ne met pas à jour les informations d'identification mises en cache de l'utilisateur.
Toutes les politiques de sécurité ne prennent pas en charge la mise en cache des informations d'identification.
-l, --list
Si aucune commande n'est spécifiée, affiche les privilèges de l'utilisateur qui exécute la commande (ou de l'utilisateur spécifié par l'option -U) sur l'hôte actuel. Un format de liste plus long est utilisé si cette option est spécifiée plusieurs fois et que la politique de sécurité prend en charge un format de sortie détaillé.
Si une commande est spécifiée et qu'elle est autorisée par la politique de sécurité pour l'utilisateur qui exécute la commande (ou l'utilisateur spécifié par l'option -U) sur l'hôte actuel, le chemin d'accès complet de la commande est affiché ainsi que tous les arguments. Si -l est spécifié plus d'une fois (et que la politique de sécurité le prend en charge), la règle correspondante est affichée dans un format détaillé ainsi que la commande. Si une commande est spécifiée mais pas autorisée par la politique, sudo quitte avec un code de retour de 1.
-N, --no-update
Ne pas mettre à jour les informations d'identification mises en cache de l'utilisateur, même si l'utilisateur s'authentifie avec succès.
Contrairement à l'option -k, les informations d'identification mises en cache existantes sont utilisées si elles sont valides. Pour détecter quand les informations d'identification mises en cache de l'utilisateur sont valides (ou quand aucune authentification n'est requise), vous pouvez utiliser :
sudo -Nnv
Toutes les politiques de sécurité ne prennent pas en charge la mise en cache des informations d'identification.
-n, --non-interactive
Éviter de demander à l'utilisateur de saisir des informations. Si un mot de passe est requis pour exécuter la commande, sudo affichera un message d'erreur et se terminera.
-P, --preserve-groups
Conserver le vecteur de groupes de l'utilisateur appelant inchangé. Par défaut, la politique sudoers initialise le vecteur de groupes à la liste des groupes dont l'utilisateur cible est membre. Les ID de groupe réels et effectifs sont toutefois définis pour correspondre à l'utilisateur cible.
-p prompt, --prompt=prompt
Utiliser une invite de mot de passe personnalisée avec des séquences d'échappement facultatives. Les séquences d'échappement suivantes sont prises en charge par la politique sudoers :
%H se développe en nom d'hôte, y compris le nom de domaine (uniquement si le nom d'hôte de la machine est entièrement qualifié ou si l'option fqdn est définie dans sudoers(5))
%h se développe en nom d'hôte local sans le nom de domaine
%p se développe en nom de l'utilisateur dont le mot de passe est demandé (respecte les indicateurs rootpw, targetpw et runaspw dans sudoers(5))
%U se développe en nom de connexion de l'utilisateur sous lequel la commande sera exécutée (par défaut, root, sauf si l'option -u est également spécifiée)
%u se développe en nom de connexion de l'utilisateur appelant
%% deux caractères ‘%’ consécutifs sont réduits à un seul caractère ‘%’
L'invite personnalisée remplacera l'invite par défaut spécifiée par la politique de sécurité ou la variable d'environnement SUDO_PROMPT. Sur les systèmes qui utilisent PAM, l'invite personnalisée remplacera également l'invite spécifiée par un module PAM, sauf si l'indicateur passprompt_override est désactivé dans sudoers.
-R directory, --chroot=directory
Passer au répertoire racine spécifié (voir chroot(8)) avant d'exécuter la commande. La politique de sécurité peut renvoyer une erreur si l'utilisateur n'a pas la permission de spécifier le répertoire racine.
Cette option est obsolète et sera supprimée dans une version ultérieure de sudo.
-r role, --role=role
Exécuter la commande avec un contexte de sécurité SELinux qui inclut le rôle spécifié.
-S, --stdin
Écrire l'invite sur la sortie d'erreur standard et lire le mot de passe à partir de l'entrée standard au lieu d'utiliser le périphérique de terminal.
-s, --shell
Exécuter le shell spécifié par la variable d'environnement SHELL si elle est définie, ou le shell spécifié dans l'entrée de base de données des mots de passe de l'utilisateur appelant. Si une commande est spécifiée, elle est transmise au shell en tant que commande simple à l'aide de l'option -c. La commande et tous les arguments sont concaténés, séparés par des espaces, après avoir échappé chaque caractère (y compris les espaces) avec une barre oblique inverse (‘\’), à l'exception des caractères alphanumériques, des traits de soulignement, des tirets et des signes dollar. Si aucune commande n'est spécifiée, un shell interactif est exécuté. La plupart des shells se comportent différemment lorsqu'une commande est spécifiée par rapport à une session interactive ; consultez le manuel du shell pour plus de détails.
-t type, --type=type
Exécute la commande avec un contexte de sécurité SELinux qui inclut le type spécifié. Si aucun type n’est spécifié, le type par défaut est dérivé du rôle.
-U user, --other-user=user
Utilisé en conjonction avec l’option -l pour lister les privilèges pour un utilisateur autre que l’utilisateur qui invoque la commande. La stratégie de sécurité peut restreindre la possibilité de lister les privilèges d’autres utilisateurs. Lorsque vous utilisez la stratégie sudoers, l’option -U est restreinte à l’utilisateur root et aux utilisateurs disposant soit du privilège « list » pour l’utilisateur spécifié, soit de la possibilité d’exécuter n’importe quelle commande en tant que root ou utilisateur sur l’hôte actuel.
-T timeout, --command-timeout=timeout
Utilisé pour définir un délai d’attente pour la commande. Si le délai d’attente expire avant que la commande ne se termine, la commande sera interrompue. La stratégie de sécurité peut restreindre la possibilité de l’utilisateur de définir des délais d’attente. La stratégie sudoers exige que les délais d’attente spécifiés par l’utilisateur soient explicitement activés.
-u user, --user=user
Exécute la commande en tant qu’un utilisateur autre que l’utilisateur cible par défaut (généralement root). L’utilisateur peut être un nom d’utilisateur ou un ID utilisateur numérique (UID) précédé du caractère « # » (par exemple, « #0 » pour l’UID 0). Lors de l’exécution de commandes en tant qu’UID, de nombreux shells exigent que le « # » soit échappé avec une barre oblique inverse (« \ »). Certaines stratégies de sécurité peuvent restreindre les UID aux seuls UID répertoriés dans la base de données des mots de passe. La stratégie sudoers autorise les UID qui ne figurent pas dans la base de données des mots de passe, à condition que l’option targetpw ne soit pas définie. D’autres stratégies de sécurité peuvent ne pas prendre en charge cela.
-V, --version
Affiche la chaîne de version de sudo ainsi que la chaîne de version de tous les plugins configurés. Si l’utilisateur qui invoque la commande est déjà root, l’option -V affiche les options transmises à configure lors de la compilation de sudo ; les plugins peuvent afficher des informations supplémentaires, telles que les options par défaut.
-v, --validate
Met à jour les informations d’identification mises en cache de l’utilisateur, en authentifiant l’utilisateur si nécessaire. Pour le plugin sudoers, cela prolonge le délai d’attente sudo de 15 minutes par défaut, mais n’exécute pas de commande. Toutes les stratégies de sécurité ne prennent pas en charge les informations d’identification mises en cache.
--
Le « -- » est utilisé pour délimiter la fin des options sudo. Les options suivantes sont transmises à la commande.
Les options qui prennent une valeur ne peuvent être spécifiées qu’une seule fois, sauf indication contraire dans la description. Cela permet d’éviter les problèmes causés par les scripts mal écrits qui invoquent sudo avec des entrées contrôlées par l’utilisateur.
Les variables d’environnement à définir pour la commande peuvent également être transmises sous forme d’options à sudo sous la forme VAR=valeur, par exemple LD_LIBRARY_PATH=/usr/local/pkg/lib. Les variables d’environnement peuvent être soumises à des restrictions imposées par le plugin de stratégie de sécurité. La stratégie sudoers soumet les variables d’environnement transmises en tant qu’options aux mêmes restrictions que les variables d’environnement existantes, avec une différence importante. Si l’option setenv est définie dans sudoers, la commande à exécuter a la balise SETENV définie ou la commande correspondante est ALL, l’utilisateur peut définir des variables qui seraient autrement interdites. Voir sudoers(5) pour plus d’informations.
EXÉCUTION DE COMMANDE
Lorsque sudo exécute une commande, la politique de sécurité spécifie l’environnement d’exécution de la commande. Généralement, les ID utilisateur et de groupe réels et effectifs sont définis pour correspondre à ceux de l’utilisateur cible, comme spécifié dans la base de données des mots de passe, et le vecteur de groupe est initialisé en fonction de la base de données des groupes (à moins que l’option -P n’ait été spécifiée).
Les paramètres suivants peuvent être spécifiés par la politique de sécurité :
ID utilisateur réel et effectif
ID de groupe réel et effectif
ID de groupe supplémentaires
la liste des environnements
répertoire de travail actuel
masque de création de fichier (umask)
rôle et type SELinux
priorité d’ordonnancement (également appelée valeur « nice »)
Modèle de processus
Il existe deux manières distinctes dont sudo peut exécuter une commande.
Si un plugin de journalisation des E/S est configuré pour enregistrer les E/S du terminal, ou si la politique de sécurité le demande explicitement, un nouveau pseudo-terminal (« pty ») est alloué et fork(2) est utilisé pour créer un deuxième processus sudo, appelé moniteur. Le moniteur crée une nouvelle session de terminal avec lui-même comme leader et le pty comme terminal de contrôle, appelle à nouveau fork(2), configure l’environnement d’exécution comme décrit ci-dessus, puis utilise l’appel système execve(2) pour exécuter la commande dans le processus enfant. Le moniteur a pour but de relayer les signaux de contrôle des tâches entre le terminal de l’utilisateur et le pty dans lequel la commande s’exécute. Cela permet de suspendre et de reprendre la commande normalement. Sans le moniteur, la commande serait dans ce que POSIX appelle un « groupe de processus orphelin » et elle ne recevrait aucun signal de contrôle des tâches du noyau. Lorsque la commande se termine ou est interrompue par un signal, le moniteur transmet le code de sortie de la commande au processus sudo principal et se termine. Après avoir reçu le code de sortie de la commande, le processus sudo principal transmet le code de sortie de la commande à la fonction de fermeture de la politique de sécurité, ainsi qu’à la fonction de fermeture de tout plugin d’audit configuré, et se termine. Ce mode est la valeur par défaut pour les versions de sudo 1.9.14 et ultérieures lors de l’utilisation de la politique sudoers.
Si aucun pty n’est utilisé, sudo appelle fork(2), configure l’environnement d’exécution comme décrit ci-dessus et utilise l’appel système execve(2) pour exécuter la commande dans le processus enfant. Le processus sudo principal attend que la commande soit terminée, puis transmet le code de sortie de la commande à la fonction de fermeture de la politique de sécurité, ainsi qu’à la fonction de fermeture de tout plugin d’audit configuré, et se termine.
Dans un cas particulier, si le plugin de politique ne définit pas de fonction de fermeture, sudo exécutera directement la commande au lieu d’appeler d’abord fork(2). Le plugin de politique sudoers ne définira une fonction de fermeture que lorsque la journalisation des E/S est activée, qu’un pty est requis, qu’un rôle SELinux est spécifié, que la commande a un délai d’attente associé ou que les options pam_session ou pam_setcred sont activées. Les deux options pam_session et pam_setcred sont activées par défaut sur les systèmes utilisant PAM. Ce mode est la valeur par défaut pour les versions de sudo antérieures à 1.9.14 lors de l’utilisation de la politique sudoers.
Sur les systèmes qui utilisent PAM, la fonction de fermeture de la politique de sécurité est responsable de la fermeture de la session PAM. Elle peut également enregistrer le code de sortie de la commande.
Gestion des signaux
Lorsque la commande est exécutée en tant que processus enfant du processus sudo, sudo relaiera les signaux qu'il reçoit à la commande. Les signaux SIGINT et SIGQUIT ne sont relayés que lorsque la commande est exécutée dans un nouveau terminal ou lorsque le signal a été envoyé par un processus utilisateur, et non par le noyau. Cela empêche la commande de recevoir SIGINT deux fois à chaque fois que l'utilisateur appuie sur Ctrl+C. Certains signaux, tels que SIGSTOP et SIGKILL, ne peuvent pas être interceptés et ne seront donc pas relayés à la commande. En règle générale, SIGTSTP doit être utilisé à la place de SIGSTOP lorsque vous souhaitez suspendre une commande exécutée par sudo.
Dans un cas particulier, sudo ne relaiera pas les signaux qui ont été envoyés par la commande qu'il exécute. Cela empêche la commande de s'interrompre accidentellement. Sur certains systèmes, l'utilitaire reboot(8) envoie SIGTERM à tous les processus non système, à l'exception de lui-même, avant de redémarrer le système. Cela empêche sudo de relayer le signal SIGTERM qu'il a reçu à reboot(8), ce qui pourrait alors se terminer avant que le système ne soit réellement redémarré, le laissant dans un état semi-mort similaire au mode utilisateur unique. Notez cependant que cette vérification ne s'applique qu'à la commande exécutée par sudo et non à d'autres processus que la commande peut créer. En conséquence, l'exécution d'un script qui appelle reboot(8) ou shutdown(8) via sudo peut amener le système à se trouver dans cet état indéfini, à moins que reboot(8) ou shutdown(8) ne soient exécutés à l'aide de la famille de fonctions exec() au lieu de system() (ce qui interpose un shell entre la commande et le processus appelant).
Plugins
Les plugins peuvent être spécifiés via des directives Plugin dans le fichier sudo.conf(5). Ils peuvent être chargés en tant qu'objets partagés dynamiques (sur les systèmes qui les prennent en charge) ou compilés directement dans le binaire sudo. Si aucun fichier sudo.conf(5) n'est présent, ou s'il ne contient aucune ligne Plugin, sudo utilisera sudoers(5) pour les plugins de politique, d'audit et de journalisation des entrées/sorties. Consultez le manuel sudo.conf(5) pour plus de détails sur le fichier /etc/sudo.conf et le manuel sudo_plugin(5) pour plus d'informations sur l'architecture des plugins sudo.
VALEUR DE SORTIE
Lors de l'exécution réussie d'une commande, le code de sortie de sudo sera le code de sortie du programme qui a été exécuté. Si la commande se termine en raison de la réception d'un signal, sudo enverra à lui-même le même signal qui a interrompu la commande.
Si l’option -l est spécifiée sans commande, sudo quittera avec une valeur de 0 si l’utilisateur est autorisé à exécuter sudo et s’il s’est authentifié avec succès (comme l’exige la politique de sécurité). Si une commande est spécifiée avec l’option -l, la valeur de sortie sera de 0 uniquement si la commande est autorisée par la politique de sécurité ; sinon, elle sera de 1.
Si une erreur d’authentification, un problème de configuration/d’autorisation ou si la commande donnée ne peut pas être exécutée, sudo quitte avec une valeur de 1. Dans ce dernier cas, la chaîne d’erreur est imprimée sur la sortie standard d’erreur. Si sudo ne peut pas stat(2) un ou plusieurs éléments dans le PATH de l’utilisateur, une erreur est imprimée sur la sortie standard d’erreur. (Si le répertoire n’existe pas ou s’il n’est pas réellement un répertoire, l’entrée est ignorée et aucune erreur n’est imprimée.) Cela ne devrait pas se produire dans des circonstances normales. La raison la plus courante pour que stat(2) renvoie « autorisation refusée » est que vous exécutez un monteur automatique et qu’un des répertoires de votre PATH se trouve sur une machine qui est actuellement inaccessible.
NOTES DE SÉCURITÉ
sudo essaie d’être sûr lorsqu’il exécute des commandes externes.
Pour empêcher l’usurpation de commande, sudo vérifie « . » et « » (qui désignent tous les deux le répertoire courant) en dernier lorsqu’il recherche une commande dans le PATH de l’utilisateur (si l’un ou l’autre se trouve dans le PATH). En fonction de la politique de sécurité, la variable d’environnement PATH de l’utilisateur peut être modifiée, remplacée ou transmise inchangée au programme que sudo exécute.
Les utilisateurs ne doivent jamais se voir accorder de privilèges sudo pour exécuter des fichiers qui sont accessibles en écriture par l’utilisateur ou qui se trouvent dans un répertoire accessible en écriture par l’utilisateur. Si l’utilisateur peut modifier ou remplacer la commande, il n’y a aucun moyen de limiter les commandes supplémentaires qu’il peut exécuter.
Par défaut, sudo ne consigne que la commande qu’il exécute explicitement. Si un utilisateur exécute une commande telle que « sudo su » ou « sudo sh », les commandes ultérieures exécutées à partir de ce shell ne sont pas soumises à la politique de sécurité de sudo. Il en va de même pour les commandes qui offrent des échappatoires de shell (y compris la plupart des éditeurs). Si la consignation E/S est activée, les commandes ultérieures verront leur entrée et/ou leur sortie consignées, mais il n’y aura pas de journaux traditionnels pour ces commandes. Pour cette raison, il faut faire attention lors de l’octroi aux utilisateurs d’un accès à des commandes via sudo pour vérifier que la commande ne donne pas involontairement à l’utilisateur un shell root effectif. Pour plus d’informations sur les moyens de résoudre ce problème, consultez la section « Prévention des échappatoires de shell » dans sudoers(5).
Pour empêcher la divulgation d’informations potentiellement sensibles, sudo désactive par défaut les fichiers de vidage du cœur pendant son exécution (ils sont réactivés pour la commande exécutée). Cette pratique historique remonte à une époque où la plupart des systèmes d’exploitation autorisaient par défaut les processus définis avec l’ID utilisateur à effectuer un vidage du cœur. Pour faciliter le débogage des plantages de sudo, vous pouvez souhaiter réactiver les fichiers de vidage du cœur en définissant « disable_coredump » à false dans le fichier sudo.conf(5) comme suit :
Définir disable_coredump sur false
Pour plus d'informations, consultez le manuel sudo.conf(5).
ENVIRONNEMENT
sudo utilise les variables d'environnement suivantes. La politique de sécurité contrôle le contenu réel de l'environnement de la commande.
EDITOR Éditeur par défaut à utiliser en mode -e (sudoedit) si ni SUDO\_EDITOR ni VISUAL
ne sont définis.
MAIL Défini sur le spool de courrier de l'utilisateur cible lorsque l'option -i est spécifiée, ou
lorsque env\_reset est activé dans sudoers (à moins que MAIL ne soit présent dans la liste env\_keep).
HOME Défini sur le répertoire personnel de l'utilisateur cible lorsque les options -i ou -H sont spécifiées, lorsque l'option -s est spécifiée et que set\_home est défini dans sudoers, lorsque
always\_set\_home est activé dans sudoers, ou lorsque env\_reset est activé dans sudoers
et que HOME n'est pas présent dans la liste env\_keep.
LOGNAME Défini sur le nom de connexion de l'utilisateur cible lorsque l'option -i est spécifiée, lorsque
l'option set\_logname est activée dans sudoers, ou lorsque l'option env\_reset est
activée dans sudoers (à moins que LOGNAME ne soit présent dans la liste env\_keep).
PATH Peut être modifié par la politique de sécurité.
SHELL Utilisé pour déterminer le shell à exécuter avec l'option -s.
SUDO\_ASKPASS Spécifie le chemin d'accès à un programme d'assistance utilisé pour lire le mot de passe s'il n'y a pas de terminal disponible ou si l'option -A est spécifiée.
SUDO\_COMMAND Défini sur la commande exécutée par sudo, y compris tous les arguments. Les arguments sont tronqués à 4096 caractères pour éviter une erreur d'exécution potentielle.
SUDO\_EDITOR Éditeur par défaut à utiliser en mode -e (sudoedit).
SUDO\_GID Défini sur l'ID de groupe de l'utilisateur qui a invoqué sudo.
SUDO\_HOME Défini sur le répertoire personnel de l'utilisateur qui a invoqué sudo.
SUDO\_PROMPT Utilisé comme invite de mot de passe par défaut, sauf si l'option -p a été spécifiée.
SUDO\_PS1 Si défini, PS1 sera défini sur sa valeur pour le programme en cours d'exécution.
SUDO\_TTY Défini sur le périphérique terminal de l'utilisateur qui a invoqué sudo, s'il est présent.
SUDO\_UID Défini sur l'ID utilisateur de l'utilisateur qui a invoqué sudo.
SUDO\_USER Défini sur le nom de connexion de l'utilisateur qui a invoqué sudo.
USER Défini sur la même valeur que LOGNAME, décrit ci-dessus.
VISUAL Éditeur par défaut à utiliser en mode -e (sudoedit) si SUDO\_EDITOR n'est pas défini.
FICHIERS
/etc/sudo.conf configuration du front-end sudo
EXEMPLES
Les exemples suivants supposent une politique de sécurité correctement configurée.
Pour obtenir une liste de fichiers d'un répertoire illisible :
$ sudo ls /usr/local/protected
Pour lister le répertoire personnel de l'utilisateur yaz sur une machine où le système de fichiers contenant \~yaz n'est pas exporté en tant que root :
$ sudo -u yaz ls ~yaz
Pour modifier le fichier index.html en tant qu'utilisateur www :
$ sudoedit -u www ~www/htdocs/index.html
Pour afficher les journaux système accessibles uniquement à root et aux utilisateurs du groupe adm :
$ sudo -g adm more /var/log/syslog
Pour exécuter un éditeur en tant qu’utilisateur jim avec un groupe principal différent :
$ sudoedit -u jim -g audio ~jim/sound.txt
Pour arrêter une machine :
$ sudo shutdown -r +15 "redémarrage rapide"
Pour obtenir une liste de l’utilisation des répertoires dans la partition /home. Les commandes sont exécutées dans un sous-shell pour permettre aux commandes « cd » et à la redirection de fichiers de fonctionner.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
DIAGNOSTIQUES
Les messages d’erreur produits par sudo incluent :
l’édition de fichiers dans un répertoire accessible en écriture n’est pas autorisée
Par défaut, sudoedit n’autorise pas l’édition d’un fichier lorsque l’un des répertoires parents est accessible en écriture par l’utilisateur qui exécute la commande. Cela évite une condition de concurrence qui pourrait permettre à l’utilisateur d’écraser un fichier arbitraire. Voir l’option sudoedit_checkdir dans sudoers(5) pour plus d’informations.
l’édition de liens symboliques n’est pas autorisée
Par défaut, sudoedit ne suit pas les liens symboliques lors de l’ouverture des fichiers. Voir l’option sudoedit_follow dans sudoers(5) pour plus d’informations.
l’UID effectif n’est pas 0, sudo est-il installé avec le bit setuid root ?
sudo n’a pas été exécuté avec les privilèges root. Le binaire sudo doit appartenir à l’utilisateur root et avoir le bit set-user-ID défini. De plus, il ne doit pas être situé sur un système de fichiers monté avec l’option « nosuid » ou sur un système de fichiers NFS qui mappe l’UID 0 à un UID non privilégié.
l’UID effectif n’est pas 0, sudo est-il situé sur un système de fichiers avec l’option « nosuid » définie ou sur un système de fichiers NFS sans privilèges root ?
sudo n’a pas été exécuté avec les privilèges root. Le binaire sudo a le propriétaire et les autorisations appropriés, mais il n’a toujours pas été exécuté avec les privilèges root. La raison la plus courante est que le système de fichiers sur lequel se trouve le binaire sudo est monté avec l’option « nosuid » ou qu’il s’agit d’un système de fichiers NFS qui mappe l’UID 0 à un UID non privilégié.
erreur fatale, impossible de charger les plugins
Une erreur s’est produite lors du chargement ou de l’initialisation des plugins spécifiés dans sudo.conf(5).
nom de variable d’environnement non valide
Un ou plusieurs noms de variables d’environnement spécifiés via l’option -E contenaient un signe égal (=). Les arguments de l’option -E doivent être des noms de variables d’environnement sans valeur associée.
aucun mot de passe n’a été fourni
Lorsque sudo a tenté de lire le mot de passe, il n’a reçu aucun caractère. Cela peut se produire lorsqu’aucun terminal n’est disponible (ou que l’option -S est spécifiée) et que l’entrée standard a été redirigée à partir de /dev/null.
un terminal est requis pour lire le mot de passe
sudo doit lire le mot de passe, mais aucun mécanisme n’est disponible pour le faire. Les commandes distantes exécutées via ssh(1) n’ont pas de terminal disponible par défaut ; le passage de l’option -t à ssh(1) entraînera l’allocation d’un terminal, ce qui devrait permettre à sudo de lire le mot de passe. Pour permettre à sudo d’exécuter des commandes locales sans terminal, l’option -S peut être utilisée pour lire un mot de passe à partir de l’entrée standard, ou un assistant askpass peut être configuré via le fichier sudo.conf(5) ou en définissant la variable d’environnement SUDO_ASKPASS.
Aucun répertoire temporaire accessible en écriture n’a été trouvé.
sudoedit n’a pas pu trouver de répertoire temporaire utilisable dans lequel stocker ses fichiers intermédiaires.
Le drapeau « nouvelles autorisations interdites » est défini, ce qui empêche sudo de s’exécuter en tant que root.
sudo a été exécuté par un processus qui a le drapeau « nouvelles autorisations interdites » de Linux défini. Cela fait que le bit set-user-ID est ignoré lors de l’exécution d’un exécutable, ce qui empêchera sudo de fonctionner. La cause la plus probable est l’exécution de sudo dans un conteneur qui définit ce drapeau. Vérifiez la documentation pour voir s’il est possible de configurer le conteneur de sorte que ce drapeau ne soit pas défini.
sudo doit être la propriété de l’UID 0 et avoir le bit setuid défini.
sudo n’a pas été exécuté avec des privilèges root. Le binaire sudo n’a pas le propriétaire ou les autorisations correctes. Il doit être la propriété de l’utilisateur root et avoir le bit set-user-ID défini.
sudoedit n’est pas pris en charge sur cette plateforme.
Il est uniquement possible d’exécuter sudoedit sur les systèmes qui prennent en charge la définition de l’ID utilisateur effectif.
Délai d’attente dépassé pour la lecture du mot de passe.
L’utilisateur n’a pas entré de mot de passe avant que le délai d’attente du mot de passe (5 minutes par défaut) ne soit dépassé.
vous n’existez pas dans la base de données passwd.
Votre ID d’utilisateur n’apparaît pas dans la base de données système passwd.
vous ne pouvez pas spécifier de variables d’environnement en mode édition.
Il est uniquement possible de spécifier des variables d’environnement lors de l’exécution d’une commande. Lorsque vous modifiez un fichier, l’éditeur s’exécute avec l’environnement de l’utilisateur inchangé.
VOIR AUSSI
su(1), stat(2), login_cap(3), passwd(5), sudo.conf(5), sudo_plugin(5), sudoers(5), sudoers_timestamp(5), sudoreplay(8), visudo(8).
HISTORIQUE
Consultez le fichier HISTORY.md dans la distribution sudo (https://www.sudo.ws/about/history/) pour obtenir un bref historique de sudo.
AUTEURS
De nombreuses personnes ont travaillé sur sudo au fil des ans ; cette version comprend du code écrit principalement par :
Todd C. Miller
Consultez le fichier CONTRIBUTORS.md dans la distribution sudo (https://www.sudo.ws/about/contributors/) pour obtenir une liste exhaustive des personnes qui ont contribué à sudo.
REMARQUES
Il n’est pas facile d’empêcher un utilisateur d’obtenir un shell root si cet utilisateur est autorisé à exécuter des commandes arbitraires via sudo. De plus, de nombreux programmes (tels que les éditeurs) permettent à l’utilisateur d’exécuter des commandes via des séquences d’échappement de shell, contournant ainsi les vérifications de sudo. Cependant, sur la plupart des systèmes, il est possible d’empêcher les séquences d’échappement de shell avec la fonctionnalité noexec du plug-in sudoers(5).
Il n’est pas utile d’exécuter directement la commande « cd » via sudo, par exemple :
$ sudo cd /usr/local/protected
puisque lorsque la commande se termine, le processus parent (votre shell) sera toujours le même. L’option -D peut être utilisée pour exécuter une commande dans un répertoire spécifique.
L’exécution de scripts shell via sudo peut exposer les mêmes bogues du noyau qui rendent les scripts shell set-user-ID non sécurisés sur certains systèmes d’exploitation (si votre système d’exploitation possède un répertoire /dev/fd/, les scripts shell set-user-ID sont généralement sûrs).
BUGS
Si vous pensez avoir trouvé un bug dans sudo, vous pouvez soit signaler le bug dans la base de données des bugs sudo, (https://bugzilla.sudo.ws/), soit ouvrir un problème sur (https://github.com/sudo-project/sudo/issues). Si vous préférez utiliser le courrier électronique, vous pouvez envoyer des messages à la liste de diffusion sudo-workers, (https://www.sudo.ws/mailman/listinfo/sudo-workers) (publique) ou <_> (privée).
Veuillez ne pas signaler les vulnérabilités de sécurité via les problèmes GitHub publics, Bugzilla ou les listes de diffusion. Signalez-les plutôt par e-mail à <_>. Vous pouvez chiffrer votre message avec PGP si vous le souhaitez, en utilisant la clé que vous trouverez sur (https://www.sudo.ws/dist/PGPKEYS).
SUPPORT
Un support gratuit limité est disponible via la liste de diffusion sudo-users, consultez (https://www.sudo.ws/mailman/listinfo/sudo-users) pour vous abonner ou consulter les archives.
CLAUSE DE NON-RESPONSABILITÉ
sudo est fourni « tel quel » et toutes les garanties expresses ou implicites, y compris, mais sans s’y limiter, les garanties implicites de commercialisation et d’adéquation à un usage particulier, sont rejetées. Consultez le fichier LICENSE.md distribué avec sudo ou (https://www.sudo.ws/about/license/) pour tous les détails.