Pourquoi devons-nous être root dans le terminal pour l’arrêt et le redémarrage?

65

Lorsque nous installons / supprimons / mettons à jour des packages ou apportons des modifications qui requièrent des privilèges administratifs, nous sommes invités à saisir le mot de passe de l'utilisateur admin disposant de ces sudoprivilèges - cela se produit à la fois via l'interface graphique et le terminal.

invite via gui

Cependant, si nous essayons d’arrêter et de redémarrer via un terminal, cela signifie que nous devons être root:

$ reboot
reboot: Need to be root

$ shutdown now
shutdown: Need to be root

Mais on ne nous demande jamais de mot de passe lorsque nous effectuons ces actions via la roue dentée en haut à droite.

menu à crémaillère

Pourquoi y a-t-il cet écart?

Aditya
la source
5
Bonne question .. Vous savez ce que j'allais demander la même chose. Mon scénario était d’arrêter Ubuntu avec des raccourcis clavier. Chaque fois que j'appuie sur une touche affectée, telle que ctrl + super + s , la commande sudo shutdown -h nowest exécutée, mais le problème est que, sans l'autorisation d'accès, shutdowncela ne fonctionne jamais. .. J'espère que vous comprenez ma situation .. :)
Saurav Kumar

Réponses:

50

L'arrêt de la roue dentée vérifie si vous êtes autorisé à arrêter la machine. Cela se fait via PolicyKit. En cas d'arrêt, cette déclaration dans le fichier /usr/share/polkit-1/actions/org.freedesktop.consolekit.policyest vérifiée:

<action id="org.freedesktop.consolekit.system.stop">
  <description>Stop the system</description>
  <message>System policy prevents stopping the system</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>yes</allow_active>
  </defaults>
</action>

Le PolicyKit déclenche une dbus-sendcommande. En cas d'arrêt, ce serait:

dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown

Un démon fonctionnant en arrière-plan avec des privilèges root appelle la commande shutdown pour vous.

Lorsque vous voulez pouvoir arrêter la machine "à l'ancienne" via la ligne de commande ( shutdown, reboot, halt, ...), vous devez ajouter le suid-Bit à ces commandes. Sachez toutefois que tous les utilisateurs de votre système ayant accès au shell peuvent alors éteindre votre ordinateur.

le chaos
la source
14
Une option légèrement plus sûre serait de permettre aux sudoers de s’arrêter sans mot de passe, etc. C’est simple: entrez sudo visudo, ajoutez %sudo ALL = NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/halt, /sbin/reboot, enregistrez et quittez. De cette façon, un redémarrage en ligne de commande sera toujours nécessaire sudo reboot, mais vous ne devrez pas entrer votre mot de passe.
Sebastian Thürrschmidt
27

Ubuntu est une distribution du système d'exploitation GNU / Linux qui appartient à la famille de systèmes Unix - une architecture commune pour un certain nombre de systèmes d'exploitation modernes.

Traditionnellement, Unix fonctionnait sur des ordinateurs centraux. Installations informatiques centralisées desservant des dizaines ou des centaines d'utilisateurs via des terminaux distants. Étant donné que tous les utilisateurs dépendaient de la disponibilité de l’ordinateur central, aucun utilisateur n’était autorisé à émettre une commande d’arrêt. Une idée fondamentale pour l’architecture Unix: le noyau système n’initialisera jamais un arrêt à moins que la fonction correspondante ne soit appelée par un processus superutilisateur.

Dans les systèmes de bureau actuels, les développeurs ont eu du mal à rendre l’arrêt accessible au simple utilisateur de bureau. Une technique courante consiste à laisser le gestionnaire de connexion, qui s'exécute généralement dans le contexte de sécurité de l'utilisateur root, gérer l'arrêt et le redémarrage. Dans ce cas, le shell graphique envoie une demande au gestionnaire de connexion pour éteindre l'ordinateur. Cela implique l'utilisation d'une communication interprocessus (IPC), généralement via le service dbus.

Le policykit mentionné ci-dessus étend ce processus en fournissant un cadre normalisé permettant au gestionnaire de connexion (ou à tout programme fournissant le service d'arrêt) de vérifier quels utilisateurs sont autorisés à provoquer un arrêt, et grâce auquel un administrateur peut configurer ces autorisations, respectivement.

Certains environnements de bureau n'utilisent pas de services IPC, mais plutôt un ensemble de programmes d'assistance fournissant les mêmes fonctions ou des fonctions similaires. Ces programmes auxiliaires seraient appelés via des mécanismes, permettant de passer dans le contexte de superutilisateur, comme sudo, suid ou un mécanisme de kit de stratégies similaire à sudo.

Dans tous les cas, le programme d'arrêt traditionnel stupide sur le shell ne fonctionne pas de cette façon. Il vous oblige à voir qu'il est exécuté dans un contexte de superutilisateur.

Paul Hänsch
la source
14

Parce que Linux est couramment utilisé en tant que serveur ou similaire, et que SSH dans une boîte Linux, même un ordinateur portable Ubuntu normal, est assez courant.

Le fait est que vous ne voulez peut-être pas que les personnes ayant un accès SSH puissent le fermer, en particulier lorsqu'il peut y avoir d'autres utilisateurs connectés à distance qui l'utilisent. Quelqu'un ayant accès à l'interface graphique - eh bien, il peut quand même le fermer tout seul avec le bouton d'alimentation physique.

En outre, un utilisateur connecté à distance ne pourra pas le réactiver.

Manishearth
la source
Cela ne m’était pas venu à l’esprit lorsque j’ai posé cette question, mais je suppose qu’il existe des options dans Ubuntu pour installer des packages d’interface graphique sur un serveur distant et utiliser le serveur distant sur une interface graphique plutôt que sur la ligne de commande. (Similaire au fonctionnement de Windows Remote Desktop ou Teamviewer). Cela invaliderait donc l'hypothèse selon laquelle une personne utilisant Ubuntu via une interface graphique peut s'arrêter avec le bouton d'alimentation physique.
Aditya
@aditya qui a besoin que le serveur soit configuré de cette manière, ce que l'administrateur doit décider de faire
Manishearth
Oui. Il faudrait des privilèges root pour pouvoir installer les packages et les configurer au besoin. Mais ce scénario m’est venu à l’esprit en lisant ta réponse hier et j’ai pensé que je la partagerais avec toi :-)
Aditya,
14

