Pourquoi la commande sudo n'a-t-elle pas besoin du mot de passe root?

48

J'utilise Linux depuis un moment maintenant et chaque fois que je tapais, sudoje pensais basculer vers l'utilisateur root pour une commande.

Apparemment, ce n'est pas vrai car tout ce dont j'ai besoin est le mot de passe de mon compte d'utilisateur. Je suppose que puisque je n'ai pas travaillé avec plusieurs utilisateurs, je ne l'ai pas vraiment remarqué dans le monde réel.

Je ne sais pas comment Ubuntu crée mon premier compte. Y a-t-il un utilisateur root? Suis-je root? Je suppose que je viens de créer un nouvel utilisateur lors de l'installation, mais cela m'a-t-il donné des privilèges root? Juste un peu confus ici ...

Alors, pourquoi suis-je autorisé à exécuter des commandes root avec le mot de passe de mon utilisateur?

EGHDK
la source
En utilisant quel utilisateur vous avez besoin du mot de passe et dans lequel vous ne l'utilisez pas? Quelle commande vous exécutez? Rappelez-vous que sudo stocke votre mot de passe pendant un certain temps avant de le ressaisir.
Braiam
11
sudoa le bit "setuid" activé. Donc, il fonctionne comme l'utilisateur qui en est propriétaire (c'est-à-dire root sur tous les systèmes standard si je ne me trompe pas), pas comme l'utilisateur qui le lance. sudopuis charge le /etc/sudoersfichier et vérifie ce qui est autorisé en fonction de celui qui l'a lancé.
LawrenceC
1
Je suis désolé si je répète quelque chose que quelqu'un d'autre a dit, mais je ne pouvais pas le trouver. La réponse est: c'est une décision politique. La meilleure chose à faire est de penser que, dans une grande installation qui compte de nombreuses personnes sudoprivilégiées, travaillant peut-être dans des emplacements répartis géographiquement et sur des équipes 24 × 7, vous souhaitez pouvoir révoquer immédiatement l'accès privilégié d'une personne (par exemple, vous soupçonnez son intégrité). Si tout le monde utilise le mot de passe root unique et que vous le modifiez sans coordination préalable, le chaos peut en résulter. …
G-Man dit 'Réintégrez Monica'
1
@HagenvonEitzen Je sais que j'ai quelques jours de retard, mais comment est-ce que ce n'est pas une dupe de notre question?
Strugee

Réponses:

65

