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


48

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

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

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

Так почему мне разрешено запускать команды root с паролем моего пользователя?


Используя какого пользователя вам нужен пароль, а какого нет? Какую команду вы выполняете? Помните, что sudo хранит ваш пароль некоторое время, прежде чем вам придется его повторно вводить.
Брайам

11
sudoимеет установленный бит "setuid". Таким образом, он запускается как пользователь, который владеет им (который является root на всех стандартных системах, если я не ошибаюсь), а не как пользователь, который запускает его. sudoзатем загружает /etc/sudoersфайл и проверяет, что разрешено, основываясь на том, кто его запустил.
LawrenceC


1
Мне жаль, если я повторяю что-то, что сказал кто-то другой, но я не смог найти это. Ответ: это политическое решение. Мое предположение состоит в том, что в большой установке, где у вас много людей с sudoпривилегиями, возможно, работающих в географически распределенных местах и ​​в смену 24 × 7, вы хотите иметь возможность немедленно отозвать привилегированный доступ одного человека (например, если Вы подозреваете его целостность). Если все используют один-единственный пароль root, и вы меняете его без предварительной координации, это может привести к хаосу. …
G-Man говорит: «Восстановите Монику»

1
@HagenvonEitzen Я знаю, что опаздываю на пару дней, но как это не обман нашего вопроса?
Страж

Ответы:


65

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

  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просит у вас пароль. Что касается того, что ему нужен пароль пользователя, а не пароль root, то это отрывок из руководства 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.

Я рут?

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

Так почему мне разрешено запускать команды root с паролем моего пользователя?

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


6
Ответ на самом деле должен начинаться с части setuid, потому что это действительно возможно. / etc / sudoers - только причина гибкости команды sudo.
Даниэль Куллманн

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

1
Обратите внимание, что sudo можно настроить для запроса пароля root с rootpwфлагом в sudoers.
Восстановить Монику - М. Шредер

2
На самом деле вы можете войти в систему как пользователь root: sudo su - rootименно это и даст вам корневой терминал. Однако вы не можете легко войти в сеанс рабочего стола как root.
jmiserez

1
По сути, он sudoимеет привилегию root и решает, передать ли вам это на основе файла конфигурации.
Сиюань Рен

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

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

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

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


7
Хотя прямой вход в систему по умолчанию действительно отключен, в Ubuntu по-прежнему есть учетная запись root. Это больше не учетная запись по крайней мере в Solaris, где она по умолчанию является ролью.
Jlliagre

Большое спасибо - я всегда задавался вопросом, как это сработало, и теперь это имеет больше смысла.
mikeserv

5

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

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

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

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

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

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


Я не исследовал это, но я понимаю, что одной из особенностей sudo, которой нет у su, является то, что она (умеет?) Ведет журнал того, какие команды были выполнены каким пользователем, чтобы упростить отслеживание проблем до их источники. Я только что посмотрел в своей системе Kubuntu и не вижу такого журнала, так что, возможно, это не поведение по умолчанию.
Джо

Только что нашел sudo, входящий в /var/log/auth.log - наряду с множеством других вещей, включая некоторые IP-адреса из Китая, пытающиеся получить root ssh-доступ к моей системе - так что, если вы просто хотите увидеть sudo, вам нужно отфильтровать это через grep или подобное.
Джо

Верный. suтакже регистрирует, но поскольку он только запускает новую оболочку, он просто регистрирует тот факт, что кто-то запускал ее.
Бармар

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

1
@richard Так как sudoпозволяет ограничить, какие команды может выполнять пользователь, вы можете убедиться, что вы не предоставляете им доступ к командам, которые перезаписывают журнал.
Бармар

3

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

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


2
За исключением того, что sudo не подразумевает повышенные привилегии, просто отличные от текущего пользователя. Например, вы можете запустить программу как обычный пользователь, у которого нет оболочки. Кроме того, наличие в файле sudoers не дает root.
Джеймс Токнелл

1
@aragilar yes sudoне всегда дает повышенные привилегии, но работает с повышенными привилегиями после выполнения своей задачи (проверка аутентификации может привести к удалению привилегий). Ему нужны эти повышенные привилегии, чтобы сменить пользователя.
Ctrl-Alt-Delor

1
Конечно, sudoделает использование повышенных привилегий (но это не является уникальным для SUDO, например , крепления делает также), но команда , которую вы называете то есть commandв sudo commandне может ( в зависимости от того, что происходит в /etc/sudoers).
Джеймс Токнелл

1

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

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


Это также позволяет отменить привилегии пользователя root без необходимости изменения пароля пользователя root.
Ян Д. Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.