Как ОС знает, что для команды требуется sudo?

16
  1. Когда вы запускаете исполняемый файл, иногда ОС будет отказывать вам в разрешении. Например, для запуска make installпрефикса, являющегося sudoсистемным путем, не потребуется запрашивать префикс, являющийся несистемным путем sudo. Как ОС решает, что для запуска исполняемого файла потребуется больше привилегий, чем у пользователя, даже до того, как программа что-то сделает?
  2. Иногда запуску программы не будет отказано в разрешении, но программа сможет делать больше вещей, если она запускается sudo. Например, при работе duв каком-либо системном каталоге только с sudoего помощью можно будет получить доступ к некоторому каталогу. Почему ОС не отказывает в разрешении на запуск такой программы или предпочитает дружественное уведомление, что перед запуском программы предпочтительнее?
  3. Правда ли, что всякий раз, когда sudoработает, suбудет работать и всякий раз su, когда sudoбудет работать? или с su, пользователь может сделать больше, чем с sudo? Как ОС решает, когда sudoработает и когда suнужно?
StackExchange для всех
источник
Ответ на этот вопрос для вас, или вы хотели бы получить дополнительную информацию?
Ctrl-Alt-Delor

Ответы:

14
  1. Иногда сообщение «Отказано в доступе» происходит, например, из-за разрешений файловой системы, запрещающих вам доступ на запись. Исполняемый файл / инструмент просто проверяет, предоставляет ли файловая система достаточно разрешений для выполнения того, что вы собираетесь делать, и выдает ошибку, если файловая система отклоняет это. В других случаях инструмент сам проверит ваш идентификатор пользователя, прежде чем разрешить вам продолжить его использование.
  2. Когда вы запускаете программу, sudoвы запускаете ее под именем другого пользователя. Если этот пользователь «способен делать больше», чем ваш пользователь, и sudoконфигурация позволяет вам делать это от имени другого пользователя, тогда да, sudoпозволит вам делать больше вещей. Это не обязательно, однако. Если вы просто указываете sudoна начало командной строки, вы на самом деле думаете, что, sudoкак rootправило, вы можете делать больше вещей, чем просто смертный.
  3. Определенно нет. Чтобы использовать его, sudoвам нужно ввести свой собственный пароль пользователя, а затем вы можете делать некоторые действия от имени целевого пользователя. Чтобы использовать su, вам нужен пароль целевого пользователя, и, если он у вас есть, вы становитесь тем целевым пользователем, что касается системы, и можете делать все, что может сделать пользователь.

Смотрите также

Джозеф Р.
источник
Благодарю. "Разрешения файловой системы запрещают вам доступ для записи" = "режим доступа к файлу не имеет установленного для пользователя бита выполнения, который может быть установлен с помощью chmod"?
StackExchange для всех
1
@Tim На самом деле это = "режим доступа к файлу не имеет установленного бита записи для пользователя". И да, это, конечно, можно исправить, chmodесли вы являетесь владельцем файла или root.
Джозеф Р.
Требуется ли sudo, полностью и единственно зависит от того, установлен ли для пользователя бит выполнения? См. Unix.stackexchange.com/q/147052/674
StackExchange для всех,
@Tim Очевидно, что вам нужен бит выполнения, чтобы иметь возможность запустить исполняемый файл в первую очередь.
Джозеф Р.
1
@JosephR. Не очевидно. chmod 400 hello && /lib64/ld-linux-x86-64.so.2 ./helloпроизводит хороший "Привет, мир!" выход.
doneal24
24

Для целей, которые вы описали, ОС не решает, нужен ли вам sudo для первоначального запуска программы. Вместо этого, после того, как программа запускается и затем пытается сделать что-то, что не разрешено текущим пользователем (например, запись файла /usr/binдля установки новой команды), ОС предотвращает доступ к файлу. Действие по выполнению этого условия зависит от программы; makeпрекращает работу, но duпосле печати сообщения перейдет к следующему файлу / каталогу.

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

Грег Хьюгилл
источник
6

suи sudoявляются привилегированными программами. suизменяет (после успешной аутентификации) действительный и эффективный идентификатор пользователя и группы на идентификатор пользователя, которому вы su. Таким образом, suпохоже на login. Обратите внимание, что suего можно использовать для изменения любого пользователя, а не только root. sudoтакже изменяет реальные и эффективные идентификаторы пользователей и групп. До этого момента suи sudoпохожи (но не связаны), за этим они очень разные.

С помощью suвам нужно знать пароль цели, и после аутентификации вы можете делать все, что захотите, как этот пользователь. Использование suможет быть ограничено установкой SU_WHEEL_ONLYв /etc/login.defs. Если он установлен, wheelмогут использовать только пользователи в группе su, в противном случае это не ограничено. Кроме того, suэто все или ничего.

sudoсовершенно другой по отношению к этому. С sudoего помощью вы можете определить довольно сложные политики в /etc/sudoersотношении того, что sudoразрешено делать sudoer (вызывающему пользователю ). Например, вы можете определить политики, в которых определенные пользователи могут запускать только определенные программы с определенными привилегиями, в то время как другие пользователи могут запускать другие программы с другими привилегиями.

