\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{lun. juil. 3 10:08:36 CEST 2017}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={sudoers},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={plugin de stratégie de sécurité de sudo par défaut},
CreationDate={D:20170703100836},
ModDate={D:20170703100836},
Keywords={sudo;rbac;security}
}}
\begin{document}
 
\begin{center}
{\Huge sudoers }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large plugin de stratégie de sécurité de sudo par défaut}
 
\vspace{10mm}
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  Les arguments du plugins sont les suivants:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} ldap\_conf=<path>]{emplacement du fichier ldap.conf alternatif}
\item[\hspace{1mm} ldap\_secret=<path>]{emplacement du fichier ldap.secret alternatif}
\item[\hspace{1mm} sudoers\_file=<path>]{fichier sudoers alternatif}
\item[\hspace{1mm} sudoers\_uid=<uid>]{UID du propiétaire du fichier sudoers}
\item[\hspace{1mm} sudoers\_gid=<gid>]{GID du fichier sudoers}
\item[\hspace{1mm} sudoers\_mode=<mode>]{mode du fichier sudoers en octal}
\end{description}
 
\vspace{1cm}{\huge Authentification Utilisateur }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Logging }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Environnement de commande }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Format du fichier sudoers }
 
\
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Syntaxe EBNF }
 
\
 
\hspace{1mm}  EBNF contient les opérateurs suivants:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} ?]{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}
\item[\hspace{6mm} * ]{Signifie que le symbole ou groupe de symbole précédent peut apparaître 0 ou plusieurs fois}
\item[\hspace{6mm} +]{Signifie que le symbole ou groupe de symbole précédent peut apparaître une ou plusieurs fois}
\end{description}
 
\vspace{1cm}{\huge Aliases }
 
\
 
\hspace{1mm} Il y a 4 types d'alias: User\_Alias, Runas\_Alias, Host\_Alias et Cmnd\_Alias:
 
{\ttfamily
Alias ::= 'User\_Alias' User\_Alias (':' User\_Alias)* |\\ \hspace{2mm}'Runas\_Alias' Runas\_Alias (':' Runas\_Alias)* |\\ \hspace{2mm}'Host\_Alias' Host\_Alias (':' Host\_Alias)* |\\ \hspace{2mm}'Cmnd\_Alias' Cmnd\_Alias (':' Cmnd\_Alias)*\\ \hspace{2mm}\\ User\_Alias ::= NAME '=' User\_List\\ \hspace{2mm}\\ Runas\_Alias ::= NAME '=' Runas\_List\\ \hspace{2mm}\\ Host\_Alias ::= NAME '=' Host\_List\\ \hspace{2mm}\\ Cmnd\_Alias ::= NAME '=' Cmnd\_List\\ \hspace{2mm}\\ NAME ::= \texttt{[}A-Z\texttt{]}(\texttt{[}A-Z\texttt{]}\texttt{[}0-9\texttt{]}\_)*\\
}
\vspace{8mm}
 
\hspace{1mm} 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: \textbackslash{}x20)
 
{\ttfamily
User\_List ::= User |\\ \hspace{2mm}\hspace{2mm}User ',' User\_List\\ \hspace{2mm}\\ User ::= '!'* user name |\\ \hspace{2mm}\hspace{2mm}'!'* \#uid |\\ \hspace{2mm}\hspace{2mm}'!'* \%group |\\ \hspace{2mm}\hspace{2mm}'!'* \%\#gid |\\ \hspace{2mm}\hspace{2mm}'!'* +netgroup |\\ \hspace{2mm}\hspace{2mm}'!'* \%:nonunix\_group |\\ \hspace{2mm}\hspace{2mm}'!'* \%:\#nonunix\_gid |\\ \hspace{2mm}\hspace{2mm}'!'* User\_Alias\\
}
\vspace{8mm}
 
\hspace{1mm} Une liste Runas\_Alias est similaire à une User\_List.
 
{\ttfamily
Runas\_List ::= Runas\_Member |\\ \hspace{2mm}\hspace{2mm}Runas\_Member ',' Runas\_List\\ \hspace{2mm}\\ Runas\_Member ::= '!'* user name |\\ \hspace{2mm}\hspace{2mm}'!'* \#uid |\\ \hspace{2mm}\hspace{2mm}'!'* \%group |\\ \hspace{2mm}\hspace{2mm}'!'* \%\#gid |\\ \hspace{2mm}\hspace{2mm}'!'* \%:nonunix\_group |\\ \hspace{2mm}\hspace{2mm}'!'* \%:\#nonunix\_gid |\\ \hspace{2mm}\hspace{2mm}'!'* +netgroup |\\ \hspace{2mm}\hspace{2mm}'!'* Runas\_Alias\\
}
\vspace{8mm}
 
