0x01. DROITS
Pas compliqué, le fichier doit appartenir à 0:0, sous macOS/*BSD : root:wheel, sous GNU/Linux : root:root.
admin@workstation:~$ ls -l /etc/sudoers -r--r----- 1 root wheel 7645 Sep 19 17:03 /etc/sudoers
Il est cependant possible de protéger ce fichier un peu plus, de sorte à compliquer (même si ce n'est qu'un peu) une élévation de privilèges.
Sous GNU/Linux, il est possible d'utiliser les attributs de fichiers, afin de rendre impossible le changement d'un fichier. Le flag +i permet de rendre immutable - inchangeable le contenu du fichier.
root@gnu_linux:/# chattr +i /etc/sudoers root@gnu_linux:/# lsattr /etc/sudoers ----i-------------- /etc/sudoers
Sous MacOSX*, on parlera de flags, de "drapeaux" permettant d'attribuer des droits étendus. Pour le même résultat que ci-dessus, le flag "schg" nous sera utile.
* : je préfère utiliser MacOS X, car MacOS était un OS littéralement différent de MacOS X de part son noyau et son époque - de plus le X me rappelle le côté UNIX (BSD en réalité) de macOS.
root@macosx:/# chflags schg /etc/sudoers root@macosx:/# /bin/ls -lO /etc/sudoers -r--r----- 1 root wheel schg 7645 Sep 19 17:03 /etc/sudoers
Pour ce qui est du programme en lui même, sudo, /usr/bin/sudo il est recommandé, de n'autoriser que les membres du administrateur :
root@gnu_linux# chmod 4510 /usr/bin/sudo root@gnu_linux# chown root:sudo /usr/bin/sudo root@gnu_linux# ls -l /usr/bin/sudo -r-s--x--- 1 root sudo 149080 Sep 7 17:42 /usr/bin/sudo
Pour durcir les droits de ce fichier sous macOS, il n'est pas possible de le faire en temps normal... il faut désactiver le module de sécurité intégré SIP. Mais changer ses droits, ne sera que temporaire, car dès la prochaine mise à jour, il se peut qu'une réparation de droits remettent sudo à ses droits "d'usines".
Il vaut mieux, pour cela, configurer le fichier sudoers.
0x02. /etc/sudoers
Voici une configuration "durcie", elle sera très largement commentée.
Groupes désignant un outil ou une liste d'outils pouvant être associé à une options
Seules ces applications graphiques, seront autorisés à être exécutée avec sudo sans forcément
passer par le terminal
Cmnd_Alias PROCESSES_GUI = /usr/bin/wireshark,/usr/bin/ettercap
La variable secure_path, désigne les commandes qui peuvent être appelée directement via leur nom, sans avoir à rappeler leur chemin absolu :
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# OK sudo top
# Si, httpd est dans /opt/lampp/sbin # Et que PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/lampp/bin:/opt/lampp/sbin sudo httpd ne reconnaitra pas httpd car /opt/lampp/sbin n'est pas dans le secure_apth
Ici, une liste de variables d'environnement pouvant être supprimé (env_delete) lors
de l'élévation de privilèges ou conservée (env_keep)
Defaults env_reset Defaults env_keep += "BLOCKSIZE" Defaults env_keep += "COLORFGBG COLORTERM" Defaults env_keep += "__CF_USER_TEXT_ENCODING" Defaults env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE" Defaults env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME" Defaults env_keep += "LINES COLUMNS" Defaults env_keep += "LSCOLORS" Defaults env_keep += "SSH_AUTH_SOCK" Defaults env_keep += "TZ" Defaults env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY" Defaults env_keep += "EDITOR VISUAL" Defaults env_keep += "HOME MAIL" Defaults env_keep += "NOLOG_OUTPUT" Defaults env_keep += "NOLOG_INPUT" ## Developer's recommandation Defaults env_delete += "BASH_FUNC" Defaults env_delete += "RUBYOPT" Defaults env_delete += "RUBYLIB" Defaults env_delete += "PYTHONUSERBASE" Defaults env_delete += "PYTHONINSPECT" Defaults env_delete += "PYTHONPATH" Defaults env_delete += "PYTHONHOME" Defaults env_delete += "TMPPREFIX" Defaults env_delete += "ZDOTDIR" Defaults env_delete += "READNULLCMD" Defaults env_delete += "NULLCMD" Defaults env_delete += "FPATH" Defaults env_delete += "PERL5DB" Defaults env_delete += "PERL5OPT" Defaults env_delete += "PERL5LIB" Defaults env_delete += "PERLLIB" Defaults env_delete += "PERLIO_DEBUG" Defaults env_delete += "JAVA_TOOL_OPTIONS" Defaults env_delete += "SHELLOPTS" Defaults env_delete += "GLOBIGNORE" Defaults env_delete += "PS4" Defaults env_delete += "BASH_ENV" Defaults env_delete += "ENV" Defaults env_delete += "TERMCAP" Defaults env_delete += "TERMPATH" Defaults env_delete += "TERMINFO_DIRS" Defaults env_delete += "TERMINFO" Defaults env_delete += "DYLD_LIBRARY_PATH" Defaults env_delete += "LD_PRELOAD" Defaults env_delete += "PATH_LOCALE" Defaults env_delete += "NLSPATH" Defaults env_delete += "HOSTALIASES" Defaults env_delete += "RES_OPTIONS" Defaults env_delete += "LOCALDOMAIN" Defaults env_delete += "CDPATH" Defaults env_delete += "IFS" # Préchargement de modules MacOSX Defaults env_delete += "DYLD_PRINT_TO_FILE" Defaults env_delete += "DYLD_INSERT_LIBRARIES" # Préchargement de modules GNU/Linux Defaults env_delete += "LD_PRELOAD"
Demande de mot de passe root. Si le compte est désactivé, il reste possible de lui attribué
un mot de passe. Ainsi, il est possible de distinguer un administrateur de serveur d'un
super utilistauer. Si l'administrateur a des accès privilégiés pour par exemple exécuter
iptables, systemctl ou kill, (via NOPASSWD) il peut lui être interdit d'obtenir un shell
en tant que root.
Defaults rootpw
Bloque l'exécution de sudo, dans une application, un script ou via un tunnel (ssh, ...)
Defaults requiretty
Autorise la liste des programmes associés à PROCESSES_GUI à ne pas utiliser de terminal (tty)
Defaults!PROCESSES_GUI !requiretty
Les tickets sudo, ne sont pas partagés entre les différents terminaux. Activé par défaut en standard.
Mais vaut mieux activer l'option, dès fois que ça ne soit pas le cas.


Defaults tty_tickets # Désactivé: # Defaults !tty_tickets
Défini un temps maximal pour saisir le mot de passe
Defaults passwd_timeout=1
Sortir dès 2 échecs
Defaults passwd_tries=2
Ne pas garder la session sudo ouverte : définir le nombre de minute avant la fin de session sudo à 0 seconde
Defaults timestamp_timeout=0
## SOS mode
## Every user should be able to get superuser rights in order to repair systeme
# ALL ALL=(ALL) NOPASSWD: ALL
Si plusieurs comptes administrateurs sont nécessaires, sinon vaut mieux désactiver et ne laisser que le compte ayant besoin d'un accès admin
## Si plusieurs comptes administrateurs : %admin ALL=(ALL) ALL ## Sinon ne mettre que le compte ayant les droits : # %admin ALL=(ALL) ALL administrateur ALL=(ALL) ALL
N'autoriser qu'un seul shell pour l'administration
administrateur@workstation:~$ sudo -s [sudo] password for administrateur: Sorry, user administrateur is not allowed to execute '/bin/bash' as root on workstation. administrateur@workstation:~$ sudo /var/private/adminsh [sudo] password for administrateur: administrateur@workstation:~# whoami root
Pour les administrateur n'ayant pas accès au compte root, donner les droits au script afin qu'ils puissent exécuter leurs scripts ou les programmes dont ils ont besoin avec des privilèges élevés
Cmnd_Alias NET_TOOLS = /usr/bin/tshark,/usr/sbin/tcpdump,/usr/local/bin/nmap,/usr/bin/ngrep,/usr/local/bin/ncat,/bin/netstat,/usr/bin/lsof Cmnd_Alias SVC_TOOLS = /bin/systemctl,/usr/sbin/service,/bin/journalctl,/bin/kill,/usr/bin/lsof %admin_reseau ALL=(ALL) PASSWD: NET_TOOLS %admin_systeme ALL=(ALL) PASSWD: SVC_TOOLS %admin_root ALL=(ALL) ALL
=> Écrit par : Nicolas, le 19 septembre 2017