Су против Судо -s против Судо -i против Судо Баш

89

В чем разница между следующими командами:

su
sudo -s
sudo -i
sudo bash

Я знаю, потому что suмне нужно знать пароль root, и sudoя должен быть в sudoersфайле, но когда он будет выполнен, какая разница?

Я знаю, что есть разница между suи sudo -sтем, что мой домашний каталог находится /rootпосле того, как я выполню su, но мой домашний каталог все еще /home/mynameпосле sudo -s. Но я подозреваю, что это всего лишь симптом основного различия, которое я пропускаю.

Snitse
источник
3
Я предпочитаю использовать sudo su - этот способ, вам не нужен пароль root, и он -гарантирует, что домашний каталог установлен правильно.
Дженс Тиммерман

Ответы:

114

При этом suвы становитесь другим пользователем - по умолчанию root, но потенциально другим пользователем. Если вы говорите su -, ваша среда также заменяется средой входа этого пользователя, так что то, что вы видите, неотличимо от входа в систему от имени этого пользователя. Система не может сказать, что вы делаете в то время, как вы выполняете suдействия другого пользователя при входе в систему.

Вещи очень разные с sudo:

  • Команды, которые вы запускаете через sudo execute как целевой пользователь - по умолчанию root, но изменяемые с помощью -u- но он регистрирует команды, которые вы выполняете через него, помечая их своим именем пользователя, чтобы потом можно было назначить вину. :)

  • sudoочень гибкий. Например, вы можете ограничить количество команд, которые могут выполнять данный пользователь или группа пользователей. С suэтим все или ничего.

    Эта функция обычно используется для определения ролей. Например, вы могли бы определить группу «резервных копий», которую разрешено запускать, dumpи для tarкаждой из которых необходим root-доступ для правильного резервного копирования системного диска.

    Я упоминаю об этом здесь, потому что это означает, что вы можете дать кому-то sudoпривилегии, не давая им sudo -sили sudo bashспособностям. У них есть только те разрешения, которые им необходимы для выполнения своей работы, в то время как suу них запущена вся система. Вы должны быть осторожны с этим, хотя: если вы даете кому-то возможность сказать sudo vi, например, они могут вырваться viи эффективно иметь ту же силу, что и с sudo -s.

  • Поскольку он принимает пароль пользователя sudoer вместо пароля root, sudoизолирует разрешение между несколькими пользователями sudoer.

    Это решает административную проблему su, заключающуюся в том, что при смене пароля root нужно было сообщить всем, кто должен был его знать su. sudoпозволяет пароли sudoers изменить самостоятельно. Фактически, это обычная блокировка паролем учетной записи пользователя root в системе, с помощью которой sudoвсе задачи sysadmin должны выполняться через нее sudo. В большой организации со многими доверенными пользователями sudo это означает, что когда один из системных администраторов уходит, вам не нужно менять пароль root и распространять его среди оставшихся администраторов.

Основное различие между sudo bashи sudo -sзаключается в том, что -sон короче и позволяет передавать команды для выполнения в стандартной оболочке вашего пользователя двумя способами:

  1. Вы можете сказать, sudo -s some-commandчто работает some-commandпод вашей оболочкой. Это в основном сокращение для sudo $SHELL -c some-command.

  2. Вместо этого вы можете передавать команды на стандартный ввод оболочки, например sudo -s < my-shell-script. Вы можете использовать это с помощью heredoc для отправки нескольких команд на один sudoвызов, избегая необходимости sudoповторного ввода .

Оба эти поведения являются необязательными. Чаще всего вы даете в -sодиночку, поэтому он просто запускает оболочку вашего пользователя в интерактивном режиме. В этом режиме он отличается sudo bashтем, что может запускать другую оболочку, отличную от той, которая выполняется bashсначала в SHELLпеременной среды, а затем, если она не установлена, в настройках оболочки входа пользователя, обычно в /etc/passwd.

Оболочка, запущенная пользователем, sudo -sнаследует вашу текущую пользовательскую среду. Если то, что вы действительно хотите, это чистая среда, как вы получаете сразу после входа в систему, то, что вы хотите вместо этого sudo -i, является относительно недавним дополнением к sudo. Грубо говоря, sudo -iэто sudo -sкак su -есть su: он сбрасывает все, кроме нескольких ключевых переменных среды, и отправляет вас обратно в домашний каталог вашего пользователя. Если вы также не дадите ей команды для запуска под этой оболочкой через стандартный ввод или sudo -i some-command, она запустит эту оболочку как интерактивную оболочку входа в систему, так что сценарии запуска оболочки вашего пользователя (например .bash_profile) будут запущены снова.

Все это делает sudo -iзначительно более безопасным, чем sudo -s. Почему? Потому что если кто-то может изменить вашу среду раньше sudo -s, это может привести к выполнению непреднамеренных команд. Наиболее очевидный случай - это модификация SHELL, но она также может происходить реже, например, через, PAGERесли вы говорите, man fooнаходясь под sudo -s.

