Tutorial

Comment modifier le fichier Sudoers

Linux BasicsUbuntuCentOSSecurity

Introduction

La séparation de privilèges est l'un des paradigmes fondamentaux de la sécurité intégrée dans les systèmes d'exploitation de type Linux et Unix. Les utilisateurs réguliers utilisent des privilèges limités afin de réduire la portée de leur influence à leur propre environnement et non pas au système d'exploitation plus large.

Un utilisateur spécial, appelé root, dispose de privilèges de super-utilisateur. Il s'agit d'un compte administratif qui n'intègre pas les restrictions auxquelles sont soumis les utilisateurs normaux. Les utilisateurs peuvent exécuter des commandes avec des privilèges de super-utilisateur ou root de plusieurs manières différentes.

Tout au long de cet article, nous allons voir comment obtenir des privilèges root correctement et en toute sécurité, en mettant tout particulièrement l'accent sur la modification du fichier /etc/sudoers.

Nous procéderons à ces étapes sur un serveur Ubuntu 20.04. Cependant, notez que la plupart des distributions Linux modernes comme Debian et CentOS devraient fonctionner de manière similaire.

Ce guide suppose que vous avez déjà procédé à la configuration initiale du serveur mentionnée ici. Connectez-vous à votre serveur en tant que non-root user et continuez de la manière indiquée ci-dessous.

Remarque : ce tutoriel traite de l'escalade des privilèges et du fichier sudoer plus en détails. Pour ajouter des privilèges sudo à un utilisateur, consultez nos tutoriels de démarrage rapide Comment créer un nouvel utilisateur actif Sudo pour Ubuntu et CentOS.

Comment obtenir des privilèges root

Vous disposez de trois méthodes de base pour obtenir des privilèges root, qui diffèrent en termes de sophistication.

Se connecter en tant que root

Pour obtenir des privilèges root, la méthode la plus directe et la plus simple consiste à se connecter directement à votre serveur en tant que le root user.

Si vous vous connectez à une machine locale (ou en utilisant une fonction de console hors-bande sur un serveur virtuel), lorsque vous serez invité à vous connecter, saisissez root pour votre nom d'utilisateur et le mot de passe root.

Si vous vous connectez via SSH, spécifiez le root user avant l'adresse IP ou le nom de domaine dans votre chaîne de connexion SSH :

  • ssh root@server_domain_or_ip

Si vous n'avez pas configuré de clés SSH pour l'utilisateur root, saisissez le mot de passe root lorsque vous y serez invité.

Utiliser su pour devenir root

En règle générale, il n'est pas recommandé de vous connecter directement en root. En effet, même si cela vous permet de commencer à utiliser le système facilement pour effectuer des tâches non administratives, cette pratique reste dangereuse.

La prochaine méthode que nous allons vous présenter pour obtenir des privilèges de super-utilisateur vous permet de devenir l'utilisateur root à tout moment, à chaque fois que vous en aurez besoin.

Pour cela, vous pouvez invoquer la commande su, qui signifie « utilisateur de remplacement ». Pour obtenir des privilèges root, tapez :

  • su

Vous serez invité à saisir le mot de passe du root user, quite à quoi vous serez dirigé vers une session de shell root.

Une fois que vous en aurez terminé avec les tâches qui nécessitent des privilèges root, retournez à votre shell normal en saisissant :

  • exit

Utiliser sudo pour exécuter des commandes en tant que root

La dernière méthode qui permet d'obtenir des privilèges root que nous allons aborder est celle qui utilise la commande sudo.

La commande sudo vous permet d'exécuter des commandes uniques avec des privilèges root, sans avoir à générer un nouveau shell. Elle s'exécute de la manière suivante :

  • sudo command_to_execute

Contrairement à su, la commande sudo vous demandera de saisir le mot de passe de l'utilisateur actuel, pas le mot de passe root.

En raison de ses implications en termes de sécurité, les utilisateurs ne se voient pas attribuer l'accès sudo par défaut qui doit être préalablement configuré avant de pouvoir fonctionner correctement. Consultez nos tutoriels de démarrage rapide Comment créer un nouvel utilisateur Sudo dans Ubuntu et CentOS pour en apprendre davantage sur la configuration d'un utilisateur sudo.

Dans la section suivante, nous allons voir comment modifier la configuration sudo plus en détail.

Qu'est-ce que Visudo ?

La configuration de la commande sudo se fait par le biais d'un fichier situé dans /etc/sudoers.

