sudo, "super user, do", est un outil portable sous GNU/Linux, macOS, *BSD permettant l'élévation de privilèges. Cet article a pour but de durcir sa configuration - le fichier sudoers - afin d'éviter des attaques dûes à une faible configuration







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.






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.


./files/sudo/sudo-tty_tickets-01.png

./files/sudo/sudo-tty_tickets-02.png


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


 
Mots clés :  
  security 
  
  sudo 
    >   Articles connexes :

/tmp et /var/log en noexec sur macOS

/tmp et /var/log en noexec sur macOS



Durcissement de Windows

Durcissement de Windows


3600343