65 votes

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

Lorsque nous installons/supprimons/mettons à jour des paquets ou effectuons des modifications nécessitant des privilèges d'administration, nous sommes invités à saisir le mot de passe de l'utilisateur admin qui a le droit d'accès à l'information. sudo privilèges - cela se produit à la fois via l'interface graphique et le terminal.

prompt via gui

Cependant, si nous essayons d'arrêter et de redémarrer via le terminal, il se plaint 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.

cog-wheel menu

Pourquoi cette divergence ?

50voto

chaos Points 25386

L'arrêt sur 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.policy est vérifié :

<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 un dbus-send commande. Dans le cas d'un arrêt, ce serait :

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

Il y a un démon qui tourne en arrière-plan avec les privilèges de root qui invoque la commande d'arrêt pour vous.

Lorsque vous souhaitez pouvoir arrêter la machine "à l'ancienne" via la ligne de commande ( shutdown, reboot, halt, ... ), alors vous devez ajouter le suid-Bit à ces commandes. Mais attention, toute personne sur votre système, qui a accès au Shell pourrait alors arrêter votre machine.

27voto

Paul Hänsch Points 3057

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

Traditionnellement, Unix fonctionnait sur des ordinateurs centraux. Des installations informatiques centrales qui servent des dizaines ou des centaines d'utilisateurs via des terminaux distants. Comme tous les utilisateurs dépendaient de la disponibilité de l'ordinateur central, aucun utilisateur n'était autorisé à lancer une commande d'arrêt. Une idée fondamentale de l'architecture Unix - le noyau du système n'initialisera jamais un arrêt à moins que la fonction correspondante ne soit appelée par un processus super-utilisateur.

Dans les systèmes de bureau contemporains, les développeurs se sont donné beaucoup de mal pour mettre l'arrêt à la disposition du simple utilisateur du 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 émet une requête au gestionnaire de connexion pour arrêter l'ordinateur. Cela implique l'utilisation de la communication interprocessus (IPC), généralement via le service dbus.

Le policykit mentionné ci-dessus étend ce processus en fournissant un cadre standardisé par lequel le gestionnaire de connexion (ou tout autre programme fournissant le service d'arrêt) peut vérifier quels utilisateurs sont autorisés à provoquer un arrêt, et par lequel un administrateur peut configurer ces permissions respectivement.

Certains environnements de bureau n'utilisent pas de services basés sur l'IPC mais plutôt un ensemble de programmes d'aide pour fournir des fonctions identiques ou similaires. Ces programmes d'aide sont appelés par des mécanismes permettant de passer dans le contexte du super-utilisateur, comme sudo, suid, ou un mécanisme de policykit similaire à sudo.

Dans tous les cas, le programme traditionnel d'arrêt sur le Shell ne fonctionne pas de cette façon, il nécessite de voir qu'il est exécuté dans un contexte de superutilisateur.

14voto

brs Points 36

Parce que Linux est couramment utilisé comme serveur ou similaire, et que le SSHing dans une boîte linux, même un ordinateur portable Ubuntu normal, est assez commun.

Le problème est que vous ne souhaitez peut-être pas que les personnes ayant un accès SSH puissent l'arrêter, surtout si d'autres utilisateurs connectés à distance l'utilisent. Quelqu'un qui a accès à l'interface graphique peut de toute façon l'éteindre tout seul avec le bouton d'alimentation physique.

De plus, un utilisateur connecté à distance ne pourra pas le réactiver.

14voto

Tim Points 30349

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

Seulement si vous êtes le seul à être connecté. S'il y a d'autres utilisateurs (y compris les utilisateurs de la console), vous devrez peut-être entrer un mot de passe root. C'est la même chose sur OS X et les versions plus récentes de Windows.

Pourquoi ? 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 local entre les processus fonctionnant sur le même hôte.

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

Le D-Bus a une vision structurée des données qu'il transporte, et traite les données sous forme binaire : nombres entiers de différentes largeurs, chaînes de caractères, etc. Comme les données ne sont pas de simples "octets bruts" pour D-Bus, les messages peuvent être validés.

-- Bureau libre

Pourquoi le shutdown commande juste pour vérifier si quelqu'un est connecté ? Pour être honnête, cela semble être une fonctionnalité non mercantile. Je peux imaginer que cela permettrait de gagner du temps parfois, mais une console cohérente est souvent préférée. Je ne veux pas que les commandes parfois requiert un mot de passe après son exécution, et parfois non.

Mes pronoms sont Il / Lui

9voto

Mark Bessey Points 191

La raison pour laquelle vous n'avez pas besoin d'être root pour initier un arrêt à partir de l'interface graphique est en grande partie une question de commodité pour l'utilisateur de bureau typique. Le système connaît que vous êtes l'utilisateur connecté sur la console, donc si vous éteignez l'ordinateur par erreur, vous pouvez vraisemblablement le rallumer.

Pour un utilisateur du Shell, vous pourriez très bien être connecté à distance, le système exige donc que vous soyez connecté en tant que root afin de lancer une commande d'arrêt. Cela empêche un utilisateur ordinaire connecté à un serveur de l'éteindre pendant que d'autres personnes l'utilisent, et alors qu'il n'y a pas forcément quelqu'un physiquement présent pour redémarrer l'ordinateur.

La raison pour laquelle shutdown ne fournit pas d'invite GUI pour le mot de passe du super-utilisateur est probablement simplement qu'il n'y a pas de réelle utilité à en tirer - si vous êtes sur la console, où l'invite apparaîtrait, vous pouvez simplement utiliser le menu de la roue dentée à la place. Si vous vouliez avoir une invite en ligne de commande pour le mot de passe super-utilisateur pour l'arrêt, c'est déjà disponible avec "sudo shutdown".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X