Apparence
Uubu.fr

Les systèmes Linux, l’open source, les réseaux, l’interopérabilité, etc.
« Il vaut mieux viser la perfection et la manquer que viser l’imperfection et l’atteindre. » (Bertrand Arthur William RUSSEL)
03 juillet 2017

htmlpdflatexmanmd




sudo

sudo, sudoedit

Exécute une commande sous un autre utilisateur

   sudo autorise un utilisateur à exécuter une commande en tant que super-utilisateur ou un autre utilisateur. L'utilisateur réel est utilisé pour déterminer le nom de l'utilisateur avec lequel vérifier la stratégie de sécurité

   sudo support une architecture à plugin pour les stratégies de sécurité et le logging. La stratégie de sécurité détermine quels privilèges un utilisateur a en lançant sudo. La stratégie peut exiger que l'utilisateur s'authentifie. La stratégie de sécurité par défaut est sudoers, qui est configuré via /etc/sudoers, ou via LDAP.

   Les stratégie de sécurité peuvent supporter le cache d'accréditifs pour permettre à l'utilisateur de lancer sudo pendant un certain temps sans retaper son mot de passe.

OPTIONS

-A, --askpass Normalement, si sudo exige un mot de passe, il le lis depuis le teminal de l'utilisateur. -A lance un helper
-b, --background Dans la commande en tâche de fond
-C, --close-from=num Ferme tous les descripteurs de fichier supérieur ou égal à ‹num› avant d'exécuter une commande. Les valeurs inférieur à 3 ne sont pas permises
-E, --preserve-env Indique à la stratégie de sécurité que l'utilisateur souhaite préserver ses variables d'environnement.
-e, --edit Édite un ou plusieurs fichiers
-g group, --group=group Lance la commande avec le groupe primaire spécifié au lieu du groupe primaire de l'utilisateur cible
-H, --set-home Demande que la stratégie définisse la variable HOME au répertoire spécifié par l'utilisateur cible
-h, --host=host Lance la commande sur l'ĥôte spécifié si le plugin de startégie de sécurité supporte les commandes distantes.
-i, --login Lance le shell de l'utilisateur cible. Cela signifie que les fichiers comme .profile ou .login sont lus. Si aucune commande n'est spécifiée, un shell interactif est lancé
-k, --reset-timestamp Utilisé sans commande, invalide les accréditifs cachés de l'utilisateur. En d'autres termes, la prochaine commande sudo nécessitera un mot de passe. Utilisé avec une autre option ou une commande, ignore les accréditifs en cache.
-K, --remove-timestamp Similaire à -k, excepté qu'il supprime les accréditifs cachés de l'utilisateur et ne peut pas être utilisé en conjonction avec une commande ou autre option
-l, --list Sans commande, liste les commandes permises (ou interdites) pour l'utilisateur invoquant, ou -U. Si une commande est spécifié et permise par la stratégie, le chemin comple de la commande est affichées avec les arguments.
-n, --non-interactive Empêche l'utilisateur d'entrer quoi que ce soit.
-P, --preserve-groups Préserve le groupe de l'utilisateur invoquant
-p, --prompt=prompt Utilise un prompt de mot de passe personnalisé:

        %H Étend le nom d'hôte incluant le nom de domaine
        %h Étend un nom d'hôte local sans le domaine
        %p Étend le nom de l'utilisateur dont le mot de passe est demandé
        %U Étend le nom de login de l'utilisateur cible
        %u Étend le nom de login de l'utilisateur invoquant
        %% le caractère '%'

-r, --role=role Lance la commande avec le contexte SELinux qui inclus le rôle spécifié
-S, --stdin Écrit le prompt sur stderr et lit le mot d-e passe depuis stdin au lieu du terminal
-s, --shell Lance le shell spécifié par la variable d'environnement SHELL si définie, ou le shell de l'utilisateur invoquant
-t, --type=type Lance la commande avec le contexte de sécurité SELinux qui inclus le type spécifié. Non spécifié, le type par défaut est dérivé du rôle
-U, --other-user=user avec -l, liste les privilèges de l'utilisateur
-T, --command-timeout=timeout Définis un timeout pour la commande
-u, --user=user Lance la commande sous cet utilisateur
-v, --validate Met à jours les accréditifs en cache de l'utilisateur
-- Indique la fin des arguments


   Les variables d'environnement à définir pour la commande peuvent également être passés sur la ligne de commande sous la forme VAR=value, sujettes à restriction.

Exécution de commande

   Quand sudo exécute une commande, la stratégie de sécurité spécifie l'environnement d'exécution pour la commande. Typiquement, l'uid et gid réel et effectif sont définis pour correspondre à l'utilisateur cible, tel que spécifié dans la base de comptes, et le vecteur groupe est initialisé avec la base de groupes.

  Les paramètres suivants peuvent être spécifiés par la stratégie de sécurité:

        UID effectif et réel
        GID effectif et réel
        GID supplémentaires
        La liste d'environnement
        Répertoire de travail courant
        Masque de création de fichier
        Role et type SELinux
        Priorité (nice)

   Quand sudo lance une commande, il se fork, définis l'environnement d'exécution, et appel execve dans le processus enfant. Le processus sudo principal attend que la commande soit complétée, puis passe le status de sortie de la commande à la fonction de fermeture de la stratégie de sécurité et quitte. Si un plugin de loggin est configuré ou si la stratégie de sécurité le demande explicitement, un nouveau pseudo-terminal est créé et un second process sudo est utilisé pour relayer les signaux de contrôle de job entre le pty de l'utilisateur et le nouveau pty. Ce processus rend possible, par exemple, se suspendre et résumer la commande. Sans cela, la commande dans un groupe de processus orphelin et ne reçevrai aucun signal de contrôle de job. Un cas spécial, si le plugin de stratégie ne définis pas de fonction close et aucun pty n'est requis, sudo exécute la commande directement au lieu de fork. le plugin sudoers ne définis une fonction close quand quand le loggin I/O est activé, un pty requis, ou les options pam_session ou pm_setcred sont activés.

Gestion des signaux

   Quand la commande est lancée comme enfant du processus sudo, sudo relai les signaux qu'il reçoit à la commande. Les signaux SIGINT et SIGQUIT sont seulement relayés quand la commande est lancées dans un nouveau pty ou quand le signal a été envoyé par un processus utilisateur, pas le kernel. Cela évite que la commande reçoive 2 fois SIGINT chaque fois que l'utilisateur utilise Contrôle-C. Certains signaux comme SIGSTOP et SIGKILL, ne peuvent être relayés à la commande. SIGTSTP doit être envoyé au lieu de SIGSTOP pour suspendre une commande.

   Un cas spécial, sudo ne relai pas les signaux qui sont envoyés par la commande lancée. Cela empêche la commande de se tuer elle-même. Dans certains systèmes, reboot(8) envoie SIGTERM à tous les processus non-système autre que lui-même avant de redémarrer le système. Celà empêche sudo de relayer SIGTERM, qui peut quitter avant que le système soit redémarré. En résultat, lancer un script qui appel reboot ou shutdown via sudo peut terminer le système dans un état indéfinis sauf si reboot ou shutdown sont lancés avec exec() au lieu de system().

   Si aucun plugin de loggin n'est chargé et que la stratégie n'a pas définis de fonction close, définir un timeout de commande ou que la commande soit lancé dans un nouveau pty, sudo peut exécuter la commande directement.

Plugins

   Les plugins peuvent être spécifiés via les directives Plugin dans sudo.conf. Ils peuvent être chargés comme objets partagés dynamiques ou compilés directement dans sudo. sudoers est le plugin par défaut

Valeur de sortie

   Le code de sortie de sudo est le code de sortie de la commande exécutée. Si la commande s'est terminée à cause d'un signal, sudo envoie lui-même le signal qui termine la commande.

   Sinon, sudo quitte avec une valeur de 1 s'il y a un problème de configuration/permission ou si sudo ne peut pas exécuter la commande. Dans le dernier cas, la chaîne d'erreur est affichée sur stderr. Si sudo ne peut pas stat(2) une ou plusieurs entrées dans le PATH de l'utilisateur, une erreur est affichée sur stderr.

