Le fichier /etc/sudoers

Un système Linux est configuré avec un compte root possédant tous les droits sur le système et généralement un compte utilisateur membre du groupe sudo, dont le nom est défini à l’installation.

Le fichier /etc/sudoers sert à déléguer des droits pour exécuter certaines actions sur la machine.

Attention aux modifications car il est possible en cas d’erreur de perdre les accès administrateur de la machine.

Editeur de texte recommandé

Il est fortement recommandé d’utiliser l’éditeur de texte visudo pour modifier le fichier /etc/sudoers car il le verouille lorsqu’un utilisateur s’en sert (pour éviter les modifications à plusieurs) et vérifie sa syntaxe.

Fichier /etc/sudoers

Note : La modification peut directement se faire dans /etc/sudoers mais dans beaucoup de distribution l’utilisation de /etc/sudoers.d/ est préférable.

Fichier /etc/sudoers de base (sur une debian 11.2 (bullseye))

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

Ce fichier se compose de 2 sections : “Default” et “User privilege”

Section Default

Toutes les lignes de la section “Default” débutent par Defaults

La configuration de base est :

  • Defaults env_reset
    • Réinitialise l’environnement du terminal pour supprimer les variables utilisateur pouvant être potentiellement dangereuses
  • Defaults mail_badpass
    • Le système envoie par mail les tentatives échouée de connexion en sudo à root (configurer le mailto pour changer de destinataire)
  • Defaults secure_path
    • Emplacements du système de fichiers pour exécuter les commande sudo (pour ne pas prendre les binaires utilisateurs)

Il existe d’autres directives, dont la plus célèbre est de se faire insulter par le terminal en cas d’erreur de mot de passe : https://www.geeksforgeeks.org/when-sudo-insults-you/

Section User Privilege

Cette section sert à déclarer les accès aux commandes pour un utilisateur ou groupe.

Dans le fichier de base nous avons :

root    ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL

En d’autres termes root et %sudo (désigne le groupe sudo) ont accès à toutes les commandes du système.

Syntaxe

La syntaxe du fichier pour la section User Privilege est :

Utilisateur/%groupe hôte=(utilisateur:groupe) /chemin/commande

Dans ces deux exemples :

root    ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL

L’utilisateur root et le groupe %sudo sont configurés comme tel :

  • hôte → ALL : la règle s’applique à tous les hôtes
  • utilisateur → ALL : le ou les utilisateur(s) dont on prend les droits
  • %groupe → ALL : le ou les groupe(s) dont on prend les droits
  • commande → ALL : le ou les commande(s) que utilisateur ou %groupe peut exécuter

Pour configurer (pour le groupe ou l’utilisateur en question) plusieurs utilisateurs, groupes ou commandes, etc. la séparation se fait avec une virgule :

user    ALL=(user1, user2, user3 : groupe5, groupe6) /chemin/commande1, /chemin/commande42

Configurer le fichier /etc/sudoers

Dossier /etc/sudoers.d

Le dossier /etc/sudoers.d sert à stocker les fichiers de configuration qui seront ensuite lu par /etc/sudoers. Pour créer une nouvelle règle, il suffit de créer un fichier dans le répertoire.

# visudo /etc/sudoers.d/ADMINS

Alias

Il est possible de créer des alias de d’hôtes, d’utilisateurs ou de commandes

# Création de groupes d'utilisateurs
User_Alias ADMINS = geralt, yennefer, zoltan
User_Alias JUNIORS = jaskier, ciri, ablette

# Création de groupes de subnets
Host_Alias SANDBOX = 192.168.1.1/255.255.255.0
Host_Alias SUBNET = 10.1.2.0/255.255.255.0, 10.1.6.0/255.255.255.0

# Création de groupes de commandes
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias UPDATE = /usr/bin/apt-get

Exemple : On autorise au groupe JUNIOR d’utiliser la commande apt-get et on précise que kevin doit uniquement utiliser la commande update sur le sandbox mais vanessa peut l’utiliser de partout :

JUNIORS ALL = UPDATE
kevin SANDBOX = /usr/bin/apt-get update
vanessa = /usr/bin/apt-get update

No Password

On peut autoriser des utilisateurs à utiliser des commande sans demande de mot de passe grâce à NOPASSWD :

apache ALL=(ALL) NOPASSWD: /usr/sbin/apachectl

