Introduction
La séparation des privilèges est l’un des paradigmes de sécurité fondamentaux mis en œuvre dans Linux et les systèmes d’exploitation de type Unix. Les utilisateurs réguliers opèrent avec des privilèges limités afin de réduire la portée de leur influence à leur propre environnement, et non 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 sans les restrictions présentes sur les utilisateurs normaux. Les utilisateurs peuvent exécuter des commandes avec les privilèges de super-utilisateur ou de root de différentes manières.
Dans cet article, nous allons voir comment obtenir correctement et en toute sécurité les privilèges de root, en nous concentrant particulièrement sur l’édition du fichier /etc/sudoers
.
Nous allons effectuer ces étapes sur un serveur Ubuntu 20.04, mais la plupart des distributions Linux modernes telles que Debian et CentOS devraient fonctionner de manière similaire.
Ce guide suppose que vous avez déjà effectué la configuration initiale du serveur abordée ici. Connectez-vous à votre serveur en tant qu’utilisateur ordinaire, non root, et continuez ci-dessous.
Note : Ce tutoriel aborde en profondeur l’escalade de privilèges et le fichier sudoers
. Si vous souhaitez simplement ajouter des sudo
privilèges à un utilisateur, consultez nos tutoriels de démarrage rapide Comment créer un nouvel utilisateur à capacité Sudo pour Ubuntu et CentOS.
Comment obtenir les privilèges root
Il existe trois façons de base d’obtenir les privilèges root, qui varient dans leur niveau de sophistication.
Se connecter en tant que root
La méthode la plus simple et la plus directe pour obtenir les privilèges root consiste à se connecter directement à votre serveur en tant qu’utilisateur root.
Si vous vous connectez à une machine locale (ou si vous utilisez une fonctionnalité de console hors bande sur un serveur virtuel), entrez root
comme nom d’utilisateur à l’invite de connexion et entrez le mot de passe root lorsqu’on vous le demande.
Si vous vous connectez par SSH, spécifiez l’utilisateur root 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 êtes invité.
Utiliser su pour devenir root
Se connecter directement en tant que root n’est généralement pas recommandé, car il est facile de commencer à utiliser le système pour des tâches non administratives, ce qui est dangereux.
La prochaine façon d’obtenir des privilèges de super-utilisateur vous permet de devenir l’utilisateur root à tout moment, selon vos besoins.
Nous pouvons le faire en invoquant la commande su
, qui signifie » utilisateur de substitution « . Pour obtenir les privilèges de l’utilisateur root, tapez :
- su
On vous demandera le mot de passe de l’utilisateur root, après quoi, vous serez lâché dans une session shell root.
Quand vous aurez terminé les tâches qui nécessitent des privilèges root, revenez à votre shell normal en tapant :
- exit
Utiliser sudo pour exécuter des commandes en tant que root
Le dernier, moyen d’obtenir des privilèges root que nous allons aborder est la commande sudo
.
La commande sudo
vous permet d’exécuter des commandes ponctuelles avec les privilèges root, sans avoir besoin de spawn un nouveau shell. Elle s’exécute comme suit :
- sudo command_to_execute
À la différence de su
, la commande sudo
demandera le mot de passe de l’utilisateur actuel, et non celui de root.
En raison de ses implications en matière de sécurité, l’accès sudo
n’est pas accordé aux utilisateurs par défaut, et doit être configuré avant de fonctionner correctement. Consultez nos tutoriels de démarrage rapide Comment créer un nouvel utilisateur activé par Sudo pour Ubuntu et CentOS pour apprendre à configurer un utilisateur activé par sudo
.
Dans la section suivante, nous verrons comment modifier la configuration sudo
plus en détail.
Qu’est-ce que Visudo ?
La commande sudo
est configurée par le biais d’un fichier situé à /etc/sudoers
.
Avertissement : Ne modifiez jamais ce fichier avec un éditeur de texte normal ! Utilisez toujours la commande visudo
à la place !
Parce qu’une syntaxe incorrecte dans le fichier /etc/sudoers
peut vous laisser avec un système cassé où il est impossible d’obtenir des privilèges élevés, il est important d’utiliser la commande visudo
pour éditer le fichier.
La commande visudo
ouvre un éditeur de texte comme d’habitude, mais elle valide la syntaxe du fichier lors de l’enregistrement. Cela empêche les erreurs de configuration de bloquer les opérations sudo
, qui peuvent être votre seul moyen d’obtenir les privilèges root.
Traditionnellement, visudo
ouvre le fichier /etc/sudoers
avec l’éditeur de texte vi
. Ubuntu, cependant, a configuré visudo
pour qu’il utilise plutôt l’éditeur de texte nano
.
Si vous souhaitez le changer à nouveau en vi
, lancez 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 modePress <enter> to keep the current choice, or type selection number:
Sélectionnez le numéro qui correspond au choix que vous souhaitez faire.
Sur CentOS, vous pouvez modifier cette valeur en ajoutant la ligne suivante à votre ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Sourcez le fichier pour mettre en œuvre les modifications :
- . ~/.bashrc
Après avoir configuré visudo
, exécutez la commande pour accéder au fichier /etc/sudoers
:
- sudo visudo
Comment modifier le fichier Sudoers
Le fichier /etc/sudoers
vous est présenté dans l’éditeur de texte que vous avez choisi.
J’ai copié et collé le fichier à partir d’Ubuntu 18.04, en supprimant les commentaires. Le fichier CentOS /etc/sudoers
comporte beaucoup plus de lignes, dont certaines ne seront pas abordées dans ce guide.
Defaults env_resetDefaults mail_badpassDefaults 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
Regardons ce que font ces lignes.
Lignes par défaut
La première ligne, « Defaults env_reset », réinitialise l’environnement du terminal pour supprimer toute variable utilisateur. Il s’agit d’une mesure de sécurité utilisée pour effacer les variables d’environnement potentiellement nuisibles de la sudo
session.
La deuxième ligne, Defaults mail_badpass
, indique au système de poster les avis de mauvaises sudo
tentatives de mot de passe à l’utilisateur configuré mailto
. Par défaut, il s’agit du compte root.
La troisième ligne, qui commence par « Defaults secure_path=… », spécifie les PATH
(les endroits du système de fichiers où le système d’exploitation cherchera les applications) qui seront utilisés pour les opérations sudo
. Cela permet d’éviter d’utiliser des chemins d’accès utilisateur qui peuvent être nuisibles.
Lignes de privilèges utilisateur
La quatrième ligne, qui dicte les privilèges de l’utilisateur root sudo
, est différente des lignes précédentes. Voyons ce que signifient les différents champs :
-
root ALL=(ALL:ALL) ALL
Le premier champ indique le nom d’utilisateur auquel la règle s’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 l’utilisateur root peut exécuter des commandes en tant que tous les utilisateurs. -
root ALL=(ALL:ALL) ALL
Ce « ALL » indique que l’utilisateur root 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 utilisateur root peut exécuter n’importe quelle commande en utilisant sudo
, tant qu’il fournit son mot de passe.
Lignes de privilège de groupe
Les deux lignes suivantes sont similaires aux lignes de privilège de l’utilisateur, mais elles spécifient les règles sudo
pour les groupes.
Les noms commençant par un %
indiquent les noms de groupes.
Ici, nous voyons que le groupe admin peut exécuter n’importe quelle commande en tant qu’utilisateur sur n’importe quel hôte. De même, le groupe sudo a les mêmes privilèges, mais peut également exécuter en tant que n’importe quel groupe.
Inclus /etc/sudoers.d Line
La dernière ligne pourrait ressembler à un commentaire à première vue :
. . .#includedir /etc/sudoers.d
Elle commence effectivement par un #
, ce qui indique généralement un commentaire. Cependant, cette ligne indique en fait que les fichiers du répertoire /etc/sudoers.d
seront également sourcés et appliqués.
Les fichiers de ce répertoire suivent les mêmes règles que le fichier /etc/sudoers
lui-même. Tout fichier qui ne se termine pas par ~
et qui ne contient pas de .
sera lu et ajouté à la configuration sudo
.
Ceci est principalement destiné aux applications visant à modifier les privilèges sudo
lors de l’installation. Le fait de placer toutes les règles associées au sein d’un seul fichier dans le répertoire /etc/sudoers.d
peut permettre de voir facilement quels privilèges sont associés à quels comptes et d’inverser les informations d’identification facilement sans avoir à essayer de manipuler le fichier /etc/sudoers
directement.
Comme pour le fichier /etc/sudoers
lui-même, vous devriez toujours modifier les fichiers du répertoire /etc/sudoers.d
avec visudo
. La syntaxe pour éditer ces fichiers serait :
- sudo visudo -f /etc/sudoers.d/file_to_edit
Comment donner des privilèges Sudo à un utilisateur
L’opération la plus courante que les utilisateurs veulent accomplir lors de la gestion des autorisations sudo
est d’accorder à un nouvel utilisateur un accès général sudo
. Ceci est utile si vous voulez donner à un compte un accès administratif complet au système.
La façon la plus simple de le faire sur un système configuré avec un groupe d’administration général, comme le système Ubuntu dans ce guide, est en fait d’ajouter l’utilisateur en question à ce groupe.
Par exemple, sur Ubuntu 20.04, le groupe sudo
a des privilèges d’administration complets. Nous pouvons accorder à un utilisateur ces mêmes privilèges en l’ajoutant au groupe comme ceci :
- sudo usermod -aG sudo username
La commande gpasswd
peut également être utilisée :
- sudo gpasswd -a username sudo
Ils accompliront tous deux la même chose.
Sur CentOS, il s’agit généralement du groupe wheel
au lieu du groupe sudo
:
- sudo usermod -aG wheel username
Ou, en utilisant gpasswd
:
- sudo gpasswd -a username wheel
Sur CentOS, si l’ajout de l’utilisateur au groupe ne fonctionne pas immédiatement, vous devrez peut-être modifier le fichier /etc/sudoers
pour décommenter le nom du groupe :
- sudo visudo
. . .%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 de nouvelles règles.
Comment créer des alias
Le fichier sudoers
peut être organisé plus facilement en regroupant les choses avec différents types d' »alias ».
Par exemple, nous pouvons créer trois groupes d’utilisateurs différents, dont les membres se chevauchent :
. . .User_Alias GROUPONE = abby, brent, carlUser_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant. . .
Les noms des groupes doivent commencer par une majuscule. Nous pouvons ensuite autoriser les membres de GROUPTWO
à mettre à jour la base de données apt
en créant une règle comme celle-ci :
. . .GROUPTWO ALL = /usr/bin/apt-get update. . .
Si nous ne spécifions pas un utilisateur/groupe à exécuter en tant que, comme ci-dessus, sudo
prend par défaut l’utilisateur root.
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/restartGROUPTHREE ALL = POWER. . .
Nous créons un alias de commande appelé POWER
qui contient des commandes pour éteindre et redémarrer la machine. Nous autorisons ensuite les membres de GROUPTHREE
à exécuter ces commandes.
Nous pouvons également créer des alias « Exécuter en tant que », qui peuvent remplacer la partie de la règle qui spécifie l’utilisateur sous lequel exécuter la commande :
. . .Runas_Alias WEB = www-data, apacheGROUPONE ALL = (WEB) ALL. . .
Cela permettra à toute personne membre de GROUPONE
d’exécuter des commandes en tant que www-data
utilisateur ou apache
utilisateur.
Ne perdez pas de vue que les règles ultérieures prévaudront sur les règles antérieures en cas de conflit entre les deux.
Comment verrouiller les règles
Il existe plusieurs façons d’obtenir plus de contrôle sur la façon dont sudo
réagit à un appel.
La commande updatedb
associée au paquet mlocate
est relativement inoffensive sur un système mono-utilisateur. Si nous voulons permettre aux utilisateurs de l’exécuter avec les privilèges de root sans avoir à taper un mot de passe, nous pouvons établir une règle comme celle-ci :
. . .GROUPONE ALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
est une « balise » qui signifie qu’aucun mot de passe ne sera demandé. Elle a une commande compagnon appelée PASSWD
, qui est le comportement par défaut. Une balise est pertinente pour le reste de la règle à moins qu’elle ne soit remplacée par sa balise « jumelle » plus tard dans la ligne.
Par exemple, nous pouvons avoir une ligne comme celle-ci :
. . .GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Une autre balise utile est NOEXEC
, qui peut être utilisée pour empêcher certains comportements dangereux dans certains programmes.
Par exemple, certains programmes, comme less
, peuvent engendrer d’autres commandes en tapant ceci depuis leur interface :
!command_to_run
Ceci exécute essentiellement toute commande que l’utilisateur lui donne avec les mêmes autorisations que celles sous lesquelles less
fonctionne, ce qui peut être assez dangereux.
Pour restreindre cela, nous pourrions utiliser une ligne comme celle-ci :
. . .username ALL = NOEXEC: /usr/bin/less. . .
Informations diverses
Il y a quelques informations supplémentaires qui peuvent être utiles lorsqu’on traite avec sudo
.
Si vous avez spécifié un utilisateur ou un groupe à « exécuter en tant que » dans le fichier de configuration, vous pouvez exécuter des commandes en tant que ces utilisateurs en utilisant les drapeaux -u
et -g
, respectivement :
- sudo -u run_as_user command
- sudo -g run_as_group command
Pour plus de commodité, par défaut, sudo
enregistrera vos détails d’authentification pendant un certain temps dans un terminal. Cela signifie que vous n’aurez pas à retaper votre mot de passe avant que ce délai ne soit écoulé.
Pour des raisons de sécurité, si vous souhaitez effacer cette minuterie lorsque vous avez fini d’exécuter des commandes administratives, vous pouvez exécuter :
- sudo -k
Si, en revanche, vous souhaitez « amorcer » la commande sudo
pour ne plus être sollicité ultérieurement, ou pour renouveler votre sudo
bail, vous pouvez toujours taper :
- sudo -v
Vous serez invité à saisir votre mot de passe, qui sera mis en cache pour des sudo
utilisations ultérieures jusqu’à l’expiration du sudo
délai.
Si vous vous demandez simplement quel type de privilèges est défini pour votre nom d’utilisateur, vous pouvez taper :
- sudo -l
Cela va lister toutes les règles du fichier /etc/sudoers
qui s’appliquent à votre utilisateur. Cela vous donne une bonne idée de ce que vous serez ou non autorisé à faire avec sudo
comme n’importe quel utilisateur.
Il arrive souvent que vous exécutiez une commande et qu’elle échoue parce que vous avez oublié de la faire précéder de sudo
. Pour éviter d’avoir à retaper la commande, vous pouvez profiter d’une fonctionnalité de bash qui signifie « répéter la dernière commande »:
- sudo !!
Le double point d’exclamation va répéter la dernière commande. Nous l’avons précédé de sudo
pour transformer rapidement la commande non privilégiée en commande privilégiée.
Pour vous amuser, vous pouvez ajouter la ligne suivante à votre fichier /etc/sudoers
avec visudo
:
- sudo visudo
. . .Defaults insults. . .
Ceci fera en sorte que sudo
renvoie une insulte idiote lorsqu’un utilisateur tape un mot de passe incorrect pour sudo
. Nous pouvons utiliser sudo -k
pour effacer le précédent mot de passe en cache de sudo
pour l’essayer :
- sudo -k
- sudo ls
Output password for demo: # enter an incorrect password here to see the resultsYour mind just hasn't been the same since the electro-shock, has it? password for demo: My mind is going. I can feel it.
Conclusion
Vous devriez maintenant avoir une compréhension de base de la façon de lire et de modifier le fichier sudoers
, et une maîtrise des différentes méthodes que vous pouvez utiliser pour obtenir les privilèges root.
Rappellez-vous que les privilèges de super-utilisateur ne sont pas donnés aux utilisateurs ordinaires pour une raison. Il est essentiel que vous compreniez ce que fait chaque commande que vous exécutez avec les privilèges root. Ne prenez pas cette responsabilité à la légère. Apprenez la meilleure façon d’utiliser ces outils pour votre cas d’utilisation, et verrouillez toute fonctionnalité qui n’est pas nécessaire.
.