Notes de sécurité

   Sudo tente d'être sûre en exécutant des commandes externes. Pour éviter le spoofing de commande, sudo vérifie "." et "" en dernier en recherchant une commande dans le PATH de l'utilisateur. Noter cependant que la variable PATH n'est pas modifée et est passée inchangée au programme que sudo exécute.

   Les utilisateurs ne devrait jamais obtenir des privilèges pour exécuter des fichiers qui sont en écriture par l'utilisateur ou qui résident dans un répertoire en écriture par l'utilisateur. Si l'utilisateur peut modifier ou remplacer la commande il n'y a pas de limite à ce qui peut être lancé.

   Noter que sudo normalement ne log que les commandes explicitement lancées. Si un utilisateur lance une commande telle que sudo su ou sudo sh, les commandes suivantes ne sont plus sujettes à la stratégie sudo. De même pour les commandes qui offrent des échappement shell. Si le loggin I/O est activé, les commandes suivantes sont loggées, mais il n'y a pas des logs traditionnels pour ces commandes. À cause de celà, une attention particulière doit être portée sur l'accès des utilisateurs aux commandes via sudo pour vérifier que la commande ne donne pas par inadvertance un shell root.

   Pour éviter la fuite d'information potentiellement sensible, sudo désactive les coredumps par défaut durant l'exécution.

Variables d'environnement

EDITOR Nom de l'éditeur par défaut pour -e (sudoedit), si SUDO_EDITOR ou VISUAL ne sont pas définis
MAIL Emplacement de la boite mail de l'utilisateur
HOME Répertoire personnel de l'utilisateur
LOGNAME Nom de l'utilisateur
PATH Les chemins de recherche pour les commandes
SHELL Shell courant de l'utilisateur
SUDO_ASKPASS Spécifie le chemin du helper pour lire le mot de passe si aucun terminal n'est disponible ou avec -A
SUDO_EDITOR Éditeur par défaut pour -e (sudoedit)
SUDO_GID GID de l'utilisateur qui a invoqué sudo
SUDO_PROMPT prompt pour les mots de passe
SUDO_PS1 valeur PS1 pour le programme à exécuter
SUDO_UID UID de l'utilisateur qui a invoqué sudo
SUDO_USER nom de login de l'utilisateur qui a invoqué sudo
USER nom de l'utilisateur
USERNAME idem à USER
VISUAL Éditeur par défaut pour -e (sudoedit) si SUDO_EDITOR n'est pas définis

Exemples

obtenir une liste des répertoire non-lisible:
sudo ls /usr/local/protected
Liste le répertoire personnel de l'utilisateur yaz dans une machine où le système de fichier maintenant ~ yaz n'est pas exporté en root
sudo -u yaz ls ~ yaz
Éditer index.html en tant qu'utilisateur www
sudoedit -u www ~ www/htdocs/index.html
Voir les logs système uniquement accessibles par root
sudo -g adm more /var/log/syslog
Lancer un éditeur en tant que jim avec un groupe primaire différent
sudoedit -u jim -g audio ~ jim/sound.txt
Éteindre la machine
sudo shutdown -r +15 "quick reboot"
^
03 juillet 2017

htmlpdflatexmanmd




sudo.conf

sudo.conf

Fichier de configuration de sudo

   sudo.conf supporte les directive 'Plugin', 'Path', 'Set', 'Debug'.

Plugin

Une ligne Plugin définis un module et son chemin, suivi de paramètres optionnels. Peut être spécifié plusieurs fois
Plugin sudoers_policy /usr/local/libexec/sudo/sudoers.so sudoers_mode=0440

Path

   Path définis les chemins vers divers librairies/programmes nécessaire. Si une ligne Path ne contient pas de chemin, la fonctionnalité est considérée désactivée:

        askpass chemin du helper pour lire les mots de passe quand aucun terminal n'est disponible
        noexec Chemin de la librairie wrappers pour les fonctions execl(), execle(), execlp(), exect(), execv(), execve(), execvP(), execvp(), execvpe(), fexecve(), popen(), posix_spawn(), posix_spawnp(), system(), et wordexp() qui empêche l'exécution d'autres commandes. Utilisé pour implémenter la foncionnalité noexec dans les systèmes qui supportent LD_PRELOAD ou son équivalent.
        plugin_dir Répertoire de recherche des plugins spéficier sans chemin complet.
        sesh Chemin de sesh. Utilé quand sudo est compilé avec le support SELinux

Set

disable_coredump true|false Par défaut sudo désactive le coredump pour éviter toute fuite de données sensible
group_source sudo passe la liste des groupes de l'utilisateur invoquant à la stratégie et les plugins I/O. Dans la plupart des système, il y a une limite du nombre de groupes (généralement 16). si la liste de groupe dépasse la limite kernel, sudo consulte lui-même la liste des groupes:

        static Utilise la liste de groupe statique que le kernel retourne
        dynamic Requête toujours la base de groupe. C'est dynamique dans le sens où les changements fait dans la base de groupe après que l'utilisateur se soit loggé sont reflétés dans la liste des groupe.
        adaptive Ne requête la pase que si la liste des groupes retournés par le kernel a atteind la limite des entrées.

max_groups Nombre maximum de groupes utiliateur à récupérer dans la base de groupe lorsque sudo requête la base de groupe directement
probe_interfaces Par défaut, sudo sont les interfaces réseaux du système et passe l'IP à chaque interface activée au plugin de stratégie. Cela simplifie les règles de match basé sur l'IP sans avoir à requêter DNS.

Debug

Une ligne Debug consiste du mot clé Debug, suivi par le nom du programme ou plugin à débugger (sudo, visudo, sudoreplay, sudoers), le nom du fichier de dibug et une liste de flags. Par exemple:
Debug sudo /var/log/sudo_debug all@warn,plugin@info

        all Match tous les sous-systèmes
        args traitement des arguments de la ligne de commande
        conv Conversation utilisateur
        edit sudoedit
        event Sous-système d'évènement
        exec exécution de commande
        main Fonction main de sudo
        netif Gestion des interfaces réseaux
        pcomm Communication avec le plugin
        pty Code lié au pty
        selinux gestion SELinux
        util Fonctions utilitaires
        utmp Gestion utmp
^
03 juillet 2017

htmlpdflatexmanmd




sudoers

sudoers

plugin de stratégie de sécurité de sudo par défaut

   Ce plugin détermine les privilèges sudo de l'utilisateur en lisant la stratégie dans /etc/sudoers. sudo consulte le fichier sudo.conf pour déterminer quelle stratégieet plugin charger.

   Les arguments du plugins sont les suivants:

ldap_conf=‹path› emplacement du fichier ldap.conf alternatif
ldap_secret=‹path› emplacement du fichier ldap.secret alternatif
sudoers_file=‹path› fichier sudoers alternatif
sudoers_uid=‹uid› UID du propiétaire du fichier sudoers
sudoers_gid=‹gid› GID du fichier sudoers
sudoers_mode=‹mode› mode du fichier sudoers en octal

Authentification Utilisateur

   La stratégie de sécurité sudoers nécessite que la plupart des utilisateurs s'authentifient eux-même avant d'utiliser sudo. Un mot de passe n'est pas requis si l'utilisateur invoquant est root, si l'utilisateur cible est le même que l'utilisateur invoquant, ou si la startégie a désactivé l'authentification pour la commande utilisateur ou pour l'utilisateur. À la différence de su, quand sudoers exige une authentification, il valide les accréditifs de l'utilisateur, pas de l'utilisateur cible. Cela peut être changé avec rootpw, targetpw et runaspw.

   Si un utilisateur qui n'est pas listé dans la stratégie tente de lancer une commande via sudo, un mail est envoyé aux autorités définies.

   Noter qu'aucun mail n'est envoyé si un utilisateur non-autorisé tente de lancer sudo avec -l ou -v sauf en cas d'erreur d'authentification. Cela permet aux utilisateurs de déterminer s'ils sont autorisés ou non à utiliser sudo. Toute tentative d'utiliser sudo est loggé.

   Si sudo est lancé par root, et que la variable SUDO_USER est définie, la stratégie sudoers utilise cette valeur pour déterminer qui est l'utilisateur actuel. Cela peut être utilisé par un utilisateur pour logger des commandes via sudo même quand un shell root a été invoqué.

   sudoers utilise des fichiers horodatés par utilisateur pour le caching d'accrédifits. Une fois un utilisateur authentifié, un enregistrement est écrit contenant l'uid utilisé pour s'authentifier, l'id de session du terminal et un horodatage. L'utilisateur peut ainsi utiliser sudo sans mot de passe pour une courte période de temps. Par défaut, sudoers utilise un enregistrement séparé pour chaque tty, qui signifie que les sessions login de l'utilisateur sont authentifiés séparément.

Logging

   sudoers peut logger toutes les tentatives, réussies ou non et les erreurs dans syslog, un fichier de log, ou les 2. sudoers est également capable de lancer une commande dans un pseudo-tty et logger toutes les entrées/sorties. L'entrée standard, la sortie standard, et l'erreur standard peuvent être loggés même s'ils ne sont pas associés avec un terminal. Le logging d'E/S n'est pas activé par défaut.