Avertissement : ne modifiez jamais ce fichier en utilisant un éditeur de texte normal ! À la place, utilisez toujours la commande visudo !

Étant donné que l'utilisation d'une mauvaise syntaxe dans le fichier /etc/sudoers vous laissera créer un système défaillant dans lequel il sera impossible d'obtenir des privilèges élevés, il est important d'utiliser la commande visudo pour modifier le fichier.

La commande visudo ouvre un éditeur de texte normalement, mais valide la syntaxe du fichier au moment de la sauvegarde. Cela empêche les erreurs de configuration de venir bloquer les opérations sudo, qui est votre seule façon d'obtenir des privilèges root.

Traditionnellement, visudo ouvre le fichier /etc/sudoers avec l'éditeur de texte vi. Cependant, en Ubuntu, visudo est configuré pour utiliser l'éditeur de texte nano à la place.

Si vous souhaitez le reconfigurer sur vi, vous devez lancer la commande suivante :

  • sudo update-alternatives --config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual mode Press <enter> to keep the current choice[*], or type selection number:

Sélectionnez le numéro qui correspond au choix que vous souhaitez appliquer.

Sur CentOS, vous pouvez modifier cette valeur en ajoutant la ligne suivante à votre ~/.bashrc :

  • export EDITOR=`which name_of_editor`

Créez le fichier pour implémenter les changements :

  • . ~/.bashrc

Une fois que vous aurez configuré visudo, exécutez la commande pour accéder au fichier /etc/sudoers :

  • sudo visudo

Comment modifier le fichier Sudoers

Nous allons vous présenter le fichier /etc/sudoers dans l'éditeur de texte que vous avez sélectionné.

J'ai copié et collé le fichier à partir d'Ubuntu 18.04 en supprimant les commentaires. Le fichier /etc/sudoers de CentOS dispose de bien plus de lignes, dont certaines ne seront pas abordées dans ce guide.

/etc/sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d

Voyons ce que font ces lignes.

Lignes par défaut

La première ligne, « Defaults env_reset », réinitialise l'environnement du terminal afin de supprimer toute variable d'utilisateur. Il s'agit d'une mesure de sécurité utilisée pour effacer les variables d'environnement potentiellement néfastes de la session sudo.

La deuxième ligne, Defaults mail_badpass, indique au système d'envoyer des notifications par mail des tentatives de saisie erronée de mot de passe sudo à l'utilisateur mailto configuré. Il s'agit du compte root par défaut.

