Как sudo решает, запрашивать ли пароль, если ему дана команда, которая на самом деле не нуждается в `sudo`?

10

При применении sudoк команде, которая на самом деле не нужна sudo,

  • иногда он не спрашивает мой пароль. Например под моим $HOME, sudo ls.

  • Но я помню, что это относится к какой-то другой команде, хотя я забыл, какая именно.

Поэтому мне было интересно, как sudoрешается, стоит ли запрашивать пароль, когда дается команда, которая на самом деле не нужна sudo? Есть ли какое-то правило при /etc/sudoersуказании этого?

Моя настоящая проблема заключается в том, что при использовании duиногда отображается «отказано в разрешении» для некоторых каталогов, а иногда нет, возможно, из-за того, что у меня нет разрешения на некоторые каталоги? Я обращаюсь sudoк duнезависимо, и думал, что меня попросят пароль независимо, но на самом деле не в моих собственных каталогах.

Тим
источник
15
Решение о том, будет ли программа делать что-то, что может сделать только root, или доступ к файлу, доступ к которому вызывающему пользователю запрещен без фактического запуска программы, является замаскированной проблемой остановки. Так что вы можете быть уверены, что это не то, что делает sudo.
Звол
2
+1 потому что, хотя вопрос основан на неправильном представлении, симптомы четко объяснены, и у него есть однозначный ответ.
dcorking

Ответы:

22

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

С точки зрения компьютера, такой вещи, как «команда, требующая sudo», не существует. Любой пользователь может попытаться выполнить любую команду. Результатом может быть только сообщение об ошибке, например «Отказано в доступе» или «Нет такого файла или каталога», но всегда можно выполнить команду.

Например, если вы работаете duв дереве каталогов с содержимым, к которому у вас нет прав доступа, вы получите ошибки разрешения. Вот что означает «отказано в разрешении». Если вы запускаете sudo du, sudo запускается duот имени пользователя root, поэтому вы не получаете ошибок прав доступа (в этом суть учетной записи root: root: всегда имеет разрешение). При запуске sudo du, duработает как корень, и sudoне участвуют вообще после того, как duначался. Встречается ли du ​​с ошибками разрешения, совершенно не имеет значения, как работает sudo.

Есть команды, которые нуждаются в sudo, чтобы сделать что-то полезное . Полезность - это человеческое понятие. Вам нужно использовать sudo (или некоторые другие методы для запуска команды от имени root), если команда делает что-то полезное, когда запускается от имени root, но не от имени вашей учетной записи.

Запрашивается ли sudo ваш пароль, зависит от двух вещей.

  1. Основываясь на конфигурации, sudo решает, нужно ли вам проходить аутентификацию. По умолчанию для sudo требуется пароль. Это можно отключить несколькими способами, в том числе установив для authenticateпараметра значение false и применив правило с NOPASSWDтегом.
  2. Если sudo требует ваш пароль, он может использовать содержимое в кэше. Это нормально, потому что причина, по которой sudo нуждается в вашем пароле, заключается не в том, чтобы аутентифицировать, кто его вызывает (sudo знает, какой пользователь его вызвал), а в том, чтобы подтвердить, что все равно вы в команде, а не кто-то, кто взял под контроль вашу клавиатуру. По умолчанию sudo готов поверить, что вы все еще в команде, если вы ввели свой пароль менее 15 минут назад (это можно изменить с помощью timeoutопции). Вам необходимо ввести пароль в том же терминале (чтобы вы оставались в системе на одном терминале, оставляли этот терминал без присмотра, а затем использовали другой терминал, кто-то можетtty_tickets

¹ почти, но это выходит за рамки этой темы.

Жиль "ТАК - перестань быть злым"
источник
Могут быть файлы, в которых исполняемый бит установлен только для пользователя root, а не для других. Это может произойти, если «для выполнения требуется root». (Просто придирчиво.)
Paŭlo Ebermann
@ PaŭloEbermann Я написал «любой пользователь может попытаться выполнить любую команду», чтобы избежать придирки к этому (редкому) случаю. Там всегда придирки :(
Жиль "
45

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

Если вы используете конфигурацию Debian по умолчанию, последняя, ​​скорее всего, задействована здесь: sudoпопросит вас ввести пароль в первый раз, когда вы будете использовать его в любом терминале, затем он будет хранить маркер аутентификации в течение определенного времени. Если вы повторно используете sudoв том же терминале в течение этого периода времени, он не будет запрашивать пароль.

Стивен Китт
источник
Спасибо. Ты имеешь в виду, sudo du /path/to/some/dirдолжен ли мне всегда нужен мой пароль, или никогда, независимо от /path/to/some/dir?
Тим
12
Да. Всегда будет нужен ваш пароль (или нет). Понятно, что если вам нужен ваш пароль, но он уже сохранен в кеше, он не предложит вам ввести его.
Dr_
5
Строго говоря, это может зависеть от пути, потому что /etc/sudoersможно указывать команды и их аргументы. Тем не менее, если вы не добавили ничего подобного sudoers(и, надеюсь, вы узнаете об этом), аргументы не будут иметь значения (равно как и команда, если у вас есть общий доступ к root через sudo ).
Стивен Китт
19
sudoне сохраняет ваш пароль в кеше, только информация о том, что ваша личность уже была проверена один раз с проверкой пароля. Поскольку sudoэто программа setuid-root, у нее уже есть все разрешения, необходимые для запуска чего-либо, как sudoersи у любого другого, но ей доверяют только то, чтобы пользователи могли использовать ее в точности так, как указано в файле, и отклоняют все другие попытки ее использования. , Вот почему так важно, что sudoэто такая маленькая и очень хорошо изученная программа.
телефонная связь
6

к команде, которая на самом деле не нуждается в sudo

Дело не в том, что команда нуждается или не нуждается в sudo. Когда ты бежишь

sudo -u user command

система выполняется commandкак user.

Будет ли вызов успешным или нет, и будет ли запрашиваться пароль, зависит от политики безопасности sudoers(обычно настраивается в /etc/sudoers).

dr_
источник