Environnement de commande

   vu que les variables d'environnement peuvent influencer le comportement des programmes, sudoers fournis un moyen de restreindre les variables de l'environnement utilisateur hérités par la commande à lancer. Il y a 2 manières distincts de gérer ces variables.

   Par défaut, l'option env_reset est activée, les commandes sont donc lancées dans un environnement minimal. Dans les systèmes Linux sans environnement PAM, l'environnement est initialisé avec le contenu de /etc/environment. Le nouvel environnement contient TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME et les variables SUDO_* en plus des variables de processus invoquant permis par env_check et env_keep. C'est une liste blanche de variables d'environnement. Les variables commençant pas () sont supprimées sauf si le nom et la valeur sont matché par env_keep ou env_check, vu qu'elles sont interprétées comme des fonctions par d'anciennes versions de bash

   Si, cependant, l'option env_reset est désactivé, toute variable non explicitement refusée par env_check et env_delete sont héritées depuis le processus invoquant. Dans ce cas, env_check et env_delete deviennet comme une blacklist. Les variable commençant pas () sont toujours supprimées. Vu qu'il n'est pas possible de blacklister toutes les variables d'environnement potentiellement dangereuses, le mode env_reset est préférable.

   Par défaut, les variables d'environnement sont matchés par leur nom. Cependant, si le motif inclus le signe '=', les noms des variables et leur valeur sont matchés.

   La liste complète des variables d'environnement que sudo autorise ou refuse est contenue dans la sortie de sudo -V quand lancé en root.

   Dans les systèmes qui supportent PAM où le module pam_env est activé pour sudo, les variables dans l'environnement PAM peuvent être fusionnées dans l'environnement. Si une variable dans l'environnement PAM est déja présente, la valeur est remplacée seulement si la variable n'était pas préservées par sudoers. quand env_reset est activé, les variables préservées depuis l'environnement de l'utilisateur invoquant par la liste env_keep a précédence sur l'environnement PAM. Quand env_reset est désactivé, les variables de l'environnement utilisateur ont précédence sur l'environnement PAM sauf en cas de match de la liste env_delete.

   Un cas spécial, si -i est spécifié, sudoers initialise l'environnement sans regarder la valeur de env_reset. DISPLAY, PATH et TERM ne sont pas changés; HOME, MAIL, SHELL, USER et LOGNAME sont basés sur l'utilisateur cible. Dans les systèmes Linux sans PAM, le contenu de /etc/environment est également inclus.

   Finalement, restricted_env_file et env_files sont appliqués, si présents. Les variables dans restricted_env_file sont appliqués en premier, et sont sujets aux même restrictions que l'environnement de l'utilisateur invoquant. Les variables env_file sont appliquées en dernier et ne sont pas sujettes à ces restrictions. Dans tous les cas, les variables présentes dans les fichiers ne sont définis à leur valeur spécifiées que si elles ne sont pas en conflit avec une variable d'environnement existante

Format du fichier sudoers

   Le fichier sudoers est composé de 2 types d'entrées: les alias et les utilisateurs. Quand plusieurs entrées correspondent à un utilisateur, elles sont appliquées dans l'ordre. En cas de multiple match, le dernier est utilisé.

Syntaxe EBNF

   EBNF contient les opérateurs suivants:

        ? Signifie que le symbole ou groupe de symbole précédent est optionnel, c'est à dire qu'il peut apparaître une fois ou pas du tout
        Signifie que le symbole ou groupe de symbole précédent peut apparaître 0 ou plusieurs fois
        + Signifie que le symbole ou groupe de symbole précédent peut apparaître une ou plusieurs fois

Aliases

Il y a 4 types d'alias: User_Alias, Runas_Alias, Host_Alias et Cmnd_Alias:
Alias ::= 'User_Alias' User_Alias (':' User_Alias)* |
    'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
    'Host_Alias' Host_Alias (':' Host_Alias)* |
    'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)*
    
User_Alias ::= NAME '=' User_List
    
Runas_Alias ::= NAME '=' Runas_List
    
Host_Alias ::= NAME '=' Host_List
    
Cmnd_Alias ::= NAME '=' Cmnd_List
    
NAME ::= [A-Z]([A-Z][0-9]_)*

Une liste d'utilisateur consiste de noms d'utilisateurs, UID (préfixé avec '#'), groupes système et GID (préfixés avec '%' et '%#'), netgroups (préfixés par '+'), groupes non-unix (préfixés avec '%:' et '%:#') et de User_Alias. Chaque liste peut être préfixée avec '!'. les " permettent d'éviter le besoin d'échapper les caractères spéciaux, sinon ils doivent être spécifiés en hexa (ex: \x20)
User_List ::= User |
        User ',' User_List
    
User ::= '!'* user name |
        '!'* #uid |
        '!'* %group |
        '!'* %#gid |
        '!'* +netgroup |
        '!'* %:nonunix_group |
        '!'* %:#nonunix_gid |
        '!'* User_Alias

Une liste Runas_Alias est similaire à une User_List.
Runas_List ::= Runas_Member |
        Runas_Member ',' Runas_List
    
Runas_Member ::= '!'* user name |
        '!'* #uid |
        '!'* %group |
        '!'* %#gid |
        '!'* %:nonunix_group |
        '!'* %:#nonunix_gid |
        '!'* +netgroup |
        '!'* Runas_Alias

Une liste d'hôtes est faite d'un ou plusieurs noms d'hôte, adresses IP, réseaux, +netgroups, et d'autres alias.
Host_List ::= Host |
        Host ',' Host_List
    
Host ::= '!'* host name |
        '!'* ip_addr |
        '!'* network(/netmask)? |
        '!'* +netgroup |
        '!'* Host_Alias

   Une liste de commande est une liste d'un ou plusieurs nom de commandes, répertoires, et autres alias. Un nom de commande est un nom complet de fichier qui peut inclure des wildcard shell. Un simple nom de fichier permet de lancer une commande avec des arguments. Cependand, il est possible de spécifier les arguments (incluant des wildcard), ou "" pour indiquer que la commande peut seulement être lancée sans arguments. Un répertoire est un chemin complet se terminant par '/', et l'utilisateur pout exécuter tout fichier dans ce répertoire, mais pas dans les sous-répertoires

Si un Cmnd est associé avec des arguments de ligne de commande, les arguments dans Cmnd doivent matcher exactement avec ceux donnés par l'utilisateur. Noter que les caractères suivants doivent être échappés: ',’, ':’, '=’, '\’. La commande intégrée sudoedit est utilisée pour permettre à un utilisateur de lancer sudo avec -e. Il peut prendre des arguments. Noter que sudoedit est une commande intégrée dans sudo et doit être spécifié dans le fichier sudoers sans chemin.
digest ::= [A-Fa-f0-9]+ |
        [[A-Za-z0-9+/=]+
    
Digest_Spec ::= "sha224" ':' digest |
        "sha256" ':' digest |
        "sha384" ':' digest |
        "sha512" ':' digest
    
Cmnd_List ::= Cmnd |
        Cmnd ',' Cmnd_List

command name ::= file name |
        file name args |
        file name '""'
    
Cmnd ::= Digest_Spec? '!'* command name |
        '!'* directory |
        '!'* "sudoedit" |
        '!'* Cmnd_Alias

   Si un nom de commande est préfixé avec un Hash, la commande ne match que si le hash SHA2 est vérifié. Les formats suivants sont supportés: sha224, sha256, et sha512. La chaîne peut être spécifiée en hexa ou en base64.

Default

Certaines options de configuration ont une valeur par défaut qui peut être changé en temps réel via une ou plusieurs lignes Default_Entry. Cela peut affecter tous les utilisateurs dans tous les hôtes, tous les utilisateurs sur un hôte spécifique, un utilisateur spécifique, une commande spécifique, ou des commandes lancées par un utilisateur spécifiques.
Default_Type ::= 'Defaults' |
        'Defaults' '@' Host_List |
        'Defaults' ':' User_List |
        'Defaults' '!' Cmnd_List |
        'Defaults' '›' Runas_List
    
Default_Entry ::= Default_Type Parameter_List
    
Parameter_List ::= Parameter |
        Parameter ',' Parameter_List
    
Parameter ::= Parameter '=' Value |
        Parameter '+=' Value |
        Parameter '-=' Value |
        '!'* Parameter

   += et -= sont utilisés pour ajouter ou supprimer des éléments d'une liste. Les entrées sont parsée dans l'ordre suivant: generic, host, user, et runas, command. S'il y a plusieurs paramètres Default de même type, le dernier match est utilisé. Les paramètres Defaults suivant sont parsé avant tous les autres vu qu'ils affectent les entrées suivantes: fqdn, group_plugin, runas_default, sudoers_locale.

Spécification d'utilisateur


User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
        (':' Host_List '=' Cmnd_Spec_List)*
    
Cmnd_Spec_List ::= Cmnd_Spec |
        Cmnd_Spec ',' Cmnd_Spec_List
    
Cmnd_Spec ::= Runas_Spec? Option_Spec* Tag_Spec* Cmnd
    
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
    
Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Date_Spec | Timeout_Spec)
    
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
    
Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
    
Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
    
