\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:06 CEST 2017}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={sudo},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Exécute une commande sous un autre utilisateur},
CreationDate={D:20170703100806},
ModDate={D:20170703100806},
Keywords={sudo;rbac;security}
}}
\begin{document}
 
\begin{center}
{\Huge sudo, sudoedit }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Exécute une commande sous un autre utilisateur}
 
\vspace{10mm}
 
\hspace{1mm}  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é
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge OPTIONS }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} -A, --askpass]{Normalement, si sudo exige un mot de passe, il le lis depuis le teminal de l'utilisateur. -A lance un helper}
\item[\hspace{1mm} -b, --background]{Dans la commande en tâche de fond}
\item[\hspace{1mm} -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}
\item[\hspace{1mm} -E, --preserve-env]{Indique à la stratégie de sécurité que l'utilisateur souhaite préserver ses variables d'environnement.}
\item[\hspace{1mm} -e, --edit]{Édite un ou plusieurs fichiers}
\item[\hspace{1mm} -g group, --group=group]{Lance la commande avec le groupe primaire spécifié au lieu du groupe primaire de l'utilisateur cible}
\item[\hspace{1mm} -H, --set-home]{Demande que la stratégie définisse la variable HOME au répertoire spécifié par l'utilisateur cible}
\item[\hspace{1mm} -h, --host=host]{Lance la commande sur l'ĥôte spécifié si le plugin de startégie de sécurité supporte les commandes distantes.}
\item[\hspace{1mm} -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é}
\item[\hspace{1mm} -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.}
\item[\hspace{1mm} -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}
\item[\hspace{1mm} -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.}
\item[\hspace{1mm} -n, --non-interactive]{Empêche l'utilisateur d'entrer quoi que ce soit.}
\item[\hspace{1mm} -P, --preserve-groups]{Préserve le groupe de l'utilisateur invoquant}
\item[\hspace{1mm} -p, --prompt=prompt]{Utilise un prompt de mot de passe personnalisé:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} \%H]{Étend le nom d'hôte incluant le nom de domaine}
\item[\hspace{6mm} \%h]{Étend un nom d'hôte local sans le domaine}
\item[\hspace{6mm} \%p]{Étend le nom de l'utilisateur dont le mot de passe est demandé}
\item[\hspace{6mm} \%U]{Étend le nom de login de l'utilisateur cible}
\item[\hspace{6mm} \%u]{Étend le nom de login de l'utilisateur invoquant}
\item[\hspace{6mm} \%\%]{le caractère '\%'}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} -r, --role=role]{Lance la commande avec le contexte SELinux qui inclus le rôle spécifié}
\item[\hspace{1mm} -S, --stdin]{Écrit le prompt sur stderr et lit le mot d-e passe depuis stdin au lieu du terminal}
\item[\hspace{1mm} -s, --shell]{Lance le shell spécifié par la variable d'environnement SHELL si définie, ou le shell de l'utilisateur invoquant}
\item[\hspace{1mm} -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}
\item[\hspace{1mm} -U, --other-user=user]{avec -l, liste les privilèges de l'utilisateur}
\item[\hspace{1mm} -T, --command-timeout=timeout]{Définis un timeout pour la commande}
\item[\hspace{1mm} -u, --user=user]{Lance la commande sous cet utilisateur}
\item[\hspace{1mm} -v, --validate]{Met à jours les accréditifs en cache de l'utilisateur}
\item[\hspace{1mm} --]{Indique la fin des arguments}
\item[\hspace{1mm} ]{}
\end{description}
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Exécution de commande }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
\hspace{1mm}  Les paramètres suivants peuvent être spécifiés par la stratégie de sécurité:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{6mm} UID effectif et réel]{}
\item[\hspace{6mm} GID effectif et réel]{}
\item[\hspace{6mm} GID supplémentaires]{}
\item[\hspace{6mm} La liste d'environnement]{}
\item[\hspace{6mm} Répertoire de travail courant]{}
\item[\hspace{6mm} Masque de création de fichier]{}
\item[\hspace{6mm} Role et type SELinux]{}
\item[\hspace{6mm} Priorité (nice)]{}
\end{description}
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Gestion des signaux }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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().
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Plugins }
 
\
 
\hspace{1mm}  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
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Valeur de sortie }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Notes de sécurité }
 
\
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  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é.
\vspace{5mm} \\
 
 
\hspace{1mm}  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.
\vspace{5mm} \\
 
 
\hspace{1mm}  Pour éviter la fuite d'information potentiellement sensible, sudo désactive les coredumps par défaut durant l'exécution.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Variables d'environnement }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} EDITOR]{Nom de l'éditeur par défaut pour -e (sudoedit), si SUDO\_EDITOR ou VISUAL ne sont pas définis}
\item[\hspace{1mm} MAIL]{Emplacement de la boite mail de l'utilisateur}
\item[\hspace{1mm} HOME]{Répertoire personnel de l'utilisateur}
\item[\hspace{1mm} LOGNAME]{Nom de l'utilisateur}
\item[\hspace{1mm} PATH]{Les chemins de recherche pour les commandes}
\item[\hspace{1mm} SHELL]{Shell courant de l'utilisateur}
\item[\hspace{1mm} SUDO\_ASKPASS]{Spécifie le chemin du helper pour lire le mot de passe si aucun terminal n'est disponible ou avec -A}
\item[\hspace{1mm} SUDO\_EDITOR]{Éditeur par défaut pour -e (sudoedit)}
\item[\hspace{1mm} SUDO\_GID]{GID de l'utilisateur qui a invoqué sudo}
\item[\hspace{1mm} SUDO\_PROMPT]{prompt pour les mots de passe}
\item[\hspace{1mm} SUDO\_PS1]{valeur PS1 pour le programme à exécuter}
\item[\hspace{1mm} SUDO\_UID]{UID de l'utilisateur qui a invoqué sudo}
\item[\hspace{1mm} SUDO\_USER]{nom de login de l'utilisateur qui a invoqué sudo}
\item[\hspace{1mm} USER]{nom de l'utilisateur}
\item[\hspace{1mm} USERNAME]{idem à USER}
\item[\hspace{1mm} VISUAL]{Éditeur par défaut pour -e (sudoedit) si SUDO\_EDITOR n'est pas définis}
\end{description}
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} obtenir une liste des répertoire non-lisible: \\
\hspace{1mm} \textbf{sudo ls /usr/local/protected} \\
\hspace{1mm} Liste le répertoire personnel de l'utilisateur yaz dans une machine où le système de fichier maintenant \textasciitilde yaz n'est pas exporté en root \\
\hspace{1mm} \textbf{sudo -u yaz ls \textasciitilde yaz} \\
\hspace{1mm} Éditer index.html en tant qu'utilisateur www \\
\hspace{1mm} \textbf{sudoedit -u www \textasciitilde www/htdocs/index.html} \\
\hspace{1mm} Voir les logs système uniquement accessibles par root \\
\hspace{1mm} \textbf{sudo -g adm more /var/log/syslog} \\
\hspace{1mm} Lancer un éditeur en tant que jim avec un groupe primaire différent \\
\hspace{1mm} \textbf{sudoedit -u jim -g audio \textasciitilde jim/sound.txt} \\
\hspace{1mm} Éteindre la machine \\
\hspace{1mm} \textbf{sudo shutdown -r +15 "quick reboot"} \\
\end{flushleft}
\end{document}