\hspace{1mm} Une liste d'hôtes est faite d'un ou plusieurs noms d'hôte, adresses IP, réseaux, +netgroups, et d'autres alias.
 
{\ttfamily
Host\_List ::= Host |\\ \hspace{2mm}\hspace{2mm}Host ',' Host\_List\\ \hspace{2mm}\\ Host ::= '!'* host name |\\ \hspace{2mm}\hspace{2mm}'!'* ip\_addr |\\ \hspace{2mm}\hspace{2mm}'!'* network(/netmask)? |\\ \hspace{2mm}\hspace{2mm}'!'* +netgroup |\\ \hspace{2mm}\hspace{2mm}'!'* Host\_Alias\\
}
\vspace{8mm}
 
\hspace{1mm}  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
\vspace{5mm} \\
 
 
\hspace{1mm} 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: ',’, ':’, '=’, '\textbackslash{}’. 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.
 
{\ttfamily
digest ::= \texttt{[}A-Fa-f0-9\texttt{]}+ |\\ \hspace{2mm}\hspace{2mm}\texttt{[}\texttt{[}A-Za-z0-9+/=\texttt{]}+\\ \hspace{2mm}\\ Digest\_Spec ::= "sha224" ':' digest |\\ \hspace{2mm}\hspace{2mm}"sha256" ':' digest |\\ \hspace{2mm}\hspace{2mm}"sha384" ':' digest |\\ \hspace{2mm}\hspace{2mm}"sha512" ':' digest\\ \hspace{2mm}\\ Cmnd\_List ::= Cmnd |\\ \hspace{2mm}\hspace{2mm}Cmnd ',' Cmnd\_List\\ command name ::= file name |\\ \hspace{2mm}\hspace{2mm}file name args |\\ \hspace{2mm}\hspace{2mm}file name '""'\\ \hspace{2mm}\\ Cmnd ::= Digest\_Spec? '!'* command name |\\ \hspace{2mm}\hspace{2mm}'!'* directory |\\ \hspace{2mm}\hspace{2mm}'!'* "sudoedit" |\\ \hspace{2mm}\hspace{2mm}'!'* Cmnd\_Alias\\
}
\vspace{8mm}
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Default }
 
\
 
\hspace{1mm} 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.
 
{\ttfamily
Default\_Type ::= 'Defaults' |\\ \hspace{2mm}\hspace{2mm}'Defaults' '@' Host\_List |\\ \hspace{2mm}\hspace{2mm}'Defaults' ':' User\_List |\\ \hspace{2mm}\hspace{2mm}'Defaults' '!' Cmnd\_List |\\ \hspace{2mm}\hspace{2mm}'Defaults' '>' Runas\_List\\ \hspace{2mm}\\ Default\_Entry ::= Default\_Type Parameter\_List\\ \hspace{2mm}\\ Parameter\_List ::= Parameter |\\ \hspace{2mm}\hspace{2mm}Parameter ',' Parameter\_List\\ \hspace{2mm}\\ Parameter ::= Parameter '=' Value |\\ \hspace{2mm}\hspace{2mm}Parameter '+=' Value |\\ \hspace{2mm}\hspace{2mm}Parameter '-=' Value |\\ \hspace{2mm}\hspace{2mm}'!'* Parameter\\
}
\vspace{8mm}
 
\hspace{1mm}  += 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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Spécification d'utilisateur }
 
\
 