Timeout_Spec ::= 'TIMEOUT=timeout'
    
Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
        'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
        'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
        'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')

   Une spécification d'utilisateur détermine quelles commandes un utilisateur peut lancer (et sous quel utilisateur). dans les hôte spécifiés. Par défaut, les commandes sont lancées en root. La structure de base est who where = (as_whom] what

Runas_Spec

   un Runas_Spec détermine l'utilisateur et/ou le groupe sous laquelle une commande peut être lancée. un Runas_Spec pleinement spécifié consiste de 2 Runas_List séparés par ':' et entre parenthèses. Le premier Runas_List indique sous quels utilisateurs la commande peut être lancée (comme avec sudo -u). Le second définis une liste de groupes qui peuvent être spécifié via sudo -g. Si les 2 Runas_List sont spécifié, la commande peut être lancée avec n'importe quelle combinaison d'utilisateurs et groupes listés dans leur Runas_list respectifs. Si seul le premier est listé, la commande peut être lancée par n'importe quel utilisateur dans la liste mais -g ne peut pas être spécifié. Si le premier Runas_List est vide, mais le second est spécifié, tous les utilisateurs peuvent lancer la commande avec le groupe définis à un listé. Si les 2 sont vides, la commande ne peut être lancée que sous l'utilisateur invoquant. Si Runas_Spec n'est pas spécifiée, la commande peut être lancée en root et aucun groupe ne peut être spécifié.

l'utilisateur dbg peut lancer ces 3 commandes, mais seulememt comme operator:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm
Il est également possible de remplacer Runas_Spec dans une entrée:
dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
On peut l'étendre peut permettre à dbg de lancer /bin/ls avec soit l'utilisateur soit le groupe à operator:
dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm
Noter que bien que la portion groupe permet à l'utilisateur de lancer la commande avec ce groupe, il ne force pas l'utilisateur à le faire. Si aucun groupe n'est spécifié, la commande sera lancée avec le groupe listé dans l'entrée de la base de mot de passe de l'utilisateur. Exemple de ce qui est permis par l'entrée ci-dessus:
sudo -u operator /bin/ls
sudo -u operator -g operator /bin/ls
sudo -g operator /bin/ls
Dans l'exemple suivant, l'utilisateur tcm peut lancer des commandes qui accèdent à un périphérique modem avec le groupe dialer
tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, /usr/local/bin/minicom
Seul le groupe est définis, la commande est lancée avec l'utilisateur tcm
sudo -g dialer /usr/bin/cu
Plusieurs utilisateurs et groupeg peuvent être présents dans un Runas_Spec, auquel cas l'utilisateur peut sélectionner une combinaison d'utilisateurs et groupes via -u et -g
alan ALL = (root, bin : operator, system) ALL
alan peut lancer une commande soit en root, soit bin, optionnellement en définissant le groupe operator ou system

Option_Spec

   un Cmnd peut avoir 0 ou plusieurs options. En fonction du système, les options peuvent consister de rôle/types SELinux, ou timeouts. Une fois une option définis pour une Cmnd, les Cmnd suivantes dans Cmnd_Spec_List héritent de cette option, sauf remplacé par une autre option.

   les règles sudoers peuvent spécifier une date de début et de fin via les paramètres NOTBEFORE et NOTAFTER. L'horodatage peut être spécifié en temps généralisé, rfc4517 (yyymmddHHMSSZ). Il est également possible de spécifier un offset en heures et minutes UTC. Par exemple '-0500' correspond à l'heure Eastern Standard aux US.

   Une commande peut avoir un timeout. S'il expire avant que la commande ne se soit terminées, la commande est terminées. Le timeout peut être spécifié en jours, heures, minutes et secondes (ex: 7d8h30m10s, 14d, 8h30m, 600s, 3600).

   Une commande peut avoir 0 ou plusieurs tags. Les valeurs de tag supportés sont: EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT, NOLOG_OUTPUT, MAIL, NOMAIL, PASSWD, NOPASSWD, SETENV, et NOSETENV. Une fois un tag définis dans une Cmnd, les Cmnd suivants dans la Cmnd_Spec_List héritent de ce tag sauf si remplacé par le tag opposé.

        [NO]EXEC autorise à lancer un exécutable lié dynamiquement
        [NO]FOLLOW autorise à suivre les liens symboliques pour sudoedit uniquement
        [NO]LOG_INPUT Remplace l'option log_input
        [NO]LOG_OUTPUT Remplace l'option log_output
        [NO]MAIL Remplace la valeur de l'option mail_all_cmnds. N'a pas d'effet avec -l ou -v
        [NO]PASSWD Exige que l'utilisateur s'authentifie lui-même avant de lancer une commande
        [NO]SETENV Remplace la valeur de l'option SETENV

Wildcard

   sudo autorise les wildcard style shell dans les noms d'hôte, noms de chemins, et arguments de ligne de commande dans le fichier sudoers:

        Matche un jeu de 0 ou plusieurs caractères
        ? Matche un simple caractère
        [...] Matche un des caractères
        [!...] Matche tout caractère non listé
        \x pour spécifier les caractères '*','?','[' et ']'

Inclure d'autres fichiers

   Il est possible d'inclure d'autres fichiers sudoers avec les directives #include et #includedir.

