ОП.05Пользователи, группы и sudoзанятие 5Материалы

Часть 4 из 7

Суперпользователь root и sudo

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

  1. 4.1 Суперпользователь root
  2. 4.2 Как sudo решает, можно ли выполнить команду
  3. 4.3 Журнал sudo
  4. 4.4 Оболочка root: sudo -i
  5. 4.5 Принцип минимальных привилегий

4.1 Суперпользователь root

Проверка прав, которую мы разбирали в части 3, выполняется для всех процессов, кроме одного случая. Если процесс работает с UID 0, ядро права на файлы не проверяет: такому процессу доступны чтение, изменение и удаление любого файла. Учётная запись с UID 0 называется root, или суперпользователь.

Права root нужны для задач, которые меняют систему целиком: установки программ, создания пользователей, изменения файлов в /etc. Обычная работа — редактирование кода, запуск программ, чтение документации — прав root не требует.

Пароль root в Ubuntu по умолчанию не задан, и войти под root напрямую нельзя. Вместо этого пользователь из группы sudo выполняет отдельные команды с правами root через программу sudo (substitute user do — «выполнить от имени другого пользователя»).

В терминалеПрава root
  1. sudo whoami# от чьего имени выполнена команда
    что делает

    Что делает команда. Выполняет whoami с правами root; команда печатает root.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    whoami
    вывести имя текущего пользователя
  2. sudo id
    что делает

    Что делает команда. Выполняет id с правами root; UID и GID равны 0.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    id
    вывести номера пользователя и его группы
  3. ls /root# домашний каталог root
    что делает

    Что делает команда. Пытается вывести домашний каталог root от имени обычного пользователя; доступа нет.

    По частям:

    ls
    вывести содержимое каталога
    /root
    что показать (абсолютный путь)
  4. sudo ls -a /root# тот же каталог с правами root
    что делает

    Что делает команда. Выводит содержимое /root вместе со скрытыми файлами с правами root.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    ls
    вывести содержимое каталога
    -a
    показать и скрытые файлы
    /root
    что показать (абсолютный путь)
Результат

sudo whoami выводит root; каталог /root открывается только через sudo.

Снимок 4.1Ubuntu 24.04
  1. 1sudo whoami: команда выполнена от имени root
  2. 2UID 0
  3. 3обычному пользователю каталог /root закрыт
  4. 4с правами root содержимое каталога доступно
Команды через sudo выполняются с UID 0; каталог /root закрыт для обычного пользователя.Весь снимок ↗

Команды через sudo выполняются с UID 0; каталог /root закрыт для обычного пользователя.

Что показывает снимок. Команды через sudo выполняются с UID 0; каталог /root закрыт для обычного пользователя и открыт через sudo.

Где это пригодится. sudo whoami — быстрая проверка, работают ли права администратора у текущего пользователя.

4.2 Как sudo решает, можно ли выполнить команду

Программа sudo запускается с правами root: у файла /usr/bin/sudo установлен специальный бит setuid, поэтому программа работает от имени владельца файла — root — независимо от того, кто её вызвал. Получив права root, sudo проверяет, разрешено ли вызвавшему пользователю выполнить эту команду. Правила записаны в файле /etc/sudoers и в файлах каталога /etc/sudoers.d.

Часть правилаПримерЗначение
кто%sudoзнак % — группа: правило действует для всех участников sudo
на каком компьютереALL=на любом компьютере
от чьего имени(ALL:ALL)от имени любого пользователя и любой группы
какие командыALLлюбые команды
без пароляNOPASSWD:пароль не спрашивается

Затем sudo запрашивает пароль того пользователя, который её вызвал; пароль root для этого не нужен. Пароль спрашивается и у пользователя, для которого правил нет: только после ввода sudo сообщает об отказе, команду не выполняет и записывает попытку в журнал. Так посторонний по реакции sudo не узнаёт, есть ли у учётной записи права. После правильного ввода пароль некоторое время не спрашивается повторно: в Ubuntu 15 минут в одном терминале.

Команда sudo -l выводит правила, которые действуют для текущего пользователя. Сам файл /etc/sudoers обычный пользователь прочитать не может. Изменяют его только командой sudo visudo: она проверяет синтаксис перед сохранением. Ошибка в этом файле, сохранённая обычным редактором, может отключить sudo для всех пользователей.