{\ttfamily
User\_Spec ::= User\_List Host\_List '=' Cmnd\_Spec\_List \textbackslash{}\\ \hspace{2mm}\hspace{2mm}(':' Host\_List '=' Cmnd\_Spec\_List)*\\ \hspace{2mm}\\ Cmnd\_Spec\_List ::= Cmnd\_Spec |\\ \hspace{2mm}\hspace{2mm}Cmnd\_Spec ',' Cmnd\_Spec\_List\\ \hspace{2mm}\\ Cmnd\_Spec ::= Runas\_Spec? Option\_Spec* Tag\_Spec* Cmnd\\ \hspace{2mm}\\ Runas\_Spec ::= '(' Runas\_List? (':' Runas\_List)? ')'\\ \hspace{2mm}\\ Option\_Spec ::= (SELinux\_Spec | Solaris\_Priv\_Spec | Date\_Spec | Timeout\_Spec)\\ \hspace{2mm}\\ SELinux\_Spec ::= ('ROLE=role' | 'TYPE=type')\\ \hspace{2mm}\\ Solaris\_Priv\_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')\\ \hspace{2mm}\\ Date\_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')\\ \hspace{2mm}\\ Timeout\_Spec ::= 'TIMEOUT=timeout'\\ \hspace{2mm}\\ Tag\_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |\\ \hspace{2mm}\hspace{2mm}'LOG\_INPUT:' | 'NOLOG\_INPUT:' | 'LOG\_OUTPUT:' |\\ \hspace{2mm}\hspace{2mm}'NOLOG\_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |\\ \hspace{2mm}\hspace{2mm}'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')\\
}
\vspace{8mm}
 
\hspace{1mm}  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 \textbf{who where = (as\_whom] what}
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Runas\_Spec }
 
\
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm} l'utilisateur dbg peut lancer ces 3 commandes, mais seulememt comme operator: \\
\hspace{1mm} \textbf{dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm} \\
\hspace{1mm} Il est également possible de remplacer Runas\_Spec dans une entrée: \\
\hspace{1mm} \textbf{dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm} \\
\hspace{1mm} On peut l'étendre peut permettre à dbg de lancer /bin/ls avec soit l'utilisateur soit le groupe à operator: \\
\hspace{1mm} \textbf{dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm} \\
\hspace{1mm} 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: \\
\hspace{1mm} \textbf{sudo -u operator /bin/ls} \\
\hspace{1mm} \textbf{sudo -u operator -g operator /bin/ls} \\
\hspace{1mm} \textbf{sudo -g operator /bin/ls} \\
\hspace{1mm} Dans l'exemple suivant, l'utilisateur tcm peut lancer des commandes qui accèdent à un périphérique modem avec le groupe dialer \\
\hspace{1mm} \textbf{tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, /usr/local/bin/minicom} \\
\hspace{1mm} Seul le groupe est définis, la commande est lancée avec l'utilisateur tcm \\
\hspace{1mm} \textbf{sudo -g dialer /usr/bin/cu} \\
\hspace{1mm} 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 \\
\hspace{1mm} \textbf{alan ALL = (root, bin : operator, system) ALL} \\
\hspace{1mm} alan peut lancer une commande soit en root, soit bin, optionnellement en définissant le groupe operator ou system \\
 
\vspace{1cm}{\huge Option\_Spec }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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).
\vspace{5mm} \\
 
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} \texttt{[}NO\texttt{]}EXEC]{autorise à lancer un exécutable lié dynamiquement}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}FOLLOW]{autorise à suivre les liens symboliques pour sudoedit uniquement}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}LOG\_INPUT]{Remplace l'option log\_input}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}LOG\_OUTPUT]{Remplace l'option log\_output}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}MAIL]{Remplace la valeur de l'option mail\_all\_cmnds. N'a pas d'effet avec -l ou -v}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}PASSWD]{Exige que l'utilisateur s'authentifie lui-même avant de lancer une commande}
\item[\hspace{6mm} \texttt{[}NO\texttt{]}SETENV]{Remplace la valeur de l'option SETENV}
\end{description}
 
\vspace{1cm}{\huge Wildcard }
 
\
 
\hspace{1mm}  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:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} * ]{Matche un jeu de 0 ou plusieurs caractères}
\item[\hspace{6mm} ?]{Matche un simple caractère}
\item[\hspace{6mm} \texttt{[}...\texttt{]}]{Matche un des caractères}
\item[\hspace{6mm} \texttt{[}!...\texttt{]}]{Matche tout caractère non listé}
\item[\hspace{6mm} \textbackslash{}x]{pour spécifier les caractères '*','?','[' et ']'}
\end{description}
 
\vspace{1cm}{\huge Inclure d'autres fichiers }
 
\
 
\hspace{1mm}  Il est possible d'inclure d'autres fichiers sudoers avec les directives \#include et \#includedir.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Autres caractères spéciaux et mots réservés }
 
\
 
\hspace{1mm}  '\#' 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).
\vspace{5mm} \\
 
 
\hspace{1mm}  Le mot réservé ALL est un alias intégré qui implique qu'un match réussi toujours.
\vspace{5mm} \\
 
 
\hspace{1mm}  '!' peut être utilisé comme opérateur NOT dans une liste.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Options sudoers }
 
