Почему команде sudo не нужен пароль root?

Я использую Linux какое-то время, и всякий раз, когда я набирал sudo я думал, что переключился на пользователя root для команды.

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

Я не уверен, как Ubuntu настраивает мою первую учетную запись. Есть ли пользователь root? Я корень? Я предполагаю, что я только что создал нового пользователя при установке, но он дал мне права root? Просто немного запутался здесь …

Итак, почему мне разрешено запускать корневые команды с помощью пароля пользователя?

В деталях он работает следующим образом:

  1. /usr/bin/sudo имеет установленный бит setuid , поэтому даже когда он выполняется другим пользователем, он запускается с идентификатором пользователя владельца файла (в этом случае root).

  2. sudo проверяет в /etc/sudoers какие привилегии у вас есть и разрешено ли вам запускать вызываемую вами команду. Говоря просто, /etc/sudoers – это файл, который определяет, какие пользователи могут запускать команды, используя механизм sudo .

    Вот как выглядит этот файл на моем Ubuntu:

     # User privilege specification root ALL=(ALL:ALL) ALL # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL 

    Третья строка – это то, что, по-видимому, вас интересует. Он позволяет любому в группе «sudo» выполнять любую команду как любой пользователь.

    Когда Ubuntu устанавливает первую учетную запись во время установки, добавьте эту учетную запись в группу «sudo». Вы можете проверить, к каким группам относятся пользователи с group командой.

  3. sudo запрашивает у вас пароль. Что касается того, что ему нужен пароль пользователя, а не корневой, это выдержка из руководства sudoers :

    Аутентификация и регистрация

    Политика безопасности sudoers требует, чтобы большинство пользователей аутентифицировались, прежде чем они смогут использовать sudo. Пароль не требуется, если вызывающий пользователь является root, если целевой пользователь совпадает с вызывающим пользователем, или если политика отключила проверку подлинности для пользователя или команды. В отличие от su (1), когда sudoers требует аутентификации, он проверяет учетные данные вызывающего пользователя, а не учетные данные целевого пользователя (или root). Это можно изменить с помощью флагов rootpw, targetpw и runaspw, описанных ниже.

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

     %sudo ALL=(ALL:ALL) NOPASSWD: ALL 
  4. После аутентификации sudo запускает дочерний процесс, который запускает вызванную команду. Ребенок наследует идентификатор пользователя root от своего родителя – процесс sudo .


Итак, точно отвечая на ваши вопросы:

Я думал, что я перехожу к пользователю root для команды.

Ты был прав. Каждой команде предшествуют sudo работает с идентификатором пользователя root.

Есть ли пользователь root?

Да, есть учетная запись пользователя root, отдельно от вашей учетной записи пользователя, созданной во время установки системы. Однако по умолчанию в Ubuntu вам не разрешен вход в интерактивный терминал как пользователь root.

Я корень?

Нет, вы не корень. У вас есть привилегия запускать отдельные команды в качестве корня , используя описанный выше механизм sudo .

Итак, почему мне разрешено запускать корневые команды с помощью пароля пользователя?

Вы должны ввести пароль пользователя только из-за внутреннего механизма безопасности sudo . Его можно легко отключить. Вы получаете свои корневые ресурсы из-за бит setuid /usr/bin/sudo , а не из-за каких-либо введенных паролей.

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

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

  • Ubuntu и многие другие ОС Linux и Unix предоставляют начальную учетную запись, созданную во время установки, правом запускать любые команды с root .

  • Хотя root по-прежнему является учетной записью в Linux, прямые root входы по умолчанию отключены для лучшей безопасности и отслеживания.

Петр дал очень хорошее объяснение того, как работает sudo . Однако он действительно не мотивировал, почему он работает таким образом, поэтому я попытаюсь добавить это здесь.

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

В какой-то момент было добавлено немного больше контроля доступа: чтобы использовать su , вы должны были быть членами группы wheel . Но поскольку вы все равно можете выполнить любую команду, все равно имеет смысл потребовать от вас знать свой пароль.

Требование, чтобы пользователи знали друг друга, или пароль суперпользователя, были не очень безопасными. Часто вы просто хотите предоставить определенным пользователям ограниченный доступ к какой-либо другой учетной записи (это часть концепции безопасности, называемой принципом наименьших привилегий ). Это также затрудняет отчетность: если несколько человек знают пароль учетной записи, и эта учетная запись участвует в ошибке или злоупотреблении, вы не можете сказать, кто из них действительно это сделал.

Так было создано sudo . Вместо того, чтобы разрешать пользователям выполнять какую-либо команду, у нее есть сложный файл конфигурации, кратко затронутый в ответе Петра, который точно определяет, кто может его использовать, какие пользователи могут переключаться, и какие команды им разрешено запускать. Благодаря этому мелкомасштабному контролю над тем, кто может делать то, к кому, нам больше не нужно давать пользователям пароль целевой учетной записи; если бы мы это сделали, они могли бы легко обойти все элементы управления в файле конфигурации, войдя в систему как этот пользователь. Вместо этого мы обычно просто требуем, чтобы они доказали, что именно они вошли в систему, введя свой собственный пароль – это предназначено для того, чтобы кто-то не воспользовался учетной записью, если терминал оставлен без присмотра.

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

Ответ на ваш вопрос:

Когда вы запускаете команду с sudo , вы запускаете команду с повышенными привилегиями , то есть root priviliges . Вам нужно только ввести свой обычный пароль пользователя, потому что вы (пользователь) были добавлены в файл sudoers, который дает вам root priviliges .

Во-первых, отключение учетной записи обычно выполняется путем установки зашифрованного пароля на *, который не является зашифрованным значением любой строки. Я не могу проверить прямо сейчас, но я считаю, что это то, что Ubuntu делает и для root. Так что технически, на Ubuntu нет пароля root.

Но sudo предшествует Ubuntu; он был разработан для систем, где, безусловно, были пароли root. Так почему же он не требует пароля root? В принципе, sudo предназначен для предоставления разрешений на запуск определенных команд для определенных пользователей – например, разрешить корневому доступу разработчика к повторному запуску веб-приложения, но не запускать произвольные серверы. Знание пароля root, с другой стороны, дает вам неограниченный доступ; вы можете использовать login или su, чтобы открыть корневую оболочку и запустить произвольные команды. Поскольку sudo должен работать для людей без такого уровня доступа, он не может требовать запуска пароля root.