Lorsque je redémarre via l'interface graphique, je peux le faire sans mon sudomot de passe.

Uniquement si vous êtes le seul à être connecté. S'il existe d'autres utilisateurs (y compris les utilisateurs de console), vous devrez peut-être entrer un mot de passe root. Il en va de même pour OS X et les versions Windows plus récentes.

Pourquoi donc? Que se passe-t-il à l'intérieur du système Ubuntu?

La commande suivante:

/usr/bin/dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

D-Bus est un mécanisme IPC - un moyen de communication locale entre processus s'exécutant sur le même hôte.

D-Bus est "plus intelligent" que les protocoles de transmission de messages de bas niveau tels que UDP. D'autre part, il transporte les messages sous forme d'éléments discrets, et non de flux de données continus.

D-Bus a une vue structurée des données qu’il transporte et traite les données sous forme binaire; nombres entiers de différentes largeurs, chaînes, etc. Comme les données ne sont pas simplement des "octets bruts" destinés à D-Bus, les messages peuvent être validés.

- Bureau gratuit

Pourquoi la shutdowncommande ne vérifie- t-elle pas si quelqu'un est connecté? Cela semble être une fonctionnalité non mercenaire pour être honnête. J'imagine que cela gagnerait parfois du temps, mais une console cohérente est souvent préférée. Je ne veux pas que les commandes nécessitent parfois un mot de passe après l'avoir exécuté, et parfois non.

Mes pronoms sont Il / Lui

Tim
la source
Il y a aussi une version plus courte via l'application qdbus
Sergiy Kolodyazhnyy
Lorsque je ferme / déconnecte un DE (GNOME dans ce cas), je ne suis pas invité à saisir le sudomot de passe root / utilisateur, ni avec un autre utilisateur connecté via GDM, ni avec un autre utilisateur connecté via tty.
Kos
@kos hu, c'est étrange. Cette capture d'écran est de Gnome 3, et je suis connecté sur gui and tty
Tim
Je veux dire que je reçois le même message, mais cliquer sur «Éteindre» va de l'avant et arrête le système. J'ai aussi demandé à Fabby de tester cela et cela le fait aussi pour lui, je ne sais pas de quoi il s'agit.
Kos
@ Koh oh. Hu accrocher.
Tim
9

La raison pour laquelle vous n'avez pas besoin d'être root pour déclencher un arrêt à partir de l'interface graphique est essentiellement une question de commodité pour l'utilisateur de bureau typique. Le système sait que vous êtes l'utilisateur connecté à la console. Par conséquent, si vous éteignez l'ordinateur par erreur, vous pouvez probablement le rallumer.

Pour un utilisateur du shell, vous pouvez très bien être connecté à distance. Le système exige donc que vous soyez connecté en tant que root pour pouvoir exécuter une commande d'arrêt. Cela empêche un utilisateur connecté à un serveur de l'éteindre alors que d'autres personnes l'utilisent, et même s'il n'y a pas forcément personne pour le redémarrer.

La raison pour laquelle shutdown ne fournit pas d’invite graphique pour le mot de passe de superutilisateur est probablement simplement due au fait qu’il n’ya pas de véritable utilitaire à y accéder - si vous êtes sur la console, où l’invite apparaîtrait, vous pouvez simplement utiliser le wheeel menu à la place. Si vous souhaitez avoir une invite de ligne de commande pour le mot de passe du super-utilisateur pour l’arrêt, c’est déjà disponible avec «sudo shutdown».

Mark Bessey
la source
5

Dans un système multi-utilisateur, la dernière chose que vous souhaitiez est que vos utilisateurs se connectent et puissent redémarrer le serveur à tout moment, de manière aléatoire. La version en ligne de commande de Reboot est une commande réservée aux super-utilisateurs. avoir des droits sudo.

Idem les commandes Halt et PowerOff aussi.

Jeff Sereno
la source
2
Merci pour votre réponse, je comprends bien qu'en tant qu'utilisateur d'une machine utilisée par plusieurs dizaines d'utilisateurs, je ne devrais pas être en mesure de la redémarrer, mais que fait Ubuntu (ou pratiquement toutes les distributions de bureau) lorsque j'ai choisi de redémarrer avec la souris au lieu du clavier? Ils permettent cela sans priveliges.
Asco
3
Des composants tels que systemctl, loginctl, systemd, les stratégies système, etc. permettent à l'utilisateur actuellement connecté d'accéder à certaines fonctions racine sans exiger explicitement un accès racine pour rendre l'expérience de bureau plus conviviale, mais elles n'appellent pas nécessairement la ligne de commande. commandes pour effectuer ces tâches.
Jeff Sereno