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.
Vous disposez de trois méthodes de base pour obtenir des privilèges root, qui diffèrent en termes de sophistication.
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é.
su
pour devenir rootEn 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
sudo
pour exécuter des commandes en tant que rootLa 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.
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
OutputThere 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
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.
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.
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.
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.
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.
Au premier regard, la dernière ligne peut ressembler à un commentaire :
. . .
#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
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
. . .
%wheel ALL=(ALL) ALL
. . .
Maintenant que nous nous sommes familiarisés avec la syntaxe générale du fichier, créons quelques nouvelles règles.
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 :
. . .
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 :
. . .
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
:
. . .
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 :
. . .
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.
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:
. . .
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 :
. . .
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 :
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
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
. . .
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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!