La troisième ligne, qui commence par « Defaults secure_path=… », spécifie le PATH (les endroits du système de fichiers dans lesquels le système d'exploitation recherchera des applications) qui sera utilisé pour les opérations sudo. Cela empêche toute utilisation de chemins utilisateurs susceptibles d'être préjudiciables.

Lignes de privilèges des utilisateurs

La quatrième ligne, qui dicte les privilèges sudo du root user, est différente des lignes précédentes. Examinons à quoi correspondent les différents champs :

  • root ALL=(ALL:ALL) ALL Le premier champ indique le nom d'utilisateur que la règle appliquera à (root).

  • root ALL=(ALL:ALL) ALL Le premier « ALL » indique que cette règle s'applique à tous les hôtes.

  • root ALL=(ALL:ALL) ALL Ce « ALL » indique que le root user peut exécuter des commandes en tant que tous les utilisateurs.

  • root ALL=(ALL:ALL) ALL Ce « ALL » indique que root user peut exécuter des commandes en tant que tous les groupes.

  • root ALL=(ALL:ALL) ALL Le dernier « ALL » indique que ces règles s'appliquent à toutes les commandes.

Cela signifie que notre root user peut exécuter toute commande en utilisant sudo, à condition qu'il fournisse son mot de passe.

Lignes de privilèges de groupes

Les deux lignes suivantes sont similaires celles des privilèges de l'utilisateur, mais les règles sudo spécifiées s'appliquent aux groupes.

Les noms commençant par un % indiquent des noms de groupes.

Ici, nous voyons que le groupe admin peut exécuter toute commande en tant que n'importe quel utilisateur, quel que soit l'hôte. De la même façon, le groupe sudo dispose des mêmes privilèges, mais peut également s'exécuter en tant que tout groupe également.

Ligne /etc/sudoers.d incluse

Au premier regard, la dernière ligne peut ressembler à un commentaire :

/etc/sudoers
. . .

#includedir /etc/sudoers.d

Elle commence par un #, ce qui indique généralement un commentaire. Cependant, en réalité, cette ligne indique que les fichiers dans le répertoire /etc/sudoers.d seront également sourcés et appliqués.

Les fichiers qui se trouvent dans ce répertoire suivent les mêmes règles que le fichier /etc/sudoers en lui-même. Tout fichier qui ne finit pas par ~ et qui ne contient pas un . sera lu et annexé à la configuration de sudo.

Cela est principalement destiné aux applications qui modifient les privilèges sudo lors de l'installation. En mettant toutes les règles associées dans un seul fichier du répertoire /etc/sudoers.d, vous pouvez facilement voir quels privilèges sont associés à quels comptes et inverser tout aussi aisément les identifiants sans avoir à tenter de manipuler le fichier /etc/sudoers.d directement.

Comme pour le fichier /etc/sudoers en lui-même, vous devriez toujours modifier les fichiers du répertoire /etc/sudoers.d avec visudo. La syntaxe à utiliser pour modifier ces fichiers serait la suivante :

  • sudo visudo -f /etc/sudoers.d/file_to_edit

Comment donner des privilèges sudo à un utilisateur

Le plus souvent, dans le cadre de la gestion des autorisations sudo, les utilisateurs souhaitent accorder un accès sudo général à un nouvel utilisateur. Cette pratique est pratique pour octroyer un accès administratif complet au système.

Sur un système configuré avec un groupe d'administration générale comme le système Ubuntu utilisé dans ce guide, le plus simple consiste à ajouter l'utilisateur en question à ce groupe.

Par exemple, sur Ubuntu 20.04, le groupe sudo dispose de privilèges administratifs complets. Nous pouvons accorder ces mêmes privilèges à un utilisateur en les ajoutant au groupe de la manière suivante :

  • sudo usermod -aG sudo username

Vous pouvez également utiliser la commande gpasswd :

  • sudo gpasswd -a username sudo

Les deux méthodes vous donneront les mêmes résultats.

En CentOS, on utilise généralement le groupe wheel au lieu du groupe sudo :

  • sudo usermod -aG wheel username

Ou, on utilise gpasswd :

  • sudo gpasswd -a username wheel

Sur CentOS, si vous n'arrivez pas à ajouter un utilisateur au groupe immédiatement, vous aurez éventuellement à modifier le fichier /etc/sudoers pour retirer les commentaires du nom du groupe :

  • sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

Comment configurer des règles personnalisées

Maintenant que nous nous sommes familiarisés avec la syntaxe générale du fichier, créons quelques nouvelles règles.

Comment créer des alias

Le fichier sudoers peut être organisé plus efficacement en regroupant des éléments avec différents types de « alias ».

Par exemple, nous pouvons créer trois groupes différents d'utilisateurs, en chevauchant l'appartenance :

/etc/sudoers
. . .
User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric,
User_Alias      GROUPTHREE = doris, felicia, grant
. . .

Les noms de groupes doivent commencer par une lettre majuscule. Nous pouvons ensuite autoriser les membres de GROUPTWO à mettre à jour la base de données apt en créant une règle similaire à celle-ci :

/etc/sudoers
. . .
GROUPTWO    ALL = /usr/bin/apt-get update
. . .

Si nous ne spécifions pas l'utilisateur/groupe par lequel la commande est exécutée, sudo désigne le root user par défaut.

Nous pouvons autoriser les membres de GROUPTHREE à arrêter et redémarrer la machine en créant un « alias de commande » et en l'utilisant dans une règle pour GROUPTHREE :

/etc/sudoers
. . .
Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER
. . .

Nous créons un alias de commandes appelé POWER, qui intègre des commandes qui permettent d'arrêter et de redémarrer la machine. Nous allons ensuite autoriser les membres de GROUPTHREE à exécuter ces commandes.

Nous pouvons également créer des alias « Run as », qui peuvent remplacer la partie de la règle qui spécifie l'utilisateur par lequel la commande est exécutée :

/etc/sudoers
. . .
Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL
. . .

Cela permettra à toute personne membre de GROUPONE d'exécuter des commandes en tant que l'utilisateur www-data ou apache user.

Gardez juste à l'esprit, qu'en cas de conflit, les règles les plus récentes remplaceront les anciennes.

Comment verrouiller des règles

Il existe plusieurs manières d'avoir un meilleur contrôle sur la façon dont sudo réagit à un appel.

La commande updatedb associée au package mlocate est relativement sans danger sur un système à utilisateur unique. Si nous souhaitons autoriser les utilisateurs à l'exécuter avec des privilèges root sans avoir à saisir de mot de passe, nous pouvons créer une règle comme suit:

/etc/sudoers
. . .
GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD est une « balise » qui signifie qu'aucun mot de passe ne sera requis. Elle est accompagnée d'une commande appelée PASSWD qui indique le comportement par défaut. Une balise est pertinente pour le reste de la règle à moins qu'elle ne soit écrasée par une balise « jumelle » plus loin dans la ligne.

Par exemple, nous pouvons avoir une ligne comme celle-ci :

/etc/sudoers
. . .
GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

La balise NOEXEC est également une balise utile qui vous permettra d'empêcher certains comportements dangereux dans certains programmes.

Par exemple, certains programmes, comme less, peuvent générer d'autres commandes si vous saisissez ce qui suit à partir de leur interface :

!command_to_run

Pour résumer, cela permet d'exécuter toute commande instruite par l'utilisateur avec les mêmes autorisations sous lesquelles less s'exécute, ce qui peut être assez dangereux.

Pour restreindre ce phénomène, nous pouvons utiliser une ligne comme la suivante :

/etc/sudoers
. . .
username  ALL = NOEXEC: /usr/bin/less
. . .

Informations diverses

Il existe quelques autres éléments d'information qui pourront vous être d'une grande utilité lorsque vous utilisez sudo.

Si, dans le fichier de configuration, vous avez configuré un utilisateur ou un groupe sur « run as », vous pouvez exécuter les commandes en tant que ces utilisateurs en utilisant respectivement les balises -u et -g :

  • sudo -u run_as_user command
  • sudo -g run_as_group command

Pour plus de commodité, sudo enregistrera par défaut vos détails d'authentification pendant un certain temps sur un terminal. Cela signifie que vous n'aurez plus à saisir votre mot de passe à chaque fois jusqu'à expiration du minuteur.

Pour des raisons de sécurité, si, une fois que vous aurez terminé d'exécuter des commandes administratives, vous souhaitez supprimer ce minuteur, vous pouvez exécuter la commande suivante :

  • sudo -k

Si, en revanche, vous souhaitez « primer » la commande sudo afin de ne plus recevoir d'invitation par la suite ou de renouveler votre location sudo, vous pouvez toujours saisir la commande suivante :

  • sudo -v

Vous serez invité à saisir votre mot de passe, invite qui sera mise en cache pour vos prochaines utilisations sudo jusqu'à expiration du délai de sudo.

Si vous vous demandez tout simplement quel type de privilèges ont été définis pour votre nom d'utilisateur, vous pouvez saisir :

  • sudo -l

Vous obtiendrez une liste de toutes les règles dans le fichier /etc/sudoers qui s'appliquent à votre utilisateur. Vous aurez ainsi une bonne idée de ce que vous serez autorisé à faire ou pas avec sudo en tant que tout utilisateur.

Il vous arrivera souvent d'exécuter une commande qui ne fonctionnera pas, car vous aurez oublié de la préfacer avec sudo. Pour ne pas avoir à re-saisir la commande, vous pouvez tirer profit de la fonctionnalité de bash qui signifie « répéter la dernière commande » :

  • sudo !!

Le double point d'exclamation répétera la dernière commande. Nous l'avons précédé de sudo afin de rapidement changer la commande sans privilège en commande avec privilège.

Pour le plaisir, vous pouvez ajouter la ligne suivante à votre fichier /etc/sudoers avec visudo :

  • sudo visudo
/etc/sudoers
. . .
Defaults    insults
. . .

sudo renverra alors une insulte stupide à l'utilisateur si le mot de passe sudo qu'il a saisi est erroné. Nous pouvons utiliser sudo -k pour effacer l'ancien mot de passe en cache sudo pour l'essayer :

  • sudo -k
  • sudo ls
Output
[sudo] password for demo: # enter an incorrect password here to see the results Your mind just hasn't been the same since the electro-shock, has it? [sudo] password for demo: My mind is going. I can feel it.

Conclusion

Vous devriez maintenant avoir une compréhension de base sur la façon de lire et de modifier le fichier sudoers et des différentes méthodes disponibles pour obtenir des privilèges root.

N'oubliez pas qu'il existe une raison pour laquelle les privilèges de super-utilisateurs ne sont pas octroyés aux utilisateurs réguliers. Il est essentiel que vous ayez une bonne compréhension de ce que fait chacune des actions que vous exécutez avec des privilèges root. Ne prenez pas cette responsabilité à la légère. Apprenez à utiliser ces outils pour votre cas d'utilisation et à verrouiller toute fonctionnalité inutile.

Creative Commons License