su vs sudo -s vs sudo -i vs sudo bash

89

Quelle est la différence entre les commandes suivantes:

su
sudo -s
sudo -i
sudo bash

Je sais que suj'ai besoin de connaître le mot de passe root et que sudoje dois être dans le sudoersfichier, mais une fois exécuté, quelle est la différence?

Je sais qu'il y a une différence entre suet sudo -sparce que mon répertoire personnel est /rootaprès l'exécution su, mais mon répertoire personnel est toujours /home/mynameaprès sudo -s. Mais je soupçonne qu’il s’agit simplement d’un symptôme d’une différence sous-jacente qui me manque.

Snitse
la source
3
Je préfère utiliser De sudo su - cette façon, vous n'avez pas besoin du mot de passe root et -vous assurez que le répertoire personnel est défini correctement.
Jens Timmerman

Réponses:

114

Avec su, vous devenez un autre utilisateur - root par défaut, mais potentiellement un autre utilisateur. Si vous dites su -, votre environnement est également remplacé par l'environnement de connexion de cet utilisateur, de sorte qu'il est impossible de distinguer ce que vous voyez de la connexion en tant qu'utilisateur. Le système ne peut en aucun cas dire ce que vous faites suà un autre utilisateur à partir des actions qu'il a effectuées lorsqu'il se connecte.

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

  • Les commandes que vous exécutez sudo s'exécutent en tant qu'utilisateur cible - racine par défaut, mais -upouvant être modifiées - mais il enregistre les commandes que vous exécutez, en les étiquetant avec votre nom d'utilisateur afin que le blâme puisse être attribué ultérieurement. :)

  • sudoest très flexible. Vous pouvez par exemple limiter les commandes qu'un utilisateur ou un groupe d'utilisateurs donné est autorisé à exécuter. 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é à s'exécuter dumpet ayant tarchacun besoin d'un accès root pour sauvegarder correctement le disque système.

    Je mentionne cela ici parce que cela signifie que vous pouvez donner à quelqu'un des sudoprivilèges sans lui donner sudo -sni sudo bashcapacités. Ils ne disposent que des autorisations nécessaires pour effectuer leur travail, alors suqu'ils disposent de l'ensemble du système. Vous devez cependant faire attention à cela: si vous donnez à quelqu'un la possibilité de dire sudo vi, par exemple, il peut se défaire de viet avoir effectivement le même pouvoir qu'avec sudo -s.

  • Puisqu'il prend le mot de passe sudoer au lieu du mot de passe root, sudoisole l'autorisation entre plusieurs sudoers.

    Cela résout un problème administratif avec su, qui est que lorsque le mot de passe root change, tous ceux qui devaient le connaître pour pouvoir utiliser sudevaient être prévenus. sudopermet 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 sudopour forcer toutes les tâches sysadmin à être effectuées via sudo. Dans une grande entreprise comptant de nombreux utilisateurs de confiance, cela signifie que lorsqu'un des administrateurs système quitte son poste, vous n'avez pas besoin de changer le mot de passe root et de le distribuer aux administrateurs qui restent.

La principale différence entre sudo bashet sudo -sest qu’elle -sest plus courte et vous permet de transmettre des commandes à exécuter dans le shell par défaut de votre utilisateur de plusieurs manières:

  1. Vous pouvez dire sudo -s some-commandqui court some-commandsous votre coquille. C'est essentiellement un raccourci pour sudo $SHELL -c some-command.

  2. Vous pouvez plutôt transmettre les commandes à l'entrée standard du shell, par exemple sudo -s < my-shell-script. Vous pouvez utiliser cela avec un heredoc pour envoyer plusieurs commandes à un seul sudoappel, évitant ainsi la nécessité de taper de manière sudorépétée.

Ces deux comportements sont facultatifs. Beaucoup plus communément, vous donnez -sseul, de sorte qu'il exécute simplement le shell de votre utilisateur de manière interactive. Dans ce mode, il diffère du sudo bashfait qu'il peut exécuter un shell différent de celui utilisé bash, car il apparaît d'abord dans la SHELLvariable d'environnement, puis s'il est non défini, au paramètre de shell de connexion de l'utilisateur, généralement défini dans /etc/passwd.

Le shell exécuté sudo -shérite de votre environnement utilisateur actuel. Si ce que vous voulez réellement est un environnement propre, comme ce que vous obtenez juste après la connexion, vous souhaitez plutôt sudo -iun ajout relativement récent sudo. En gros, sudo -ic’est sudo -scomme cela su -est su: il réinitialise presque toutes les variables d’environnement clés et vous renvoie au répertoire de base de votre utilisateur. Si vous ne lui donnez pas également de commandes à exécuter sous ce shell via une entrée standard ou sudo -i some-command, il l'exécutera comme un shell de connexion interactif, de sorte que les scripts de démarrage du shell de votre utilisateur (par exemple .bash_profile) seront exécutés à nouveau.