\
 
\hspace{1mm}  sudo peut être modifié par des lignes Default\_Entry:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} 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}
\item[\hspace{1mm} always\_set\_home]{(bool) activé, sudo définis HOME au répertoire home de l'utilisateur cible}
\item[\hspace{1mm} authenticate]{(bool) définis, les utilisateurs doivent s'authentifier eux-même avant de lancer des commandes}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} env\_editor]{(bool) Définis, visudo utilise la valeur de EDITOR ou VISUAL comme liste d'éditeur par défaut}
\item[\hspace{1mm} env\_reset]{(bool) définis, lance la commande dans un environnement minimal}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} fqdn]{(bool) place les noms ftdn dans le fichiers sudoers quand le nom d'hôte local ne contient pas de nom de domaine.}
\item[\hspace{1mm} ignore\_audit\_errors]{(bool) autorise à lancer les commandes même si sudoers ne peut écrire dans le log d'audit}
\item[\hspace{1mm} ignore\_dot]{(bool) définis, ignore "." ou "" dans la variable PATH}
\item[\hspace{1mm} ignore\_iolog\_errors]{(bool) autorise à lancer des commandes même si sudoers ne peut écrire dans le fichier de log E/S}
\item[\hspace{1mm} ignore\_logfile\_errors]{(bool) autorise à lancer des commandes même si sudoers ne peut écrire dans le fichier de log}
\item[\hspace{1mm} ignore\_local\_sudoers]{(bool) Si définis via LDAP, ne parse pas /etc/sudoers}
\item[\hspace{1mm} ignore\_unknown\_defaults]{(bool) ne produit pas d'alerte si une entrée Defaut inconnue est rencontrée, ou une options sudoOptions dans LDAP.}
\item[\hspace{1mm} insults]{(bool) insulte les utilisateurs quand ils entrent un mot de passe incorrect}
\item[\hspace{1mm} log\_host]{(bool) Définis, le nom d'hôte est loggé}
\item[\hspace{1mm} log\_input]{(bool) Définis, log l'entrée utilisateur}
\item[\hspace{1mm} log\_output]{(bool) Définis, log la sortie envoyée à l'écran}
\item[\hspace{1mm} log\_year]{(bool) Définis, log l'année au format yyyy}
\item[\hspace{1mm} long\_otp\_prompt]{(bool) En validant un schéma OTP, un prompt à 2 lignes est utilisé pour simplifier le copier/coller du challenge.}
\item[\hspace{1mm} 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)}
\item[\hspace{1mm} mail\_always]{(bool) envoie un mail à chaque fois qu'un utilisateur lance sudo.}
\item[\hspace{1mm} mail\_badpass]{(bool) Envoie un mail en cas de mot de passe incorrect}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} mail\_no\_user]{(bool) Définis, envoie un mail si l'utilisateur invoquant n'est pas dans le fichier sudoers}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} netgroup\_tuple]{(bool) Définis, la recherche de netgroup est effectuée en utilisant les triplets netgroup}
\item[\hspace{1mm} noexec]{(bool) Définis, toutes les commande lancées via sudo fonctionne comme avec le tag NOEXEC}
\item[\hspace{1mm} pam\_session]{(bool) Créé une nouvelle session PAM pour la commande à lancer}
\item[\hspace{1mm} pam\_setcred]{(bool) tente d'obtenir les accréditifs de l'utilisateur cible}
\item[\hspace{1mm} 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é.}
\item[\hspace{1mm} path\_info]{(bool) informe quand la commande ne peut pas être trouvée dans le PATH.}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} pwfeedback]{(bool) Fournis un retour visuel en tapant un mot de passe}
\item[\hspace{1mm} requiretty]{(bool) définis, sudo n'est lancé que si l'utilisateur est loggé dans un vrai tty.}
\item[\hspace{1mm} root\_sudo]{(bool) Définis, root est autorisé à lancer sudo. Désactivé, empêche sudoedit}
\item[\hspace{1mm} rootpw]{(bool) Définis, sudo demande le mot de passe root au lieu du mot de passe de l'utilisateur invoquant}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} set\_home]{(bool) Définis et sudo invoqué avec -s, HOME est définis au home de l'utilisateur cible}
\item[\hspace{1mm} set\_logname]{(bool) Définis LOGNAME. Cependant pour certains programmes (incluant RCS) utilisent LOGNAME pour déterminer la vrai identité de l'utilisateur.}
\item[\hspace{1mm} set\_utmp]{(bool) Activé, sudo créé une entrée dans utmp ou utmpx quand un pseudo tty est alloué.}
\item[\hspace{1mm} setenv]{(bool) Autorise l'utilisateur à désactiver l'option env\_reset avec l'option -E}
\item[\hspace{1mm} shell\_noargs]{(bool) Définis et sudo est invoqué sans arguments, agit comme avec -s: lance un shell en root}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} sudoedit\_follow]{(bool) Suit les liens symboliques en ouvrant les fichiers.}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} tty\_tickets]{(bool) Définis, les utilisateurs doivent s'authentifier pour chaque tty}
\item[\hspace{1mm} umask\_override]{(bool) Définis, sudo définis le umask spécifié dans le fichier sudoers sans modification}
\item[\hspace{1mm} use\_netgroups]{(bool) Définis, les netgroups peuvent être utilisé à la place d'un utilisateur ou hôte}
\item[\hspace{1mm} use\_pty]{(bool) Définis, sudo lance la commande dans un pseudo-tty même si aucun plugin I/O n'est définis}
\item[\hspace{1mm} user\_command\_timeouts]{(bool) Définis, l'utilisateur peut spécifier un timeout sur la ligne de commande}
\item[\hspace{1mm} 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}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} command\_timeout]{(int) Délai maximum pour l'exécution d'une commande.}
\item[\hspace{1mm} maxseq]{(int) Numéro de séquence maximum qui est substitué pour l'échappement "\%\verb|{|seq\verb|}|" dans le fichier de log I/O.}
\item[\hspace{1mm} passwd\_tries]{(int) Nombre maximum de tentative pour entrer en mot de passe}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} loglinelen]{(int) Nombre de caractères par ligne de log. n'a pas d'effet pour syslog.}
\item[\hspace{1mm} timestamp\_timeout]{(int) Nombre de minutes avant de redemander un mot de passe.}
\item[\hspace{1mm} umask]{(int) umask pour la création des fichier}
\item[\hspace{1mm} badpass\_message]{(string) Message affiché si un utilisateur entre un mot de passe incorrect}
\item[\hspace{1mm} editor]{(string) Liste d'éditeurs autorisé pour visudo.}
\item[\hspace{1mm} 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:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} \%\{seq\}]{Étendu pour augmenter le numéro de séquence en base 36}
\item[\hspace{6mm} \%\{user\}]{Étendu au login de l'utilisateur invoquant}
\item[\hspace{6mm} \%\{group\}]{Étendu au GID réel de l'utilisateur invoquant}
\item[\hspace{6mm} \%\{runas\_user\}]{Étendu au login de l'utilisateur qui exécute la commande}
\item[\hspace{6mm} \%\{runas\_group\}]{Étendu au groupe qui exécute la commande}
\item[\hspace{6mm} \%\{hostname\}]{Étendu au nom de l'hôte local sans le nom de domaine}
\item[\hspace{6mm} \%\{command\}]{Étendu au nom de la commande lancée}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} 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}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} iolog\_group]{(string) Nom du groupe pour la créations des répertoires et fichiers de log I/O}
\item[\hspace{1mm} iolog\_mode]{(string) mode à utiliser pour créer les fichiers de log I/O}
\item[\hspace{1mm} iolog\_user]{(string) Propriétaire des répertoires et fichiers de log I/O}
\item[\hspace{1mm} lecture\_status\_dir]{(string) Répertoire dans lequel sudo stocke les fichiers de status par utilisateur. Défaut: /var/adm/sudo/lectured}
\item[\hspace{1mm} mailsub]{(string) Sujet du mail envoyé. \%h étend au nom d'hôte}
\item[\hspace{1mm} pam\_login\_service]{(string) Nom du service utilisé avec -i. Défaut: sudo}
\item[\hspace{1mm} pam\_service]{(string) Nom du service que PAM applique. Défaut: sudo}
\item[\hspace{1mm} passprompt]{(string) Prompt par défaut à utiliser en demandant le mot de passe. Les échappements suivants sont supportés:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} \%H]{Nom d'hôte local fqdn}
\item[\hspace{6mm} \%h]{Nom d'hôte local}
\item[\hspace{6mm} \%p]{utilisateur correspondant au mot de passe demandé}
\item[\hspace{6mm} \%U]{Nom de l'utilisateur cible}
\item[\hspace{6mm} \%u]{nom de l'utilisateur invoquant}
\item[\hspace{6mm} \%\%]{le caractère \%}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} role]{(string) Rôle SELinux par défaut à utiliser en construisant un nouveau contexte de sécurité pour lancer la commande.}
\item[\hspace{1mm} runas\_default]{(string) Utilisateur par défaut pour lancer les commande.}
\item[\hspace{1mm} sudoers\_locale]{(string) Locale à utiliser pour parser le fichier sudoers, les commandes de logging, et l'envoie de mail.}
\item[\hspace{1mm} timestampdir]{(string) Répertoire dans lequel sudo stocke ses fichiers d'horodatage.}
\item[\hspace{1mm} timestampowner]{(string) Propriétaire du répertoire de status de lecture, d'horodatage et tous les fichiers qui y sont stockés.}
\item[\hspace{1mm} type]{(string) Type SELinux par défaut pour construire un nouveau contexte SELinux}
\item[\hspace{1mm} env\_file]{(string) Spécifie le chemin complet d'un fichier contenant les variables d'environnement à définir pour le programme à lancer.}
\item[\hspace{1mm} exempt\_group]{(string) Les utilisateurs dans ce groupe sont exemptés du mot de path et des exigences PATH.}
\item[\hspace{1mm} 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é.}
\item[\hspace{1mm} group\_plugin]{(string) plugin group sudoers avec des arguments optionnels.}
\item[\hspace{1mm} lecture]{(string) Contrôle quand une lecture courte est affichée avec le prompt. always|never|once.}
\item[\hspace{1mm} lecture\_file]{(string) Fichier contenant le message à afficher au lieu du message embarqué}
\item[\hspace{1mm} listpw]{(string) Contrôle quand un mot de passe est requis quand un utilisateur lance sudo -l:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} 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}
\item[\hspace{6mm} always]{L'utilisateur doit entrer un mot de passe pour utiliser -l}
\item[\hspace{6mm} any]{Au moins une entrée de l'utilisateur dans sudoers doit avoir le flag NOPASSWD pour ne pas entrer de mot de passe}
\item[\hspace{6mm} never]{L'utilisateur ne doit jamais entrer un mot de passe pour utiliser l'option -l}
\item[\hspace{6mm} ]{}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} logfile]{(string) Chemin du fichier de log sudo.}
\item[\hspace{1mm} mailerflags]{(string) flags à utiliser en invoquant mailer Défaut: -t}
\item[\hspace{1mm} mailerpath]{(string) Chemin du programme pour envoyer les mails.}
\item[\hspace{1mm} mailfrom]{(string) Adresse du champ From}
\item[\hspace{1mm} mailto]{(string) Adresse de destination de mail}
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} secure\_path]{(string) Chemin de toutes les commandes lancées par sudo}
\item[\hspace{1mm} syslog]{(string) facilité syslog pour les logs}
\item[\hspace{1mm} syslog\_badpri]{(string) Priorité sysloge quand l'utilisateur n'est pas autorisé à lancer une commande ou en cas d'echec de l'authentification}
\item[\hspace{1mm} syslog\_goodpri]{(string) Priorité syslog à utiliser quand l'utilisateur est autorisé à lancer une commande et que l'authentification a réussie.}
\item[\hspace{1mm} verifypw]{(string) Contrôle quand un mot de passe est requis avec sudo -v:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} all]{Toutes les entrées dans le fichiers sudoers doivent avoir NOPASSWD pour éviter d'entrer un mot de passe.}
\item[\hspace{6mm} always]{L'utilisateur doit toujours entrer sont mot de passe pour utiliser l'option -v}
\item[\hspace{6mm} 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}
\item[\hspace{6mm} never]{L'utilisateur n'a jamais besoin d'entrer un mot de passe}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} 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 '/'}
\item[\hspace{1mm} env\_delete]{(string) Variables d'environnement à supprimer de l'environnement de l'utilisateur quand env\_reset n'est pas effectif.}
\item[\hspace{1mm} env\_keep]{(string) Variables d'environnements à préserver de l'environnement de l'utilisateur quand env\_reset est effectif}
\end{description}
 
\vspace{1cm}{\huge Plugins group }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  Les plugins group sont spécifiés via le paramètres group\_plugin. Les plugins group suivants sont installés par défaut:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} 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}
\item[\hspace{1mm} 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}
\end{description}
 
\vspace{1cm}{\huge Format de log }
 
\
 
\hspace{1mm}  sudoers peut logger des évènements en utilisant syslog(3) ou un simple fichier. Le format est pratiquement identique dans les 2 cas.
\vspace{5mm} \\
 
 
\hspace{1mm} Les commandes que sudo lance sont loggés en utilisant le format suivant:
 
{\ttfamily
date hostname progname: username : TTY=ttyname ; PWD=cwd ; USER=runasuser ; GROUP=runasgroup ; TSID=logid ; ENV=env\_vars COMMAND=command\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{6mm} 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}
\item[\hspace{6mm} hostname]{Le nom de l'hôte où sudo a été lancé. Seulement présent via syslog}
\item[\hspace{6mm} progname]{Le nom du programme, généralement sudo ou sudoedit. Seulement présent via syslog}
\item[\hspace{6mm} username]{Nom de login de l'utilisateur invoquant}
\item[\hspace{6mm} ttyname]{Nom court du terminal}
\item[\hspace{6mm} cwd]{Répertoire de travail courant}
\item[\hspace{6mm} runasuser]{Utilisateur sous lequel la commande est lancée}
\item[\hspace{6mm} runasgroup]{Groupe sous lequel la commande est lancée}
\item[\hspace{6mm} logid]{Identifiant de log I/O qui peut être utilisé pour rejouer la sortie des commande (log\_input ou log\_output doit être activé)}
\item[\hspace{6mm} env\_vars]{variables d'environneent spécifiés sur la ligne de commande.}
\item[\hspace{6mm} command]{La commande exécutée}
\end{description}
 
\vspace{1cm}{\huge Entrées de log des commandes refusées }
 
\
 
\hspace{1mm}  Si l'utilisateur n'est pas autorisé à lancer la commande, la raison du refus suit le nom de l'utilisateur. Les raisons possibles sont:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} user NOT insudoers]{L'utilisateur n'est pas listé dans le fichie sudoers}
\item[\hspace{6mm} 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}
\item[\hspace{6mm} command not allowed]{L'utilisateur est listé dans le fichier sudoers mais n'est pas autorisé à lancer la commande spécifiée}
\item[\hspace{6mm} 3 incorrect password attemps]{L'utilisateur a échoué "passwd\_trie" fois}
\item[\hspace{6mm} a password is required]{sudo -n a été spécifié, mais un mot de passe est requis}
\item[\hspace{6mm} 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}
\end{description}
 
\vspace{1cm}{\huge Entrées de log d'erreur }
 
\
 
\hspace{1mm}  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:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} parse error in /etc/sudoers near line N]{Erreur dans la configuration}
\item[\hspace{6mm} problem with defaults entries]{Options Defaults inconnus. N'empêche pas sudo de fonctionner}
\item[\hspace{6mm} timestamp owner (username): No such user]{l'utilisateur spécifié dans timestampowner n'a pas été trouvé dans la base de compte}
\item[\hspace{6mm} unable to open/read /etc/sudoers]{le fichier sudoers n'est pas accessible}
\item[\hspace{6mm} unable to open/read /etc/sudoers]{Le fichier /etc/sudoers n'existe pas}
\item[\hspace{6mm} /etc/sudoers is not a regular file]{Le fichier existe mais n'est pas un fichier régulier ou un lien symbolique}
\item[\hspace{6mm} /etc/sudoers is owned by uid N, should be 0]{Le fichier n'est pas possédé par root}
\item[\hspace{6mm} /etc/sudoers is world writable]{Le fichier est accessible en écriture par tout le monde. Normalement il devrait être 0440}
\item[\hspace{6mm} /etc/sudoers is owned by gid N, should be 1]{le fichier n'a pas le bon groupe.}
\item[\hspace{6mm} 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}
\item[\hspace{6mm} unable to write to /var/run/sudo/ts/username]{sudoers n'arrive pas à écrire dans le fichier d'horodatage de l'utilisateur}
\item[\hspace{6mm} /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.}
\item[\hspace{6mm} /var/run/sudo/ts is group writable]{Le répertoire ts est accéssible en écriture par le groupe. Doit être 0700}
\end{description}
 
\vspace{1cm}{\huge Notes sur syslog }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Notes sur le fichier de log }
 
\
 
\hspace{1mm}  Si logfile est activé, sudoers log dans un fichier local. sudoers utilise un format similaire à syslog, avec quelques différences importantes:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} -]{progname et hostname ne sont pas présents}
\item[\hspace{6mm} -]{si log\_year est activé, l'année est incluse}
\item[\hspace{6mm} -]{Les lignes plus longue que loglinelen sont coupées et continées sur la ligne suivantes}
\end{description}
 
\vspace{1cm}{\huge Fichier de log d'E/S }
 
\
 
\hspace{1mm}  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:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} 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.}
\item[\hspace{6mm} timing]{Un log de la quantité de temps, et le nombre d'octets, entre chaque entrées de log I/O.}
\item[\hspace{6mm} ttyin]{Entrée depuis le tty de l'utilisateur}
\item[\hspace{6mm} stdin]{Entrée depuis un pipe ou un fichier}
\item[\hspace{6mm} ttyout]{Sortie du pseudo-tty}
\item[\hspace{6mm} stdout]{Sortie standard dans un pipe ou redirigé dans un fichier}
\item[\hspace{6mm} stderr]{Erreur standard vers un pipe ou redirigé dans un fichier}
\end{description}
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Fichiers }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} /etc/sudo.conf]{Fichier de configuration de sudo}
\item[\hspace{1mm} /etc/sudoers]{Fichier de stratégie de sudoers}
\item[\hspace{1mm} /etc/group]{Fichier de groupes locaux}
\item[\hspace{1mm} /etc/netgroup]{Liste des netgroups}
\item[\hspace{1mm} /var/log/sudo-io]{Fichiers de log d'E/S}
\item[\hspace{1mm} /var/run/sudo/ts]{Répertoire contenant les timestamps pour la stratégie de sécurité sudoers}
\item[\hspace{1mm} /var/adm/sudo/lectured]{Répertoire contenant les fichiers de status de lecture pour la stratégie de sécurité sudoers}
\item[\hspace{1mm} /etc/environment]{Environnement initial pour les système sans PAM}
\end{description}
 
\vspace{1cm}{\huge Notes de sécurité }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{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.}
\item[\hspace{1mm} -]{fast\_glob ne permet pas d'utiliser '!' correctement quand le chemin inclus du globbing.}
\end{description}
 
\vspace{1cm}{\huge Empêcher les échappements du shell }
 
\
 
\hspace{1mm}  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:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} 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.}
\item[\hspace{1mm} 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.}
\end{description}
 
\vspace{1cm}{\huge Édition sécurisée }
 
\
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm}  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).
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Vérification du fichier timestamp }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Debuggage }
 
\
 
\hspace{1mm}  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
\vspace{5mm} \\
 
 
\hspace{1mm}  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:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} alias]{traitements User\_Alias, Runas\_Alias, Host\_Alias et Cmnd\_Alias}
\item[\hspace{1mm} all]{Match tous les sous-systèmes}
\item[\hspace{1mm} audit]{Code d'audite Linux}
\item[\hspace{1mm} auth]{Authentification utilisateur}
\item[\hspace{1mm} defaults]{Paramètres Defaults}
\item[\hspace{1mm} env]{Gestion de l'environnement}
\item[\hspace{1mm} ldap]{sudoers basé sur LDAP}
\item[\hspace{1mm} logging]{Support du logging}
\item[\hspace{1mm} match]{Match des utilisateurs, groupes, hôtes et netgroups dans le fichier sudoers}
\item[\hspace{1mm} netif]{Gestion des interfaces réseaux}
\item[\hspace{1mm} nss]{Gestion nss dans sudoers}
\item[\hspace{1mm} parser]{Parsing de fichier sudoers}
\item[\hspace{1mm} perms]{Définition des permissions}
\item[\hspace{1mm} plugin]{Équivalent de main pour le plugin}
\item[\hspace{1mm} pty]{Code lié au pseudo-tty}
\item[\hspace{1mm} rbtree]{redblack tree interne}
\item[\hspace{1mm} sssd]{Sudoers basé sur sssd}
\item[\hspace{1mm} util]{Fonctions utilitaires}
\end{description}
\end{flushleft}
\end{document}
