web-dev-qa-db-fra.com

su vs Sudo -s vs Sudo -i vs Sudo bash

Quelle est la différence entre les commandes suivantes:

su
Sudo -s
Sudo -i
Sudo bash

Je sais pour su j'ai besoin de connaître le mot de passe root, et pour Sudo je dois être dans le fichier sudoers, mais une fois exécuté, quelle différence?

Je sais qu'il y a une différence entre su et Sudo -s car mon répertoire personnel est /root après avoir exécuté su, mais mon répertoire personnel est toujours /home/myname après Sudo -s. Mais je soupçonne que ce n'est qu'un symptôme d'une différence sous-jacente qui me manque.

93
Snitse

Avec su, vous devenez un autre utilisateur - root par défaut, mais potentiellement un autre utilisateur. Si tu le dis su -, votre environnement est également remplacé par l'environnement de connexion de cet utilisateur, de sorte que ce que vous voyez ne se distingue pas de la connexion en tant qu'utilisateur. Il n'y a aucun moyen que le système puisse dire ce que vous faites pendant que su 'd à un autre utilisateur à partir des actions de cet utilisateur lorsqu'il se connecte.

Les choses sont très différentes avec Sudo:

  • Les commandes que vous exécutez via Sudo exécutent en tant qu'utilisateur cible - root par défaut, mais modifiables avec -u - mais il enregistre les commandes que vous exécutez, en les marquant avec votre nom d'utilisateur afin que le blâme puisse être attribué par la suite. :)

  • Sudo est très flexible. Vous pouvez limiter les commandes qu'un utilisateur donné ou un groupe d'utilisateurs sont autorisés à exécuter, par exemple. Avec su, c'est tout ou rien.

    Cette fonctionnalité est généralement utilisée pour définir des rôles. Par exemple, vous pouvez définir un groupe de "sauvegardes" autorisé à exécuter dump et tar, chacun ayant besoin d'un accès root pour sauvegarder correctement le disque système.

    Je le mentionne ici parce que cela signifie que vous pouvez donner à quelqu'un Sudo des privilèges sans lui donner Sudo -s ou Sudo bash capacités. Ils n'ont que les autorisations dont ils ont besoin pour faire leur travail, alors qu'avec su ils ont exécuté tout le système. Vous devez cependant faire attention à cela: si vous donnez à quelqu'un la possibilité de dire Sudo vi, par exemple, ils peuvent utiliser Shell sur vi et avoir effectivement la même puissance qu'avec Sudo -s.

  • Parce qu'il prend le mot de passe du sudoer au lieu du mot de passe root, Sudo isole l'autorisation entre plusieurs sudoers.

    Cela résout un problème administratif avec su, c'est-à-dire que lorsque le mot de passe root change, tous ceux qui devaient le connaître pour utiliser su devaient être informés. Sudo permet aux mots de passe des sudoers de changer indépendamment. En fait, il est courant de verrouiller par mot de passe le compte de l'utilisateur root sur un système avec Sudo pour forcer toutes les tâches sysadmin à être effectuées via Sudo. Dans une grande organisation avec de nombreux sudoers de confiance, cela signifie que lorsque l'un des administrateurs système quitte, vous n'avez pas à modifier le mot de passe root et à le distribuer aux administrateurs qui restent.

La principale différence entre Sudo bash et Sudo -s est-ce -s est plus court et vous permet de passer des commandes à exécuter dans le shell par défaut de votre utilisateur de plusieurs manières:

  1. Tu peux dire Sudo -s some-command qui s'exécute some-command sous votre Shell. C'est essentiellement un raccourci pour Sudo $Shell -c some-command.

  2. Vous pouvez à la place passer les commandes à l'entrée standard du shell, comme Sudo -s < my-Shell-script. Vous pouvez l'utiliser avec un heredoc pour envoyer plusieurs commandes à un seul appel Sudo, évitant ainsi d'avoir à taper Sudo à plusieurs reprises.

Ces deux comportements sont facultatifs. Plus souvent, vous donnez -s seul, il exécute donc le shell de votre utilisateur de manière interactive. Dans ce mode, il diffère de Sudo bash en ce sens qu'il peut exécuter un Shell différent de bash, car il apparaît d'abord dans la variable d'environnement Shell, puis s'il n'est pas défini, au paramètre Shell de connexion de votre utilisateur, généralement dans /etc/passwd.