Tout cela rend sudo -iconsidérablement plus sûr que sudo -s. Pourquoi? Parce que si quelqu'un peut modifier votre environnement auparavant sudo -s, cela pourrait entraîner l'exécution de commandes imprévues. Le cas le plus évident est celui de la modification SHELL, mais cela peut aussi arriver moins directement, comme via PAGERsi vous dites man foosous sudo -s.

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

Etant donné sudo -ique votre répertoire de travail est également remplacé par le répertoire de base de votre utilisateur, vous pouvez toujours l'utiliser sudo -spour les situations dans lesquelles vous savez que vous souhaitez rester dans le même répertoire que celui cddans lequel vous étiez auparavant sudo. Il est toujours plus sûr de sudo -iet cdà l' endroit où vous étiez, cependant.

Warren Young
la source
2
Que voulez-vous dire par "shell out of vi"?
Crisron
11
@crisron: à l'intérieur vi, tapez :shet appuyez sur Entrée. Vous êtes maintenant dans un sous-shell, avec tous les privilèges du viprocessus qui a engendré ce shell. Si viest exécuté avec les privilèges root, le shell le sera également. Ou bien, vous pouvez exécuter autre chose qu'un shell via :!cmd, lire le résultat d'une commande dans le tampon d'édition via :r !cmd, etc. Si tous ceux-ci sont verrouillés, les Makefilecibles sont des scripts shell et Vim dispose de la :makecommande, ce qui vous permet en réalité d'exécuter un shell arbitraire. scripts de l'éditeur. Les possibilités de méfait sont beaucoup trop vastes pour que cette boîte à commentaires puisse tenir.
Warren Young
2
si quelqu'un peut mettre un faux en bash dans votre PATH, il peut alors mettre un faux sudo dans votre PATH. pour être vraiment sûr que vous devez invoquer sudo en utilisant le chemin complet:/usr/bin/sudo
lesmana
1
@lesmana: J'ai abordé cela dans une édition. En gros, ce PATHn’est pas le seul problème.
Warren Young
6
Grande explication; grand mal de tête en le lisant.
lobi
27

D'un post d'ubuntuforums que j'ai publié il y a quelque temps:

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 dans $HOME. Le fait d'être root et de s'être $HOMEinstallé au domicile de l'utilisateur normal peut causer des problèmes. Par exemple, si vous exécutez une application graphique, l'utilisateur normal ~/.Xauthoritypeut être écrasé par root. Cela pose ultérieurement des problèmes normaux à l'utilisateur, comme 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 fixé par /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

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

unutbu
la source
1
La "contamination" de l'environnement dépend également de la configuration de sudo(dans /etc/sudoersles fichiers associés). Les paramètres de configuration tels que always_set_home, env_reset, env_keep, env_checket env_reset, et ceux - ci peuvent varier en fonction de l'utilisateur et commande. Reportez-vous à la section "Environnement de commande" et à la section OPTIONS DE SUDOERS de la page de manuel sudoers (5) .
Curt J. Sampson
Personnellement, j'y vais sudo -Hsquand je veux un environnement non modifié par mes paramètres, parce que j'utilise zsh et tous les comptes d'application que je pourrais changer pour utiliser bash. Cela laisse un certain nombre de variables d’environnement passer sans encombre, mais je trouve généralement que celles qui sont importantes sont écrasées par /etc/profile.d/*.
Ed Grimm
7

su( De sorcière u ser ou s ubstitute u utilisateur vous permet de passer de ser). sudémarre en principe une autre instance de shell avec les privilèges de l'utilisateur prévu. Par défaut, il vous renvoie à l' rootutilisateur. Si nous voulons changer d'utilisateur, nous devons le transmettre 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 suque les variables d’environnement seront remplacées par un ancien utilisateur.

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

sudo ( s uper u ser ne ) 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 par défaut est super - utilisateur -à- dire root. Il utilise un fichier de configuration /etc/sudoersqui répertorie les utilisateurs ayant des droits sur des actions spécifiques.

sudo doit être lu comme / ˈsuːduː / . syntaxe -à- sudo commanddire de sorcière u de ser et faire cette commande.

  • suest équivalent à sudo -iet simule une connexion au compte root. Votre répertoire de travail sera /root, et il lira les répertoires root .profileetc. 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 bashbashest la commande à exécuter avec sudo. Cette commande est exécutée en bashtant que super utilisateur.

  • Utilisation sudopeut être connecté tout ce que quelqu'un fait.
  • L'utilisation sudoévite à l'utilisateur de connaître le mot de passe root.
  • En utilisant sudonous pouvons limiter les commandes sont autorisées à exécuter.
Premraj
la source