Autres caractères spéciaux et mots réservés

   '#' est utilisé pour indiquer un commentaire (excepté pour #include et #includedir ou dans le contexte d'un nom d'utilisateur suivi par un ou plusieurs chiffres).

   Le mot réservé ALL est un alias intégré qui implique qu'un match réussi toujours.

   '!' peut être utilisé comme opérateur NOT dans une liste.

Options sudoers

   sudo peut être modifié par des lignes Default_Entry:

always_query_group_plugin (bool) si un group_plugin est configuré, l'utilise pour résoudre les groupe sous la forme %group tant que ce n'est pas également un groupe système. Normalement, seules les groupes sous la forme %#group sont passé au group_plugin
always_set_home (bool) activé, sudo définis HOME au répertoire home de l'utilisateur cible
authenticate (bool) définis, les utilisateurs doivent s'authentifier eux-même avant de lancer des commandes
closefrom_override (bool) définis, l'utilisateur peut utiliser sudo -C qui remplace le point de départ par défaut auquel sudo commence à fermer les descripteurs de fichier.
compress_io (bool) définis, si sudo est configuré pour logger l'entrée ou la sortie d'une commande, les logs I/O sont compressés avec zlib.
exec_background (bool) par défaut, sudo lance une commande en foreground tant que sudo est lui-même en foreground. à on et la commande lancé dans un pty (dû au logging I/O ou du flag use_pty), la commande est lancées en tâche de fond.
env_editor (bool) Définis, visudo utilise la valeur de EDITOR ou VISUAL comme liste d'éditeur par défaut
env_reset (bool) définis, lance la commande dans un environnement minimal
fast_glob (bool) utilise la fonction fnmatch(3) au lieu de glob(3) pour le globbing, ce qui est plus rapide, mais n'est pas capable de matcher les chemins relatifs
fqdn (bool) place les noms ftdn dans le fichiers sudoers quand le nom d'hôte local ne contient pas de nom de domaine.
ignore_audit_errors (bool) autorise à lancer les commandes même si sudoers ne peut écrire dans le log d'audit
ignore_dot (bool) définis, ignore "." ou "" dans la variable PATH
ignore_iolog_errors (bool) autorise à lancer des commandes même si sudoers ne peut écrire dans le fichier de log E/S
ignore_logfile_errors (bool) autorise à lancer des commandes même si sudoers ne peut écrire dans le fichier de log
ignore_local_sudoers (bool) Si définis via LDAP, ne parse pas /etc/sudoers
ignore_unknown_defaults (bool) ne produit pas d'alerte si une entrée Defaut inconnue est rencontrée, ou une options sudoOptions dans LDAP.
insults (bool) insulte les utilisateurs quand ils entrent un mot de passe incorrect
log_host (bool) Définis, le nom d'hôte est loggé
log_input (bool) Définis, log l'entrée utilisateur
log_output (bool) Définis, log la sortie envoyée à l'écran
log_year (bool) Définis, log l'année au format yyyy
long_otp_prompt (bool) En validant un schéma OTP, un prompt à 2 lignes est utilisé pour simplifier le copier/coller du challenge.
mail_all_cmnds (bool) Envoie un mail à chaque tentative d'exécution d'une commande (excepté avec -l ou -v et une authentification réussie)
mail_always (bool) envoie un mail à chaque fois qu'un utilisateur lance sudo.
mail_badpass (bool) Envoie un mail en cas de mot de passe incorrect
mail_no_host (bool) définis, envoie un mail si l'utilisateur invoquant existe dans le fichier sudoers mais n'est pas autorisé à lancer les commandes dans l'hôte courant.
mail_no_perms (bool) Définis, envoie un mail si l'utilisateur invoquant est autorisé à utiliser sudo, mais n'a pas l'autorisation de lancer la commande
mail_no_user (bool) Définis, envoie un mail si l'utilisateur invoquant n'est pas dans le fichier sudoers
match_group_by_gid (bool) par défaut, sudoers recherche chaque groupe dont l'utilisateur est membre par son GID pour déterminer le nom du groupe. Dans les systèmes ou la recherche des groupes est longue, cette option évite de résoudre les GID en noms de groupe
netgroup_tuple (bool) Définis, la recherche de netgroup est effectuée en utilisant les triplets netgroup
noexec (bool) Définis, toutes les commande lancées via sudo fonctionne comme avec le tag NOEXEC
pam_session (bool) Créé une nouvelle session PAM pour la commande à lancer
pam_setcred (bool) tente d'obtenir les accréditifs de l'utilisateur cible
passprompt_override (bool) Demande le mot de passe spécifié par passprompt est seulement utilisé si le prompt fournis par PAM match la chaîne "Password:". si definis, passprompt est toujours utilisé.
path_info (bool) informe quand la commande ne peut pas être trouvée dans le PATH.
preserve_groups (bool) par défaut, sudo initialise le vecteur de groupe à la liste des groupes de l'utilisateur cible. Définis, le vecteur de groupe de l'utilisateur n'est pas altéré. Le GID réel et effectif continuent de matcher l'utilisateur cible
pwfeedback (bool) Fournis un retour visuel en tapant un mot de passe
requiretty (bool) définis, sudo n'est lancé que si l'utilisateur est loggé dans un vrai tty.
root_sudo (bool) Définis, root est autorisé à lancer sudo. Désactivé, empêche sudoedit
rootpw (bool) Définis, sudo demande le mot de passe root au lieu du mot de passe de l'utilisateur invoquant
runaspw (bool) Définis, sudo demande le mot de passe de l'utilisateur définis par runas_default au lieu du mot de passe de l'utilisateur invoquant
set_home (bool) Définis et sudo invoqué avec -s, HOME est définis au home de l'utilisateur cible
set_logname (bool) Définis LOGNAME. Cependant pour certains programmes (incluant RCS) utilisent LOGNAME pour déterminer la vrai identité de l'utilisateur.
set_utmp (bool) Activé, sudo créé une entrée dans utmp ou utmpx quand un pseudo tty est alloué.
setenv (bool) Autorise l'utilisateur à désactiver l'option env_reset avec l'option -E
shell_noargs (bool) Définis et sudo est invoqué sans arguments, agit comme avec -s: lance un shell en root
stay_setuid (bool) Normalement, quand sudo exécute une commande, les UID réel et effectifs sont définis à l'utilisateur cible. Cette option laisse l'UID réel à l'utilisateur invoquant
sudoedit_checkdir (bool) Définis, sudoedit vérifie tous les composants répertoire du chemin à éditer pour vérifier s'il est en écriture par l'utilisateur. Les liens symboliques ne sont pas suivis et sudoedit refuse d'éditer un fichier localisé dans un répertoire accessible en écriture. Non effectif pour root.
sudoedit_follow (bool) Suit les liens symboliques en ouvrant les fichiers.
targetpw (bool) Définis, demande le mot de passe de l'utilisateur spécifié par -u au lieu du mot de passe de l'utilisateur invoquant
tty_tickets (bool) Définis, les utilisateurs doivent s'authentifier pour chaque tty
umask_override (bool) Définis, sudo définis le umask spécifié dans le fichier sudoers sans modification
use_netgroups (bool) Définis, les netgroups peuvent être utilisé à la place d'un utilisateur ou hôte
use_pty (bool) Définis, sudo lance la commande dans un pseudo-tty même si aucun plugin I/O n'est définis
user_command_timeouts (bool) Définis, l'utilisateur peut spécifier un timeout sur la ligne de commande
utmp_runas (bool) Définis, sudo stocke le nom de l'utilisateur runas en mettant à jours utmp au lieur du nom de l'utilisateur invoquant
visiblepw (bool) par défaut, sudo refuse de s'exécuter si l'utilisateur doit entrer un mot de passe mais qu'il n'est pas possible de désactiver l'écho dans le terminal. Cela permet de lancer des commande comme "ssh somehost sudo ls" vu que ssh n'alloue pas de tty par défaut en lançant une commande.
closefrom (int) Avant d'exécuter une commande, sudo ferme tous descripteur de fichier ouvert autre que 0-2. Spécifie un fd à partir duquel fermer les fd.
command_timeout (int) Délai maximum pour l'exécution d'une commande.
maxseq (int) Numéro de séquence maximum qui est substitué pour l'échappement "%{seq}" dans le fichier de log I/O.
passwd_tries (int) Nombre maximum de tentative pour entrer en mot de passe
syslog_maxlen (int) Par défaut, sudoers créé des messages de log jusqu'à 980 octets. Pour éviter de tronquer les messages, sudoers split les message supérieurs à syslog_maxlen.
loglinelen (int) Nombre de caractères par ligne de log. n'a pas d'effet pour syslog.
timestamp_timeout (int) Nombre de minutes avant de redemander un mot de passe.
umask (int) umask pour la création des fichier
badpass_message (string) Message affiché si un utilisateur entre un mot de passe incorrect
editor (string) Liste d'éditeurs autorisé pour visudo.
iolog_dir (string) Répertoire parent où construire le nom de chemin pour le répertoire de log I/O. Seulement utilisé si log_input et log_output sont activés. Les échappements suivants sont permis:

        %{seq} Étendu pour augmenter le numéro de séquence en base 36
        %{user} Étendu au login de l'utilisateur invoquant
        %{group} Étendu au GID réel de l'utilisateur invoquant
        %{runas_user} Étendu au login de l'utilisateur qui exécute la commande
        %{runas_group} Étendu au groupe qui exécute la commande
        %{hostname} Étendu au nom de l'hôte local sans le nom de domaine
        %{command} Étendu au nom de la commande lancée

iolog_file (string) Chemin du fichier de log, relatif à iolog_dir pour les logs I/O. Accepte les séquences d'échappement de iolog_dir
iolog_flush (string) Définis, sudo vide les données de log sur disque après chaque écriture au lieu de le même en tampon. Permet de voir les logs en temps réel.
iolog_group (string) Nom du groupe pour la créations des répertoires et fichiers de log I/O
iolog_mode (string) mode à utiliser pour créer les fichiers de log I/O
iolog_user (string) Propriétaire des répertoires et fichiers de log I/O
lecture_status_dir (string) Répertoire dans lequel sudo stocke les fichiers de status par utilisateur. Défaut: /var/adm/sudo/lectured
mailsub (string) Sujet du mail envoyé. %h étend au nom d'hôte
pam_login_service (string) Nom du service utilisé avec -i. Défaut: sudo
pam_service (string) Nom du service que PAM applique. Défaut: sudo
passprompt (string) Prompt par défaut à utiliser en demandant le mot de passe. Les échappements suivants sont supportés:

        %H Nom d'hôte local fqdn
        %h Nom d'hôte local
        %p utilisateur correspondant au mot de passe demandé
        %U Nom de l'utilisateur cible
        %u nom de l'utilisateur invoquant
        %% le caractère %

role (string) Rôle SELinux par défaut à utiliser en construisant un nouveau contexte de sécurité pour lancer la commande.
runas_default (string) Utilisateur par défaut pour lancer les commande.
sudoers_locale (string) Locale à utiliser pour parser le fichier sudoers, les commandes de logging, et l'envoie de mail.
timestampdir (string) Répertoire dans lequel sudo stocke ses fichiers d'horodatage.
timestampowner (string) Propriétaire du répertoire de status de lecture, d'horodatage et tous les fichiers qui y sont stockés.
type (string) Type SELinux par défaut pour construire un nouveau contexte SELinux
env_file (string) Spécifie le chemin complet d'un fichier contenant les variables d'environnement à définir pour le programme à lancer.
exempt_group (string) Les utilisateurs dans ce groupe sont exemptés du mot de path et des exigences PATH.
fdexec (string) Détermine si sudo exécute une commande par son chemin ou par un fd ouvers. always|never exécute ou non par fd, digest_only n'exécute par fd que si la commande a un digest associé.
group_plugin (string) plugin group sudoers avec des arguments optionnels.
lecture (string) Contrôle quand une lecture courte est affichée avec le prompt. always|never|once.
lecture_file (string) Fichier contenant le message à afficher au lieu du message embarqué
listpw (string) Contrôle quand un mot de passe est requis quand un utilisateur lance sudo -l:

        all Toutes les entrées de l'utilisateur pour l'hôte courant dans le fichier sudoers doivent avoir le flag NOPASSWD pour éviter d'entrée le mot de passe
        always L'utilisateur doit entrer un mot de passe pour utiliser -l
        any Au moins une entrée de l'utilisateur dans sudoers doit avoir le flag NOPASSWD pour ne pas entrer de mot de passe
        never L'utilisateur ne doit jamais entrer un mot de passe pour utiliser l'option -l
       

logfile (string) Chemin du fichier de log sudo.
mailerflags (string) flags à utiliser en invoquant mailer Défaut: -t
mailerpath (string) Chemin du programme pour envoyer les mails.
mailfrom (string) Adresse du champ From
mailto (string) Adresse de destination de mail
restricted_env_file (string) Fichier contenant les variables à définir dans l'environnement. Ces variables de manière similaires à l'environnement de l'utilisateur invoquant.
secure_path (string) Chemin de toutes les commandes lancées par sudo
syslog (string) facilité syslog pour les logs
syslog_badpri (string) Priorité sysloge quand l'utilisateur n'est pas autorisé à lancer une commande ou en cas d'echec de l'authentification
syslog_goodpri (string) Priorité syslog à utiliser quand l'utilisateur est autorisé à lancer une commande et que l'authentification a réussie.
verifypw (string) Contrôle quand un mot de passe est requis avec sudo -v:

        all Toutes les entrées dans le fichiers sudoers doivent avoir NOPASSWD pour éviter d'entrer un mot de passe.
        always L'utilisateur doit toujours entrer sont mot de passe pour utiliser l'option -v
        any Au moins une entrée dans le fichier sudoers pour l'utilisateur doit avoir le flag NOPASSWD pour éviter d'entrer un mot de passe
        never L'utilisateur n'a jamais besoin d'entrer un mot de passe

env_check (string) Variables d'environnement à supprimer sauf si elles sont sûres. Pour toutes les variables excepté TZ, sûre signifie que la valeur de la variable ne contient pas de '%' ou '/'
env_delete (string) Variables d'environnement à supprimer de l'environnement de l'utilisateur quand env_reset n'est pas effectif.
env_keep (string) Variables d'environnements à préserver de l'environnement de l'utilisateur quand env_reset est effectif

Plugins group

   sudoers supporte sa propre interface de plugin pour permettre de rechercher des groupes non-Unix dans une source autre que la base de groupe Unix standard. Celà permet d'implémenter la syntaxe nonunix_group.

   Les plugins group sont spécifiés via le paramètres group_plugin. Les plugins group suivants sont installés par défaut:

group_file.so Supporte un fichier de groupes alternatif qui utilise la même syntaxe que /etc/group. Le chemin du fichier doit être spécifié en arguments
system_group.so Supporte la recherche de groupe via getgrnam() et getgrid(). Il peut être utilisé dans le cas où des utilisateurs appartiennent à des groupes non-présents dans le vecteur groupe supplémentaire de l'utilisateur. Ce plugin n'a pas d'options

Format de log

   sudoers peut logger des évènements en utilisant syslog(3) ou un simple fichier. Le format est pratiquement identique dans les 2 cas.

Les commandes que sudo lance sont loggés en utilisant le format suivant:
date hostname progname: username : TTY=ttyname ; PWD=cwd ; USER=runasuser ; GROUP=runasgroup ; TSID=logid ; ENV=env_vars COMMAND=command

        date Date et heure à laquelle la commande a été lancée au format "MMM,DD,HH:MM:SS". Via syslog, le format de date est contrôllé par syslog. log_year permet d'inclure l'année
        hostname Le nom de l'hôte où sudo a été lancé. Seulement présent via syslog
        progname Le nom du programme, généralement sudo ou sudoedit. Seulement présent via syslog
        username Nom de login de l'utilisateur invoquant
        ttyname Nom court du terminal
        cwd Répertoire de travail courant
        runasuser Utilisateur sous lequel la commande est lancée
        runasgroup Groupe sous lequel la commande est lancée
        logid Identifiant de log I/O qui peut être utilisé pour rejouer la sortie des commande (log_input ou log_output doit être activé)
        env_vars variables d'environneent spécifiés sur la ligne de commande.
        command La commande exécutée

Entrées de log des commandes refusées

   Si l'utilisateur n'est pas autorisé à lancer la commande, la raison du refus suit le nom de l'utilisateur. Les raisons possibles sont:

        user NOT insudoers L'utilisateur n'est pas listé dans le fichie sudoers
        user NOT authorized on host L'utilisateur est listé dans le fichier sudoers mais n'est pas autorisé à lancer les commandes sur cet hôte
        command not allowed L'utilisateur est listé dans le fichier sudoers mais n'est pas autorisé à lancer la commande spécifiée
        3 incorrect password attemps L'utilisateur a échoué "passwd_trie" fois
        a password is required sudo -n a été spécifié, mais un mot de passe est requis
        sorry, you are not allowed to set the following environment variables L'utilisateur a spécifié des variables d'environnement sur la ligne de commande qui ne sont pas autorisés par sudoers

Entrées de log d'erreur

   Si une erreur se produit, sudoers log un message et, dans la plupart des cas, envoie un message à l'administrateur local via email. Les erreurs possibles incluent:

        parse error in /etc/sudoers near line N Erreur dans la configuration
        problem with defaults entries Options Defaults inconnus. N'empêche pas sudo de fonctionner
        timestamp owner (username): No such user l'utilisateur spécifié dans timestampowner n'a pas été trouvé dans la base de compte
        unable to open/read /etc/sudoers le fichier sudoers n'est pas accessible
        unable to open/read /etc/sudoers Le fichier /etc/sudoers n'existe pas
        /etc/sudoers is not a regular file Le fichier existe mais n'est pas un fichier régulier ou un lien symbolique
        /etc/sudoers is owned by uid N, should be 0 Le fichier n'est pas possédé par root
        /etc/sudoers is world writable Le fichier est accessible en écriture par tout le monde. Normalement il devrait être 0440
        /etc/sudoers is owned by gid N, should be 1 le fichier n'a pas le bon groupe.
        unable to open /var/run/sudo/ts/username sudoers n'arrive pas à lire ou créer le fichier d'horodatage pour l'utilisateur. Le répertoire parent doit être 0711
        unable to write to /var/run/sudo/ts/username sudoers n'arrive pas à écrire dans le fichier d'horodatage de l'utilisateur
        /var/run/sudo/ts is owned by uid X, should be Y Le répertoire ts est possédé par un utilisateur autre que timestampowner.
        /var/run/sudo/ts is group writable Le répertoire ts est accéssible en écriture par le groupe. Doit être 0700

Notes sur syslog

   Par défaut, sudoers log les messages via syslog. date, hostname et progname sont ajoutés par syslog, et non sudoers. ces informations peuvent donc varier d'un système à l'autre. La taille maximum des messages syslog varie également d'un système à l'autre. syslog_maxlen peut être utilisé pour changer la valeur par défaut de 980octets.

Notes sur le fichier de log

   Si logfile est activé, sudoers log dans un fichier local. sudoers utilise un format similaire à syslog, avec quelques différences importantes:

        - progname et hostname ne sont pas présents
        - si log_year est activé, l'année est incluse
        - Les lignes plus longue que loglinelen sont coupées et continées sur la ligne suivantes

Fichier de log d'E/S

   Quand le logging I/O est activé, sudo lance la commande dans un pseudo-tty et log toutes les E/S de l'utilisateur dans "iolog_dir" en utilisant un ID de session unique qui set inclus dans les logs, préfixé par "TSID=". Chaque log I/O est stocké dans un répertoire séparé qui contient les lignes suivantes:

        log Un fichier text contenant la date à laquelle la commande a été lancée, le nom de l'utilisateur invoquant, le nom de l'utilisateur cible, le nom du groupe cible, le terminal, le nombre de lignes et colonnes du terminal, le répertoire courant où la commande a été lancée et le chemin de la commande avec ses arguments.
        timing Un log de la quantité de temps, et le nombre d'octets, entre chaque entrées de log I/O.
        ttyin Entrée depuis le tty de l'utilisateur
        stdin Entrée depuis un pipe ou un fichier
        ttyout Sortie du pseudo-tty
        stdout Sortie standard dans un pipe ou redirigé dans un fichier
        stderr Erreur standard vers un pipe ou redirigé dans un fichier

   Tous les fichiers autre que log sont compressé au format gzip sauf si compress_io est désactivé. À cause du tampon, il n'est pas possible d'afficher les logs I/O en temps réel sauf si iolog_flush est utilisé.
  

   Vu que le log E/S de chaque session utilisateur est stocké dans un répertoire séparé, les utilitaires de rotation de log traditionnels ne peuvent pas être utilisés pour limiter le nombre de logs E/S. La manière la plus simple est d'utiliser l'option maxseq. Une fois la sequence atteinte, il est réinitialisé à 0 est sudoers tronque et réutilise les logs E/S existants.

Fichiers

/etc/sudo.conf Fichier de configuration de sudo
/etc/sudoers Fichier de stratégie de sudoers
/etc/group Fichier de groupes locaux
/etc/netgroup Liste des netgroups
/var/log/sudo-io Fichiers de log d'E/S
/var/run/sudo/ts Répertoire contenant les timestamps pour la stratégie de sécurité sudoers
/var/adm/sudo/lectured Répertoire contenant les fichiers de status de lecture pour la stratégie de sécurité sudoers
/etc/environment Environnement initial pour les système sans PAM

Notes de sécurité

- l'opération '!' ne doit pas être utilisé pour soustraire des commandes depuis AL, vu qu'il n'empêche pas d'exécuter ces commandes via un autre nom.
- fast_glob ne permet pas d'utiliser '!' correctement quand le chemin inclus du globbing.

Empêcher les échappements du shell

   Quand sudo exécute un programme, ce programme est libre de faire ce qu'il veut, incluant de lancer d'autres programmes. Cela peut être un problème de sécurité vu qu'il n'est pas commun pour un programme d'autoriser les échappements du shell, qui laisse un utilisateur bypasser le contrôle d'accès à sudo. Les programmes communs qui permettent les échappement du shell incluent les éditeurs, paginateurs, mails et terminaux. Il y a 2 approches à ce problème:

restrict Éviter de donner accès aux commande qui autorise un utilisateur à lancer des commandes arbitraires. De nombreux éditeurs ont des modes restreints qui désactive les échappements, bien que sudoedit est une meilleur solution aux éditeurs lancés via sudo.
noexec De nombreux systèmes qui supportent les librairies partagées ont la capacité de remplacer les fonctions par défaut en pointant une variable d'environnement (ex LD_PRELOAD) vers une librairie alternative. Dans de tels systèmes, la fonctionnalité noexec de sudo peut être utilisée pour éviter de lancer un programme qui exécute d'autres programmes.

Édition sécurisée

   Le plugin sudoers inclus sudoedit qui permet aux utilisateurs d'éditer les fichiers de manière sécurisée avec l'éditeur de leur choix. sudoedit est une commande intégrée et doit être spécifié dans le fichier sudoers dans chemin. Cependant, il peut prendre des arguments de ligne de commande. À la différence des autres commandes sudo, l'éditeur est lancé avec les permissions de l'utilisateur invoquant et avec l'environnement non-modifié.

   Les utilisateurs ne devraient jamais avoir les permissions sudoedit pour éditer un fichier qui réside dans un répertoire auquel l'utilisateur a accès en écriture, soit directement, ou via wildcard. Si l'utilisateur à ces droits, il peut remplacer le fichier avec un lien vers un autre fichier. Pour éviter cela, les liens symbolique ne sont pas suivis dans les répertoires en écriture (option sudoedit_checkdir).

Vérification du fichier timestamp

   sudoers vérifie le propriétaire de son répertoire d'horodatage et ignore le contenu du répertoire s'il n'est pas possédé par root, ou s'il est accessible en écriture par un utilisateur non-root.

   Bien que ce répertoire devrait être effacé au reboot, tous les systèmes ne contiennent pas de répertoire /var/run. Pour éviter de potentielles problèmes sudo ignore les fichiers timestamps antérieur au boot système.

   Certains systèmes avec des environnements graphiques permettent à des utilisateurs non-privilégiés de changer l'heure système. Vu que sudoers s'assure de l'horloge système pour la validation des horodatages, il peut être possible dans de tels systèmes qu'un utilisateur qui lance sudo pour une durée supérieur à timestamp_timeout en reculant l'horloge. Pour combattre cela, sudoers utilise une horloge monolitique pour ses horodatages si le système le supporte.

   Vu que les fichiers d'horodatage résident dans le système de fichier, ils peuvent survire à une session utilisateur. En résultat, un utilisateur peut être capable de se logger, lancer une commande avec sudo après s'être authentifié, se déconnecter, se reconnecter, et lancer sudo sans s'authentifier tant que l'horodatage est dans les 5 minutes. Quand l'option tth_tickets est activé, l'horodatage inclus le numéro de périphérique du terminal de l'authentification. Cela fournis une granularité par tth mais les horodatages continue à survivre entre les sessions. L'enregistrement d'horodatage inclus également l'ID de session du processus qui a été authentifié en dernier. Cela empêche les processus dans des session terminal différents d'utiliser le même enregistrement d'horodatage. Cela aide également à réduire les chances qu'un utilisateur soit capable de lancer sudo sans entrer un mot de passe en se déconnectant et revenant dans le même terminal.

Debuggage

   Le plugin sudoers support un framework de debuggage qui peut aider à suivre ce qu'il fait en interne s'il y a un problème. Cela peut être configuré dans le fichier sudo.conf

   sudoers utilise le même format de flag de debug que sudo. "subsystem@priority". Les priorités sont crit, err, warn, notice, diag, info, trace, debug. Les sous-systèmes suivant sont utilisés par sudoers:

alias traitements User_Alias, Runas_Alias, Host_Alias et Cmnd_Alias
all Match tous les sous-systèmes
audit Code d'audite Linux
auth Authentification utilisateur
defaults Paramètres Defaults
env Gestion de l'environnement
ldap sudoers basé sur LDAP
logging Support du logging
match Match des utilisateurs, groupes, hôtes et netgroups dans le fichier sudoers
netif Gestion des interfaces réseaux
nss Gestion nss dans sudoers
parser Parsing de fichier sudoers
perms Définition des permissions
plugin Équivalent de main pour le plugin
pty Code lié au pseudo-tty
rbtree redblack tree interne
sssd Sudoers basé sur sssd
util Fonctions utilitaires
^
03 juillet 2017

htmlpdflatexmanmd




sudoers.ldap

sudoers.ldap

Configuration LDAP sudo

   En plus du fichier standard sudoers, sudo peut être configuré via LDAP. sudo n'a plus besoin de lire sudoers.

   La configuration sudoers est contenue dans le conteneur LDAP ou=SUDOers. Sudo recherche d'abord l'entrée cn=defaults dans le conteneur et parcours les attributs sudoOption.

   L'équivalent d'un sudoers dans LDAP est un sudoRole. Il consiste des attributs suivants:

sudoUser Un nom d'utilisateur valide, #‹UID›, %‹group›, %#‹GID›, +‹netgroup›, ou %:‹groupe non unix› %:#‹ID de groupe non unix›
sudoHost Nom d'hôte, IP, réseau ou +‹netgroup d'hôte›. ALL match tous les hôte.
sudoCommand Nom d'une commande et ses arguments, optionnellement préfixé par '!'
sudoOption Identique aux options globales, mais spécifiques au sudoRole
sudoRunAsUser user sous lequel la commande est lancée
sudoRunAsGroup Groupe sous lequel la commande est lancée
sudoNotBefore horodatage de début de validité du sudoRole
sudoNotAfter horodatage de fin de validité du sudoRole
sudoOrder Les entrées sudoRole LDAP n'ont pas d'ordre. sudoOrder est un entier utilisé pour trier les entrées qui matchent.

Anatomie de la recherche LADP sudoers

   En recherchant un sudoer utilisant LDAP il y a seulement 2 ou 3 requêtes LDAP par invocation. La première requête sert à parcourir les options globales. Le second sert à matche le nom de l'utilisateur et les groupes auquel l'utilisateur appartient. Si aucun match n'est retourné pour l'utilisateur ou les groupes, une 3ème requête retourne toutes les entrées contenant les netgroups de l'utilisateur et les groupes non-unix et vérifie si l'utilisateur appartient à l'un d'entre-eux.

   Si les entrées timées sont activées avec la directive SUDOERS_TIMED, les requêtes LDAP incluent un sous-filtre qui limite la recherche aux entrées qui satisfont les contraintes de temps.

   Si la directive NETGROUP_BASE est présente, les requêtes sont effectuées pour déterminer la liste des netgroups auquel l'utilisateur appartient avant la requête sudoers. Cela permet d'inclure la liste des netgroups dans les requêtes sudoers de la même manière qu'avec les groupes unix. La 3ème requête n'est pas effectuées sauf si un plugin group est également effectuée. Les requêtes LDAP sont effectuées par sudo comme suit:

1. Match tous les enregistrement nisNetgroup avec un nisNetgroupTriple contenant l'utilisateur, l'hôte et le domaine NIS. La requête matche les entrées nisNetgroupTriple avec la forme courte ou longue du nom de domaine ou aucun nom d'hôte. Si le domaine NIS est définis, la requête matche seulement les entrées qui incluent de domaine ou pour lequel il n'y a pas de domaine présent. Si le domaine NIS n'est pas définis, un wildcard est utilisé pour matcher tous domaine pas prend en compte que le schéma NIS utilisé par les serveurs LDAP peuvent ne pas supporter les wildcard pour nisNetgroupTriple.
2. Les requêtes répétées sont effectuées pour trouver tout enregistrement nisNetgroup imbriqués avec une entrée memberNisNetgroup qui réfère à un enregistrement déjà matché.

Différence entre les sudoers LDAP et non-LDAP

   Il y a quelques subtiles différences dans la comportement de sudoers utilisant LDAP. La plus grosse différence étant l'ordre des entrées et attributs retournés, qui sont contrôlés par sudoOrder.

Configurer ldap.conf

   sudo lit le fichier /etc/ldap.conf. Seuls ces options sont supportés par sudo:

BIND_TIMELIMIT Spécifie le temps en secondes d'attente de connection à un serveur LDAP.
BINDDN Identité, sous la formate d'un DN, à utiliser pour effectuer les opérations LDAP
BINDPW Mot de passe de BINDDN
DEREF Spécifie comment déréférencer les alias
HOST Nom du serveur LDAP
KRB5_CCNAME Chemin du cache d'accréditifs Kerberos 5
LDAP_VERSION Version du protocole LDAP
NETGROUP_BASE DN de base pour les recherches des netgroups
NETGROUP_SEARCH_FILTER Filtre de recherche des netgroupes
PORT Port du serveur LDAP
ROOTBINDDN DN pour les opérations LDAP privilégiées
ROOTUSE_SASL Active l'authentification SASL pour les traitements privilégiés
SASL_AUTH_ID utilisateur SASL pour la connection LDAP
SASL_MECH Liste de mécanismes SASL à utiliser
SASL_SECPROPS Propriétés de sécurité SASL
SSL Active TLS pour les communications LDAP
SUDOERS_BASE DN de base pour les recherches SUDO
SUDOERS_DEBUG Niveaux de débuggage pour les requêtes sudo
SUDOERS_SEARCH_FILTER Filtre de recherche pour les requêtes sudo
SUDOERS_TIMED Spécifie si sudoNotBefore et sudoNotAfter sont évalués
TIMELIMIT Délai en secondes d'attente d'une réponse LDAP
TIMEOUT Délai en secondes d'attente d'une réponse depuis divers API LDAP
TLS_CACERTFILE Certificat de l'autorité
TLS_CACERTDIR Répertoire contenant les certificats d'autorité
TLS_CERT Certificat client
TLS_CHECKPEER Vérifie le certificat du serveur
TLS_KEY Clé privée du client
TLS_CIPHERS Liste d'algorithmes de chiffrement TLS à utiliser
TLS_KEYPW Mot de passe pour déchiffrer la clé privée. Peut être en base64 (base64:dGVzdA==)
TLS_RANDFILE Source d'entropie
URI URI du serveur LDAP
USE_SASL Active l'authentification SASL
ROOTSASL_AUTH_ID Utilisateur SASL à utiliser avec ROOTUSE_SASL

Configurer nsswitch.conf

   sudo consulte nsswitch.conf puor spécifie l'ordre de recherce sudoers. sudo recherche une ligne commençant par sudoers: et l'utilise pour déterminer l'ordre de recherche. Noter que sudo n'arrête pas sa recherche après le premier match et le dernier match a précédence. Les sources suivantes sont reconnus:

files Lit le fichier /etc/sudoers
ldap Lit sudoers depuis LDAP

   De plus, l'entrée [NOTFOUND=return] court-circuite la recherche si l'utilisateur n'a pas été trouvé dans la source précédente

Intergration avec sssd

   Dans les systèmes avec System Security Service Daemon il est possible d'utiliser SSSD pour cacher les règles sudoers LDAP. pour utiliser sssd, il faut utiliser sssd au lieu de ldap dans l'entrées sudoers dans /etc/nsswitch.conf. Noter que /etc/ldap.conf n'est pas utilisé par sssd.
^
03 juillet 2017

htmlpdflatexmanmd




sudoreplay

sudoreplay

Rejouer les logs de session sudo

   sudoreplay rejout ou liste les logs créés par sudo. Il peut jouer les sessions en temps réel, ou en ajustant la vitesse.

   L'ID doivrait être une séquence à 6 chiffres et lettres majuscules, ou un motif matchant l'option iolog_file. Quand une commande est lancée via sudo avec log_output activée dans le fichier sudoers, la chaîne TSID=ID est loggée via syslog ou dans le fichier de log. L'ID peut également être déterminé en mode list.

   En mode list, sudoreplay peut être utilisé pour trouver un ID de session basé sur des critères tels que l'utilisateur, le tty ou la commande lancée:

\n, \r Saute au prochain évènement, utile pour les longues pauses
' ' Met en pause la sortie, appuyer un n'importe quelle touche pour relancer
Réduit la vitesse par 2
Double la vitesse

OPTIONS

-d, --directory=dir Répertoire des logs de session au lieu du défaut /var/log/sudo-io
-f, --filter=[stdin|stdout,stderr,ttyin,ttyout] Sélection quels types E/S afficher.
-l, --list [expr] Active le mode liste. Dans ce mode, sudoreplay liste les sessions disponibles dans un format similaire au format de log sudo, trié par nom de fichier ou séquence de nombre. Si une expression de recherche est spécifiée, restreint les ID qui sont affichés. Une expression est composée des prédicats suivants:

        command ‹pattern› Évalue à vrai si la commande match le motif spécifié
        cwd ‹dir› Évalue à vrai si la commande a été lancée dans le répertoire spécifié
        fromdate ‹date› Évalue à vrai si la commande a été lancée à ou après cette date
        group ‹runas_group› Évalue à vrai si la commande a été lancée sous le groupe spécifié
        runas ‹runas_user› Évalue à vrai si la commande a été lancée sous l'utilisateur spécifié
        todate ‹date› Évalue à vrai si la commande a été lancée avant la date spécifiée
        tty ‹tty› Évalue à vrai si la commande a été lancée dans le terminal spécifié
        user ‹user› Évalue à vrai si la commande a été lancée par l'utilisateur spécifié

           Les prédicats peuvent être combinées en utilisant les opérateurs and, or et !, ainsi que les parenthèses.

-m, --max-wait Spécifie une limite maximum d'attente entre les frappes de touche ou la sortie de données.
-s, --speed Spécifie le facteur de vitesse.

Format de date

   La date et l'heure peuvent être spécifié de plusieurs manières: HH:MM:SS am MM/DD/CCYY timezone, HH:MM:SS am Month, Day Year timezone, CCYY-MM-DD HH:MM:SS, DD Month CCYY HH:MM:SS

   Les dates suivantes sont valides:

now
tomorrow
yesterday il y a 24 heure
2 hours ago
next Friday
last week
a fortnight ago L'heure courante, mais il y a 14 jours
10:01 am 9/17/2009
10:01 am
10 10 heure du matin
9/17/2009
10:01 am Sep 17, 2009

Exemples

Lister les sessions lancées par millert
sudoreplay -l user millert
Lister les sessions lancées par bob avec une commande contenant la chaîne vi
sudoreplay -l user bob command vi
Lister les sessions lancées par jeff qui match l'expression régulière
sudoreplay -l user jeff command '/bin/[a-z]*sh'
Lister les sessions lancées par jeff ou bob dans la console
sudoreplay -l ( user jeff or user bob ) tty console
^
03 juillet 2017

htmlpdflatexmanmd




visudo

visudo

Éditer le fichier sudoers

   visudo édite le fichier sudoers de manière sûre, analogue à vipw. visudo lock le fichier et fournis des vérifications de base.

   Il y a une liste hardcodée d'un ou plusieurs éditeur que visudo utilise qui peut être remplacés par le paramètre editors. Cette liste est par défaut à 'vi'. Normalement, visudo n'honore pas VISUAL et EDITOR sauf si elles contiennent un éditeur dans la liste des éditeurs mentionnés.

   visudo parse le fichier sudoers après l'édition et ne sauve les changement que s'il n'y a pas d'erreur de syntaxe.

OPTIONS

-c, --check Mode vérification, vérifie la syntaxe, propriétaire et mode.
-f, --file=sudoers Spécifie l'emplacement du fichier sudoers
-q, --quiet mode silencieux
-s, --strict Vérification stricte. Si un alias est référencé mais n'est pas définis, ou s'il y a une boucle d'alias, génère une erreur.
-x, --export=output_file Exporte un sudoers dans un format JSON dans le fichier spécifié ou stdin si '-'