Вы можете сказать: «Если они могут изменить PAGER, они могут изменить PATH, и тогда они могут просто заменить злую sudoпрограмму», но кто-то достаточно параноик может сказать, /usr/bin/sudo /bin/bashчтобы избежать этой ловушки. Вы, вероятно, не настолько параноик, что вы также избегаете ловушек во всех других восприимчивых переменных окружения. Вы также не забыли проверить EDITOR, например, перед выполнением любой команды VCS ? Таким образом sudo -i.

Поскольку sudo -iваш рабочий каталог также изменяется на домашний каталог вашего пользователя, вы все равно можете использовать его sudo -sв тех ситуациях, когда вы знаете, что хотите остаться в том же каталоге, в котором находились cdпри запуске sudo. Это все еще безопаснее sudo -iи cdобратно туда, где вы были, хотя.

Уоррен Янг
источник
2
Что вы подразумеваете под «оболочкой из vi»?
Crisron
11
@crisron: изнутри viнапечатайте :shи нажмите Enter. Теперь вы находитесь в подчиненной оболочке со всеми привилегиями viпроцесса, который породил эту оболочку. Если viзапущен с правами root, то и оболочка. Или вы можете запустить что-то кроме оболочки через :!cmd, прочитать вывод команды из буфера редактирования через :r !cmdи т. Д. Если все они заблокированы, Makefileцели - это скрипты оболочки, а у Vim есть :makeкоманда, которая эффективно позволяет запускать произвольную оболочку. скрипты из редактора. Возможности для озорства слишком велики, чтобы это поле для комментариев имело место.
Уоррен Янг
2
если кто-то может вставить в ваш путь PATH поддельный bash, то этот человек может добавить в ваш путь PATH поддельный sudo. чтобы быть уверенным, что вы должны вызывать sudo, используя полный путь:/usr/bin/sudo
lesmana
1
@lesmana: я обратился к этому в редактировании; в принципе, PATHэто не единственная проблема.
Уоррен Янг
6
Отличное объяснение; большая головная боль при чтении.
Лоби
27

Из поста Ubuntuforums, который я сделал недавно:

Рассмотрим следующий эксперимент:

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

Вот различия, которые я нашел:

С 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

С 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

Обратите внимание на разницу в $HOME. Будучи пользователем root и $HOMEустановив дом обычного пользователя, может вызвать проблемы. Например, если вы запускаете графическое приложение, обычный пользователь ~/.Xauthorityможет быть перезаписан пользователем root. В дальнейшем это вызывает обычные пользовательские проблемы, такие как невозможность запуска определенных графических приложений через cron.

Обобщить:

                                     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 вероятно установлено /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Нижняя строка - sudo -iэто правильная команда для запуска, когда вам нужна корневая оболочка, которая не поддерживается средой пользователя.

unutbu
источник
1
Степень «загрязненности» среды также зависит от конфигурации sudo/etc/sudoersи связанных файлах). Параметры конфигурации , такие как always_set_home, env_reset, env_keep, env_checkи env_reset, и они могут варьироваться в зависимости от пользователя и команды. Смотрите «Командная среда» и SUDOERS OPTIONS часть из sudoers (5) Manpage.
Курт Дж. Сэмпсон
Лично я продолжаю, sudo -Hsкогда хочу, чтобы окружение не зависело от моих настроек, потому что я использую zsh и все учетные записи приложений, которые я мог бы изменить, чтобы использовать bash. Это позволяет определенному числу переменных среды проходить без изменений, но я обычно нахожу те, которые имеют значение, перезаписываются /etc/profile.d/*.
Эд Гримм
7

su( S ведьма у Ser или с ubstitute у сер) позволяет переключать пользователя. suв основном запускает другой экземпляр оболочки с привилегиями предполагаемого пользователя. По умолчанию он переключает вас на rootпользователя, если мы хотим переключить конкретного пользователя, нам нужно передать пользователя следующим образом:

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

su -означает, что переменные среды будут сброшены в корень и suозначает переменные среды как старый пользователь.

например: домашний каталог пользователя root, если вы используете, su -или домашний каталог старого пользователя, если вы его используете su.

Судо ( s уперло у сер делать ) это утилита командной строки , которая позволяет пользователям запускать программы с привилегиями безопасности другого пользователя, по умолчанию суперпользователя т.е. root. Он использует файл конфигурации, в /etc/sudoersкотором указывается, какие пользователи имеют права на определенные действия

sudo следует читать как / ˈsuːduː / . Синтаксис sudo commandт.е. с ведьмой ˙U сер и сделать эту команду.

  • suэквивалентно sudo -iи имитирует вход в систему с учетной записью root. Ваш рабочий каталог будет /root, и он будет читать root'ы и .profileт. Д. Приглашение изменится с $ на #, указывая, что у вас есть root-доступ.

  • sudo -s запускает оболочку как root, но не меняет ваш рабочий каталог.

  • sudo bash где bashкоманда для запуска sudo. Эта команда запускается bashкак суперпользователь.

  • Использование sudoможет быть зарегистрировано все, что кто-то делает.
  • Использование не sudoпозволяет пользователю знать пароль пользователя root.
  • С помощью sudoмы можем ограничить команды, разрешенные для запуска.
Premraj
источник