Le shell géré par Sudo -s hérite de votre environnement utilisateur actuel. Si ce que vous voulez réellement est un environnement propre, comme vous obtenez juste après la connexion, ce que vous voulez à la place est Sudo -i, un ajout relativement récent à Sudo. Grosso modo, Sudo -i est à Sudo -s comme su - est à su: il réinitialise toutes les variables d'environnement sauf quelques-unes et vous renvoie au répertoire personnel de votre utilisateur. Si vous ne lui donnez pas non plus de commandes pour s'exécuter sous ce shell via une entrée standard ou Sudo -i some-command, il exécutera ce shell en tant que shell de connexion interactif, de sorte que les scripts de démarrage du shell de votre utilisateur (par exemple .bash_profile) exécutez à nouveau.

Tout cela fait Sudo -i considérablement plus sûr que Sudo -s. Pourquoi? Parce que si quelqu'un peut modifier votre environnement avant Sudo -s, ils pourraient entraîner l'exécution de commandes involontaires. Le cas le plus évident est de modifier Shell, mais cela peut aussi se produire moins directement, comme via PAGER si vous dites man foo sous Sudo -s.

Vous pourriez dire: "S'ils peuvent modifier PAGER, ils peuvent modifier PATH, puis ils peuvent simplement remplacer un mauvais programme Sudo", mais quelqu'un de suffisamment paranoïaque peut dire /usr/bin/Sudo /bin/bash pour éviter ce piège. Vous n'êtes probablement pas si paranoïaque que vous évitez également les pièges dans toutes les autres variables d'environnement sensibles, cependant. Vous êtes-vous également souvenu de vérifier EDITOR, par exemple, avant d'exécuter une commande VCS ? Donc Sudo -i.

Parce que Sudo -i transforme également votre répertoire de travail en répertoire de base de votre utilisateur, vous pouvez toujours utiliser Sudo -s pour les situations où vous savez que vous souhaitez rester dans le même répertoire que vous étiez cd 'lorsque vous avez exécuté Sudo. Il est toujours plus sûr de Sudo -i et cd de retour là où vous étiez, cependant.

122
Warren Young

À partir d'un buntuforums post J'ai fait il y a un moment:

Considérez l'expérience suivante:

applic@ion:~% Sudo su
[Sudo] password for applic:
root@ion:/home/applic# env > /tmp/Sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% Sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/Sudo_s

Voici les différences que j'ai trouvées:

Avec Sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Avec Sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Remarquez la différence entre $HOME. Être root et avoir $HOME réglé sur le domicile normal de l'utilisateur peut entraîner des problèmes. Par exemple, si vous exécutez une application graphique, le ~/.Xauthority peut être écrasé par root. Cela provoque des problèmes utilisateur normaux plus tard, tels que l'impossibilité d'exécuter certaines applications graphiques via cron.

Résumer:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
Sudo -i     Y       Y[2]                 N
Sudo -s     N       Y[2]                 Y
Sudo bash   N       Y[2]                 Y
Sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games probablement défini par /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

La ligne de fond est Sudo -i est la commande appropriée à exécuter lorsque vous voulez un shell racine non corrompu par l'environnement de l'utilisateur.

27
unutbu

su (s witch ser ou s ubstitute ser) vous permet de changer d'utilisateur. su démarre essentiellement une autre instance Shell avec les privilèges de l'utilisateur prévu. Par défaut, il vous fait basculer vers l'utilisateur root, si nous voulons changer d'utilisateur spécifique, nous devons passer l'utilisateur comme suit:

$ su bob  # switches to bob (requires bob's password)

su - signifie que les variables d'environnement seront réinitialisées à la racine et su signifie les variables d'environnement comme ancien utilisateur.

par exemple: le répertoire personnel de root si vous utilisez su - ou l'ancien répertoire personnel de l'utilisateur si vous utilisez su.

Sudo (s uper ser do) est un utilitaire de ligne de commande qui permet aux utilisateurs d'exécuter des programmes avec les privilèges de sécurité d'un autre utilisateur, en la valeur par défaut est superutilisateur, c'est-à-dire root. Il utilise un fichier de configuration /etc/sudoers qui répertorie quels utilisateurs ont des droits sur des actions spécifiques

Sudo doit être lu comme / ˈsuːduː /. syntaxe Sudo command c'est-à-dire s witch ser et do cette commande.

  • su est équivalent à Sudo -i et simule une connexion au compte root. Votre répertoire de travail sera /root, et il lira .profile etc. L'invite passera de $ à #, indiquant que vous avez un accès root.

  • Sudo -s lance un Shell en tant que root, mais ne change pas votre répertoire de travail.

  • Sudo bashbash est la commande à exécuter avec Sudo. Cette commande exécute bash en tant que super utilisateur.

  • L'utilisation de Sudo peut être enregistrée tout ce que quelqu'un fait.
  • L'utilisation de Sudo empêche un utilisateur d'avoir à connaître le mot de passe root.
  • En utilisant Sudo nous pouvons limiter les commandes autorisées à s'exécuter.
9
Premraj