В терминалеПравила sudo
  1. sudo -l# правила для текущего пользователя
    что делает

    Что делает команда. Выводит правила sudo, которые действуют для текущего пользователя.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    -l
    вывести правила sudo для текущего пользователя
  2. ls -l /etc/sudoers# права на файл правил
    что делает

    Что делает команда. Выводит права на файл правил sudo.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, группа, размер
    /etc/sudoers
    что показать (абсолютный путь)
  3. sudo grep -v "^#" /etc/sudoers | grep -v "^$"# правила без комментариев и пустых строк
    что делает

    Что делает команда. Выводит /etc/sudoers без строк-комментариев и без пустых строк.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    grep
    отобрать строки, в которых есть образец
    -v
    отобрать строки, в которых образца нет
    "^#"
    образец: строки, которые начинаются с # (комментарии)
    /etc/sudoers
    в каком файле искать (абсолютный путь)
    |
    передать вывод левой команды на вход следующей
    grep
    отобрать строки, в которых есть образец
    -v
    отобрать строки, в которых образца нет
    "^$"
    образец: пустые строки
  4. sudo ls /etc/sudoers.d# дополнительные файлы правил
    что делает

    Что делает команда. Выводит дополнительные файлы правил sudo.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    ls
    вывести содержимое каталога
    /etc/sudoers.d
    что показать (абсолютный путь)
Результат

для ubuntu действуют два правила: группы sudo и правило без пароля; в файле есть правила для root, %admin и %sudo.

Снимок 4.2Ubuntu 24.04
  1. 1правила, которые действуют для ubuntu
  2. 2правило группы sudo: любые команды от имени любого пользователя
  3. 3правило Live-сеанса: без пароля
sudo -l перечисляет правила для текущего пользователя.Весь снимок ↗

sudo -l перечисляет правила для текущего пользователя.

Что показывает снимок. Для ubuntu действуют два правила: правило группы sudo и правило Live-сеанса без пароля.

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

Снимок 4.3Ubuntu 24.04
  1. 1файл только для чтения, доступ — у root и группы root
  2. 2правило для root
  3. 3% — правило для группы sudo
  4. 4на любом компьютере, от имени любого пользователя и группы
  5. 5любые команды
  6. 6дополнительные правила из каталога sudoers.d
  7. 7файл, созданный Live-сеансом
Файл /etc/sudoers без комментариев.Весь снимок ↗

Файл /etc/sudoers без комментариев.

Что показывает снимок. В /etc/sudoers правила для root, групп admin и sudo и подключение каталога sudoers.d; файл только для чтения.

Где это пригодится. Собственные правила добавляют отдельным файлом в /etc/sudoers.d через sudo visudo -f: основной файл остаётся без изменений.

На схеме ниже показан путь команды sudo whoami для трёх пользователей: ubuntu в Live-сеансе, viktor, который не состоит в группе sudo, и пользователя установленной Ubuntu из группы sudo. Первые два сценария совпадают со снимками занятия.

Схема · маршрут команды sudo
  1. 1Пользователь вводит команду

  2. 2sudo запускается с правами root

  3. 3Поиск правила в /etc/sudoers

  4. 4Проверка пароля

  5. 5Команда выполняется от имени root

  6. 6Запись в журнал

4.3 Журнал sudo

Каждый вызов sudo записывается в системный журнал: кто вызвал, в каком терминале, в каком каталоге, от чьего имени и какую команду. По этим записям администратор восстанавливает, кто и когда менял систему. Журнал читает команда journalctl; условие _COMM=sudo отбирает записи программы sudo, -n 6 — последние шесть.

В терминалеЗаписи sudo в журнале
  1. journalctl _COMM=sudo -n 6 --no-pager# последние записи sudo
    что делает

    Что делает команда. Выводит шесть последних записей журнала от программы sudo.

    По частям:

    journalctl
    прочитать системный журнал
    _COMM=sudo
    только записи программы sudo
    -n 6
    сколько последних записей вывести: 6
    --no-pager
    вывести сразу в терминал, без постраничного просмотра
Результат

для каждой команды через sudo в журнале три строки: сама команда, открытие и закрытие сеанса root.