Dans les détails cela fonctionne de la manière suivante:

  1. /usr/bin/sudoLe fichier exécutable a le bit setuid défini. Ainsi, même lorsqu'il est exécuté par un autre utilisateur, il s'exécute avec l'ID utilisateur du propriétaire du fichier (root dans ce cas).

  2. sudovérifie dans le /etc/sudoersfichier quels sont vos privilèges et si vous êtes autorisé à exécuter la commande que vous appelez. Dire simplement, /etc/sudoersest un fichier qui définit quels utilisateurs peuvent exécuter quelles commandes en utilisant un sudomécanisme.

    Voilà à quoi ressemble ce fichier sur mon Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    La troisième ligne est ce qui vous intéresse probablement. Il permet à n’importe qui du groupe "sudo" d’exécuter une commande en tant qu’utilisateur.

    Lorsque Ubuntu configure le premier compte lors de l'installation, il ajoute ce compte au groupe "sudo". Vous pouvez vérifier les groupes auxquels les utilisateurs appartiennent avec la groupcommande.

  3. sudovous demande un mot de passe. En ce qui concerne le fait qu'il nécessite le mot de passe de l'utilisateur, et non celui de la racine, il s'agit d'un extrait du manuel de sudoers :

    Authentification et journalisation

    La politique de sécurité de sudoers exige que la plupart des utilisateurs s’authentifient avant de pouvoir utiliser sudo. Un mot de passe n'est pas requis si l'utilisateur invoqué est root, si l'utilisateur cible est identique à l'utilisateur invoqué ou si la stratégie a désactivé l'authentification pour l'utilisateur ou la commande. Contrairement à su (1), lorsque sudoers requiert une authentification, il valide les informations d'identification de l'utilisateur qui appelle, pas les informations d'identification de l'utilisateur cible (ou de l'utilisateur racine). Cela peut être changé via les drapeaux rootpw, targetpw et runaspw, décrits plus tard.

    Cependant, en fait, sudovous n'avez besoin de votre mot de passe utilisateur pour rien. Il vous le demande simplement pour vous assurer que vous êtes vraiment vous et pour vous fournir une sorte d'avertissement (ou une chance de vous arrêter) avant d'invoquer une commande potentiellement dangereuse. Si vous souhaitez désactiver la demande de mot de passe, modifiez l'entrée sudoers en:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Une fois que l'authentification a sudoengendré un processus enfant qui exécute la commande appelée. L'enfant hérite de l'ID utilisateur root de son parent - le sudoprocessus.


Alors, répondant précisément à vos questions:

Je pensais que je passais à l'utilisateur root pour une commande.

Tu avais raison. Chaque commande précédée de sudos'exécute avec l'ID utilisateur root.

Y a-t-il un utilisateur root?

Oui, il existe un compte utilisateur root, distinct de votre compte utilisateur créé lors de l'installation du système. Cependant, par défaut, dans Ubuntu, vous n'êtes pas autorisé à vous connecter à un terminal interactif en tant qu'utilisateur root.

Suis-je root?

Non, vous n'êtes pas une racine. Vous avez uniquement le privilège d'exécuter des commandes individuelles en tant que racine , en utilisant le sudomécanisme décrit ci-dessus.

Alors, pourquoi suis-je autorisé à exécuter des commandes root avec le mot de passe de mon utilisateur?

Vous devez entrer le mot de passe de l'utilisateur uniquement en raison d' sudoun mécanisme de sécurité interne. Il peut être facilement désactivé. Vous gagnez vos pouvoirs de base à cause du bit setuid /usr/bin/sudo, pas à cause des mots de passe que vous entrez.

Piotr Jurkiewicz
la source
6
La réponse devrait vraiment commencer par la partie setuid, parce que c'est la raison pour laquelle c'est réellement possible. / etc / sudoers est la raison de la souplesse de la commande sudo.
daniel kullmann
Intéressant. Je ne savais pas que vous pouviez spécifier qu'il sudopouvait être exécuté sans saisir mon mot de passe. Très bonne réponse!
jwir3
1
Notez que sudo peut être configuré pour demander le mot de passe root avec l' rootpwindicateur dans sudoers.
Réintégrer Monica - M. Schröder
2
Vous pouvez en fait vous connecter en tant qu'utilisateur root: vous sudo su - rootle ferez et vous donnerons un terminal root. Cependant, vous ne pouvez pas vous connecter facilement à une session de bureau en tant que root.
Jmiserez
1
Fondamentalement, il sudoa le privilège root par lui-même et il décide de vous en informer en fonction d'un fichier de configuration.
Siyuan Ren
15
  • Le but sudoest de vous accorder les privilèges de quelqu'un d'autre (généralement root) sans demander le mot de passe de cet autre compte (contrairement à su).

  • sudo demande ici votre mot de passe pour s’assurer que le passant n’abuse pas de votre terminal déverrouillé.

  • Ubuntu et de nombreux autres systèmes d'exploitation Linux et Unix accordent à un compte initial créé lors de l'installation le droit d'exécuter toutes les commandes en tant que root.

  • Même s’il roots’agit toujours d’un compte sous Linux, les rootconnexions directes sont désactivées par défaut pour une meilleure sécurité et traçabilité.

jlliagre
la source
7
Bien que la connexion directe à la racine soit effectivement désactivée par défaut, il existe toujours un compte racine avec Ubuntu. Ce n'est plus un compte au moins sur Solaris où il s'agit par défaut d'un rôle.
Juillet
Merci beaucoup - je me suis toujours demandé comment cela fonctionnait de toute façon, et cela a maintenant beaucoup plus de sens.
mikeserv
5

Piotr a très bien expliqué comment cela sudofonctionne. Cependant, il n'a pas vraiment motivé pourquoi cela fonctionne de cette façon, alors je vais essayer d'ajouter cela ici.

Avant la création de la sudocommande, nous avions la sucommande. Cette commande permet à un utilisateur d'exécuter des commandes en tant qu'autre utilisateur, généralement root( sudoil s'agit de l'utilisateur cible par défaut). C'était totalement non discriminant, vous pouvez exécuter n'importe quelle commande. Puisqu'il pouvait être utilisé par n'importe quel utilisateur et qu'il était en fait équivalent à une connexion en tant que cet utilisateur, il était nécessaire de connaître le mot de passe de l'utilisateur cible.

A un moment donné, un peu plus de contrôle d'accès a été ajouté: pour pouvoir être utilisé su, il fallait être membre du wheelgroupe. Mais comme vous pouvez toujours exécuter n’importe quelle commande, il était toujours logique de vous demander de connaître leur mot de passe.

Demander aux utilisateurs de connaître le mot de passe de chacun, ou du superutilisateur, n’était cependant pas très sécurisé. Souvent, vous voulez simplement donner à certains utilisateurs un accès limité à un autre compte (cela fait partie d'un concept de sécurité appelé principe de moindre privilège ). Cela rend également la reddition de comptes difficile: si plusieurs personnes connaissent le mot de passe d'un compte et que ce compte est impliqué dans une erreur ou un abus, vous ne pouvez pas dire lequel d'entre eux l'a réellement fait.

Ainsi a sudoété créé. Plutôt que d’autoriser les utilisateurs à exécuter une commande, il contient un fichier de configuration complexe, abordé brièvement dans la réponse de Piotr, qui spécifie précisément qui peut l’utiliser, à quels utilisateurs ils peuvent basculer et quelles commandes ils sont autorisés à exécuter. Avec ce contrôle précis sur qui peut faire quoi et sur qui, nous n'avons plus besoin de donner aux utilisateurs le mot de passe du compte cible; Si nous le faisions, ils pourraient facilement contourner tous les contrôles du fichier de configuration en se connectant sous cet utilisateur. Au lieu de cela, nous leur demandons normalement de prouver qu’ils sont bien ceux avec qui ils ont ouvert la session en saisissant leur propre mot de passe - ceci a pour but d’empêcher quiconque de profiter d’un compte si le terminal est laissé sans surveillance.

Cette exigence est levée pour le superutilisateur - ce compte peut faire presque tout au système sans utiliser sudo, donc il a été jugé superflu. Il est également possible de spécifier dans le fichier de configuration que les utilisateurs n'ont pas besoin d'entrer de mot de passe. Certaines entreprises l'utilisent lorsqu'elles estiment que la sécurité physique de l'environnement de leur poste de travail est suffisante pour éviter les abus.

Barmar
la source
Je n'ai pas exploré cela, mais je comprends l'une des fonctionnalités de sudo que su n'a pas, c'est qu'il garde (est capable de) enregistrer un journal des commandes exécutées par quel utilisateur pour faciliter le traçage des problèmes. leurs sources. Je viens de regarder sur mon système kubuntu et je ne vois pas un tel journal, alors peut-être que ce n'est pas un comportement par défaut.
Joe
Je viens de trouver sudo en train de se connecter dans /var/log/auth.log - avec beaucoup d’autres choses, y compris des adresses IP de Chine qui essaient d’obtenir un accès root ssh à mon système - donc, si vous voulez juste voir sudo, vous devez filtrer il à travers grep ou similaire.
Joe
Correct. suenregistre également, mais comme il ne fait que démarrer un nouveau shell, il enregistre simplement le fait que quelqu'un l’a exécuté.
Barmar
Vous ne pouvez pas compter sur les journaux, car quiconque peut obtenir un compte root peut les modifier (sauf si vous vous connectez à un autre ordinateur et assurez-vous de ne pas autoriser l'accès tant que la transaction de journalisation n'est pas terminée). Toutefois, les sudoprivilèges peuvent être révoqués sans que le mot de passe root soit à nouveau attribué à tous ceux qui en ont besoin.
ctrl-alt-delor
1
@richard Since sudovous permet de limiter les commandes qu'un utilisateur peut exécuter, vous pouvez essayer de vous assurer que vous ne leur donnez pas accès à des commandes qui écraseraient le journal.
Barmar
3

La réponse à votre question est:

Lorsque vous exécutez une commande avec sudo , vous exécutez la commande avec des privilèges élevés , c'est-à-dire des privilèges root . Vous devez seulement taper votre mot de passe utilisateur normal car vous (l'utilisateur) avez été ajouté au fichier sudoers qui vous donne les privilèges root .

quelque chose quelque chose
la source
2
Sauf que sudo n'implique pas de privilèges élevés, mais différents de ceux de l'utilisateur actuel. Par exemple, vous pouvez exécuter un programme en tant qu'utilisateur normal qui n'a pas de shell. De plus, être dans le fichier sudoers ne donne pas la racine.
James Tocknell
1
@aragilar yes sudone donne pas toujours des privilèges élevés, mais il fonctionne avec des privilèges élevés, après avoir effectué ce qu'il a à faire (vérification de l'authentification, il peut perdre des privilèges). Il a besoin de ces privilèges élevés pour pouvoir changer d'utilisateur.
ctrl-alt-delor
1
Bien sûr, sudoutilise des privilèges élevés (mais ce n’est pas propre à sudo, par exemple, mount en fait également), mais la commande que vous appelez, c’est- commandà- dire, sudo commandne le sera peut-être pas (selon ce qui est défini /etc/sudoers).
James Tocknell
1

Tout d'abord, la désactivation d'un compte est généralement effectuée en définissant le mot de passe crypté sur *, qui ne correspond à la valeur cryptée d'aucune chaîne. Je ne peux pas vérifier pour le moment, mais je pense que c'est ce que fait Ubuntu pour root également. Donc techniquement, il n'y a pas de mot de passe root sur Ubuntu.

Mais sudo précède Ubuntu; il a été conçu pour les systèmes où il existe certainement des mots de passe racine. Alors pourquoi ne nécessite-t-il pas le mot de passe root? En principe, sudo est conçu pour donner l’autorisation d’exécuter des commandes spécifiques à certains utilisateurs - par exemple, permettre à un développeur d’accéder à la racine pour redémarrer l’application Web, mais pas pour démarrer des serveurs arbitraires. En revanche, connaître le mot de passe root vous donne un accès illimité. vous pouvez utiliser login ou su pour ouvrir un shell root et exécuter des commandes arbitraires. Étant donné que sudo doit fonctionner pour les personnes ne disposant pas de ce niveau d'accès, le mot de passe root ne peut pas être exécuté.

Jonathan Cast
la source
Cela permet également de révoquer les privilèges root d'un utilisateur sans avoir à changer le mot de passe root.
Ian D. Scott