Одной из ярких особенностей sudoявляется то, что вы можете настроить его так, что пользователь должен аутентифицировать себя с помощью своего собственного пароля (а не пароля цели). Таким образом, sudoон стал очень популярным среди администраторов, поскольку он позволяет авторизовать пользователей выполнять только определенные привилегированные операции, не выдавая пароль суперпользователя, плюс вы получаете некоторую степень ответственности.

countermode
источник
2

tl; dr Доступ определяется пользователем, который запускает приложение, и sudoзапускает приложения как другой пользователь.

Полная версия:

Как ОС знает, что для команды требуется sudo?

Это не знает. UNIX управляет разрешениями не на уровне приложения, а на уровне файловой системы: пользователям предоставляются разрешения на доступ к определенным файлам. Затем приложения запускаются от имени пользователя - с каждым запущенным процессом связан пользователь, связанный с ним. Этот пользователь используется для определения разрешений для этого приложения. Sudo работает путем запуска приложений от имени другого пользователя (с разрешениями, связанными с этим другим пользователем), а именно с правами rootсуперпользователя.

Что касается ваших примеров:

  1. Если у пользователя есть права на запись в определенный каталог, он может make installв этот каталог. В противном случае они могут rootсделать это - используя sudo.

  2. Если вы не можете получить доступ к файлам в каталоге, duзапуск для вас также не может получить к нему доступ. rootможет получить доступ практически к каждому файлу, поэтому sudo du( duзапускать от имени root) может получить доступ к ним тоже.

Правда ли, что всякий раз, когда sudo работает, su также работает, и всякий раз, когда su работает, sudo также работает?

Да и нет. Да, если программа на самом деле работать, он должен вести себя так же , как при sudoи su. Тем не менее, sudoобеспечивает более детальный контроль над тем, кто может что выполнять, с помощью набора правил, хранящихся в /etc/sudoersфайле. suпроще - если вы знаете пароль целевого пользователя, вы можете запускать программы от имени этого пользователя.

Последнее замечание: как приложение обрабатывает отказ в доступе (когда оно прерывает, игнорирует или предупреждает пользователя), зависит от приложения.

el.pescado
источник
1

Ни у кого еще нет ✓, поэтому я составил ответ, в котором есть все, о чем я мог подумать.

1 Когда вы запускаете исполняемый файл, иногда ОС будет отказывать вам в разрешении. Например, для запуска make install с префиксом, являющимся системным путем, потребуется sudo, в то время как с префиксом, являющимся несистемным путем, sudo не будет запрашиваться. Как ОС решает, что для запуска исполняемого файла потребуется больше привилегий, чем у пользователя, даже до того, как программа что-то сделает?

Нет, это не делается при запуске исполняемого файла. Это делается, когда исполняемый файл пытается что-то сделать.

Os проверяет разрешения и возможности файловой системы (они не охватываются разрешениями файловой системы и включают в себя уменьшение уровня nice, mknode, некоторые низкоуровневые сетевые компоненты, уничтожение других процессов, перезагрузку, установку времени и т. Д.). Если у вас нет разрешений, вы не сможете этого сделать. Root обладает полным набором возможностей, включая CAP_DAC_OVERRIDE (игнорировать права доступа к файлу).

2 Иногда запуску программы не будет отказано в разрешении, но программа сможет делать больше вещей, если она запускается с помощью sudo. Например, при запуске du в каком-либо системном каталоге только с помощью sudo он сможет получить доступ к некоторому каталогу. Почему ОС не отказывает в разрешении на запуск такой программы или предпочитает дружественное уведомление, что перед запуском программы предпочтительнее?

ОС не может знать, что будет делать программа. Таким образом, программа должна проверить права доступа до ее запуска и решить, что делать. Это не должно делать это все же.

Примечание: на андроиде есть манифест, в котором приложение объявляет, какие привилегии оно может использовать. ОС уничтожит любое приложение, которое пытается использовать привилегию, которую не объявляет, и ОС не всегда гарантирует, что привилегия может быть соблюдена. например, доступ к сети может быть недоступен.

2 Правда ли, что всякий раз, когда sudo работает, su также работает, и всякий раз, когда su работает, sudo также работает? или с su пользователь может сделать больше, чем с sudo? Как ОС решает, когда sudo работает и когда нужен su?

sudoи suделать примерно то же самое. Некоторые различия заключаются в обработке переменных среды и других подобных проблемах безопасности. Однако оба они являются инструментами, позволяющими вам стать другим пользователем, и оба имеют пользователя root по умолчанию.

su был оригинальный инструмент, он требует от вас ввести пароль пользователя / группы, на которую вы меняете.

sudoявляется более новым и требует по умолчанию ввода собственного пароля, но его можно настроить так, чтобы он принимал пароль пользователя / группы, на которую вы переключаетесь, или вообще не вводил пароль. Он также позволяет много настроек, с какими командами он будет работать, для кого и как он будет аутентифицироваться с помощью этой программы для этого пользователя на этом компьютере. Кроме того, sudoeditэто является частью sudoи может использоваться, чтобы разрешить редактирование от имени другого пользователя и избежать проблемы безопасности субшиллинга из редактора (вызов exec из редактора для запуска произвольного процесса с повышенными привилегиями).

Ctrl-Alt-Делор
источник