Снимок 4.4Ubuntu 24.04
  1. 1время записи
  2. 2кто вызвал sudo
  3. 3терминал
  4. 4каталог, в котором выполнялась команда
  5. 5от чьего имени выполнена команда
  6. 6полная команда
  7. 7сеанс root открыт и закрыт
Каждая команда через sudo оставляет запись в журнале.Весь снимок ↗

Каждая команда через sudo оставляет запись в журнале.

Что показывает снимок. Каждая команда через sudo оставила три записи: кто, где и что выполнил, открытие и закрытие сеанса root.

Где это пригодится. При разборе сбоя на сервере по этим записям восстанавливают, кто и какую команду выполнил с правами root.

4.4 Оболочка root: sudo -i

Команда sudo -i открывает командную оболочку root: все следующие команды выполняются с UID 0 без слова sudo перед ними. Приглашение меняется: вместо имени пользователя стоит root, а знак $ заменяется на #. Команда exit закрывает оболочку root и возвращает к обычному пользователю.

В журнал в этом случае попадает только сама команда sudo -i. Команды внутри оболочки root отдельно не записываются, поэтому по журналу уже нельзя восстановить, какие команды выполнил администратор.

В терминалеОболочка root
  1. sudo -i# открыть оболочку root
    что делает

    Что делает команда. Открывает командную оболочку root. Выход — exit.

    По частям:

    sudo
    выполнить команду от имени другого пользователя, по умолчанию root
    -i
    открыть оболочку root с полным входом
  2. whoami# внутри оболочки root
  3. pwd
  4. exit# вернуться к обычному пользователю
  5. whoami
    что делает

    Что делает команда. Выводит имя пользователя, от имени которого работает оболочка.

    По частям:

    whoami
    вывести имя текущего пользователя
Результат

приглашение меняется на root@ubuntu:~#; после exit снова ubuntu.

Снимок 4.5Ubuntu 24.04
  1. 1приглашение root заканчивается знаком #
  2. 2домашний каталог root — /root
  3. 3exit закрывает оболочку root
  4. 4снова обычный пользователь: знак $
Оболочка root: знак # в приглашении и домашний каталог /root.Весь снимок ↗

Оболочка root: знак # в приглашении и домашний каталог /root.

Что показывает снимок. В оболочке root приглашение заканчивается знаком #, текущий каталог — /root; после exit снова пользователь ubuntu.

Где это пригодится. По знаку # в приглашении сразу видно, что команды выполняются с правами root, и можно вовремя закрыть оболочку.

4.5 Принцип минимальных привилегий

Постоянная работа под root нарушает этот принцип. У root нет защиты от ошибок: система не остановит ни опечатку, ни вредную программу. Работа через sudo оставляет права root только для отдельных команд и записывает каждую из них в журнал.

Что случается под rootПример
опечатка удаляет системные файлыrm -rf /etc/app вместо rm -rf ./etc/app: из-за пропущенной точки путь ведёт в системный каталог /etc
программа получает все праваскрипт из интернета или пакет с ошибкой меняет любые файлы системы
файлы получают не того владельцафайл, созданный root в каталоге проекта, другие участники не могут изменить
не видно, кто что сделалкоманды внутри sudo -i не попадают в журнал по отдельности
Порядок действийПравила работы с правами root
  1. 1
    Работайте под своей учётной записью; sudo добавляйте только к командам, которые меняют систему.
  2. 2
    Перед командой с sudo прочитайте её целиком ещё раз: у неё нет ограничений.
  3. 3
    Не открывайте sudo -i без необходимости и закрывайте оболочку root командой exit сразу после работы.
  4. 4
    В группу sudo добавляйте только тех, кто администрирует систему.

Итоги части 4

  • root — учётная запись с UID 0; для её процессов права на файлы не проверяются.
  • sudo выполняет команду от имени root, если в /etc/sudoers есть правило для пользователя или его группы.
  • sudo спрашивает пароль вызвавшего пользователя; sudo -l выводит действующие правила; править правила — только через visudo.
  • Каждый вызов sudo записывается в журнал; команды внутри sudo -i — нет.
  • Принцип минимальных привилегий: права root — только для отдельных команд и только когда они нужны.

В отчётСнимок sudo -l и снимок записей sudo в журнале с подписанными полями.

Открыть в отдельной вкладке ↗