Exclusion avec ‘!’

Spécifier ‘!’ permet d’exclure une commande, ici l’utilisatrice yennefer peut modifier les mots de passe des autres sauf pour root.

yennefer ALL=(ALL) /usr/bin/passwd, !/usr/bin/passwd root

Délai d’expiration

Pour modifier le temps d’expiration du mot de passe pour la commande sudo (en minute):

Defaults      timestamp_timeout=5

Exemple de fichier

Exemple de fichier

#
# Sample /etc/sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.

##
# Override built-in defaults
##
Defaults syslog=auth,runcwd=~
Defaults>root !set_logname
Defaults:FULLTIMERS !lecture,runchroot=*
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
Defaults!PAGERS noexec

##
# User alias specification
##
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBADMIN = will, wendy, wim

##
# Runas alias specification
##
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase

##
# Host alias specification
##
Host_Alias SPARC = bigtime, eclipse, moet, anchor:\
SGI = grolsch, dandelion, black:\
ALPHA = widget, thalamus, foobar:\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = primary, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules

##
# Cmnd alias specification
##
Cmnd_Alias DUMPS = /usr/sbin/dump, /usr/sbin/rdump, /usr/sbin/restore, \
/usr/sbin/rrestore, /usr/bin/mt, \
sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \
/home/operator/bin/start_backups
Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/top
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/sbin/reboot
Cmnd_Alias SHELLS = /sbin/sh, /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias VIPW = /usr/sbin/vipw, /usr/bin/passwd, /usr/bin/chsh, \
/usr/bin/chfn
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less

##
# User specification
##

# root and users in group wheel can run anything on any machine as any user
root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL

# full time sysadmins can run anything on any machine without a password
FULLTIMERS ALL = NOPASSWD: ALL

# part time sysadmins may run anything but need a password
PARTTIMERS ALL = ALL

# jack may run anything on machines in CSNETS
jack CSNETS = ALL

# lisa may run any command on any host in CUNETS (a class B network)
lisa CUNETS = ALL

# operator may run maintenance commands and anything in /usr/oper/bin/
operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\
sudoedit /etc/printcap, /usr/oper/bin/

# joe may su only to operator
joe ALL = /usr/bin/su operator

# pete may change passwords for anyone but root on the hp snakes
pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd *root*

# bob may run anything on the sparc and sgi machines as any user
# listed in the Runas_Alias "OP" (ie: root and operator)
bob SPARC = (OP) ALL : SGI = (OP) ALL

# jim may run anything on machines in the biglab netgroup
jim +biglab = ALL

# users in the secretaries netgroup need to help manage the printers
# as well as add and remove users
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser

# fred can run commands as oracle or sybase without a password
fred ALL = (DB) NOPASSWD: ALL

# on the alphas, john may su to anyone but root and flags are not allowed
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

# jen can run anything on all machines except the ones
# in the "SERVERS" Host_Alias
jen ALL, !SERVERS = ALL

# jill can run any commands in the directory /usr/bin/, except for
# those in the SU and SHELLS aliases.
jill SERVERS = /usr/bin/, !SU, !SHELLS

# steve can run any command in the directory /usr/local/op_commands/
# as user operator.
steve CSNETS = (operator) /usr/local/op_commands/

# matt needs to be able to kill things on his workstation when
# they get hung.
matt valkyrie = KILL

# users in the WEBADMIN User_Alias (will, wendy, and wim)
# may run any command as user www (which owns the web pages)
# or simply su to www.
WEBADMIN www = (www) ALL, (root) /usr/bin/su www

# anyone can mount/unmount a cd-rom on the machines in the CDROM alias
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

Documentation

Manuel sudoers
https://fossies.org/linux/sudo/examples/sudoers
https://www.malekal.com/sudo-comment-utiliser-configurer-sudoers-linux/
https://www.softpanorama.org/Access_control/Sudo/sudoer_file_examples.shtml
https://www.it-connect.fr/commande-sudo-comment-configurer-sudoers-sous-linux/
https://www.security-helpzone.com/2019/09/21/linux-ajouter-un-utilisateur-dans-le-fichier-sudoers/
https://www.computerhope.com/unix/visudo.htm
https://www.geeksforgeeks.org/when-sudo-insults-you/
https://www.real-world-systems.com/docs/sudoers.5.html
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file

https://xkcd.com/149/

> Partager <