⚙️ Паровой сервер ROADIT

Настройка sudo-rs: Как Rust меняет безопасность в Linux

Представьте себе паровую машину, которая десятилетиями исправно качает воду из шахты. Она старая, надёжная, но её поршни и клапаны изношены — то тут заклинит, то там пар прорвётся сквозь микротрещину. Именно таким был классический sudo — легендарный инструмент, написанный на C, который почти 30 лет служил верой и правдой, но его кодовая база превратилась в лабиринт, где каждая ошибка памяти могла стать брешью в системе привилегий.

И вот на сцену выходит sudo-rs — новая паровая турбина, собранная по чертежам Rust. Не просто перелицовка, а полная пересборка критического механизма повышения привилегий. В этой статье мы разберём, что такое sudo-rs, почему Canonical и Fedora делают на него ставку, как его настроить и чем он отличается от своего прародителя.



Что такое sudo-rs и почему он появился

sudo-rs — это реализация классических утилит sudo и su, написанная с нуля на Rust силами Trifecta Tech Foundation. Проект не является форком или обёрткой — это самостоятельная реализация, которая парсит файлы sudoers и реализует собственную политическую машину.

Зачем это нужно? Исходный sudo, написанный на C, за десятилетия оброс множеством уязвимостей классов memory safety — переполнение буфера, use-after-free, доступ к уже освобождённой памяти. Rust устраняет целые классы таких уязвимостей на уровне компилятора: строгая система заимствований (borrow checker) не позволяет скомпилировать код, который может привести к подобным ошибкам.

«Rust — это язык с сильными гарантиями безопасности памяти, которые устраняют многие уязвимости, исторически преследовавшие традиционное ПО на C.»


Проверка: какая версия sudo у вас установлена

Прежде чем что-либо менять, давайте выясним, какая реализация sudo сейчас активна на вашей системе.

sudo --version

Если вы видите одну строку с идентификацией sudo-rs и номером версии — вы уже используете Rust-реализацию. Если же выводится многострочный блок, начинающийся с Sudo version: — это классический sudo.

Проверить установленные пакеты можно так:

dpkg -l | grep -E 'sudo-rs|^ii sudo '

Установка sudo-rs

Способ установки зависит от вашего дистрибутива.

Ubuntu 25.10 и 26.04

Начиная с Ubuntu 25.10 (Questing Quokka) и в 26.04 (Resolute Raccoon) sudo-rs установлен и включён по умолчанию. Версия в 26.04 LTS основана на v0.2.13.

Управление версиями осуществляется через систему альтернатив:

sudo update-alternatives --config sudo

Arch Linux

sudo pacman -S sudo-rs

Команды доступны как sudo-rs, sudoedit-rs, visudo-rs и su-rs во избежание конфликтов.

Fedora

sudo dnf install sudo-rs

Команды: sudo-rs, visudo-rs, su-rs.

Debian 13 (trixie) и новее

sudo apt-get install sudo-rs

Команды: sudo-rs, visudo-rs. Если хотите вызывать sudo-rs через стандартные sudo и visudo, добавьте /usr/lib/cargo/bin в начало $PATH.

Сборка из исходников

Для сборки потребуется Rust (минимальная версия 1.85) и заголовочные файлы PAM (libpam0g-dev на Debian-подобных). sudo-rs требует ядро Linux 5.9 или новее.

 git clone https://github.com/trifectatechfoundation/sudo-rs.git
 cd sudo-rs
 cargo build --release

Настройка sudoers

sudo-rs использует тот же формат файла sudoers, что и классический sudo. Файл конфигурации загружается из /etc/sudoers-rs, если он существует; в противном случае используется оригинальный /etc/sudoers.

⚡ Важно

При редактировании используйте visudo-rs (или visudo, если вы заменили стандартную команду):

sudo visudo-rs

Типичная запись в sudoers для предоставления прав администратору:

# Разрешить пользователю admin выполнять любые команды
admin    ALL=(ALL:ALL) ALL

# Разрешить группе wheel выполнять любые команды
%wheel   ALL=(ALL:ALL) ALL

Отключение запроса пароля (для автоматизации)

# Разрешить пользователю deploy выполнять команды без пароля
deploy   ALL=(ALL) NOPASSWD: ALL

Ограничение конкретных команд

# Разрешить пользователю только перезапускать nginx
webadmin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

Ключевые отличия от классического sudo

Для обычного пользователя изменения минимальны — вы по-прежнему набираете sudo, и команда работает. Однако для администраторов есть важные нюансы.

Приглашение к вводу пароля

Классический sudo: [sudo] password for <USERNAME>:

sudo-rs: [sudo: authenticate] <METHOD>: — при этом sudo-rs прозрачно выводит то, что говорит PAM: Password:, PIN: и т.д.

Звёздочки при вводе пароля

sudo-rs по умолчанию показывает звёздочки (*****) при вводе пароля. В классическом sudo это требовало дополнительной настройки.

Отсутствующие функции (на момент написания)

  • I/O logging и sudoreplay — не поддерживаются
  • sudoers.ldap — поддержка LDAP для sudoers отсутствует; используйте аутентификацию через PAM
  • sendmail — уведомления об использовании sudo по электронной почте не реализованы
  • NOEXEC — реализуется в рамках «Milestone 5»

Совместимость CLI-флагов

Полный список поддерживаемых флагов можно посмотреть в sudo-rs --help. Актуальный статус совместимости поддерживается в issue #129.

КритерийКлассический sudosudo-rs
Приглашение пароляЕстьЕсть
Звёздочки (при вводе)По умолчанию нет (требуется настройка pwfeedback)По умолчанию нет (тоже настраивается)
I/O loggingЕстьНет (не реализовано)
LDAPЕсть (поддержка аутентификации)Нет
sendmailЕсть (для отправки уведомлений)Нет
NOEXECЕстьЕсть (поддерживается)

Переключение между реализациями

Если вам нужно вернуться к классическому sudo (например, для использования отсутствующей функции):

Ubuntu (через update-alternatives)

# Переключиться на классический sudo
sudo update-alternatives --set sudo /usr/bin/sudo.ws

# Вернуться к автоматическому выбору (sudo-rs по умолчанию)
sudo update-alternatives --auto sudo

Ручная замена (для дистрибутивов без alternatives)

Создайте символьную ссылку или настройте alias:

alias sudo=sudo-rs

Но помните: alias работает только для вашей интерактивной сессии. Скрипты и другие программы будут использовать системный sudo.


Безопасность: что говорят аудиты

Проект прошёл два независимых аудита безопасности:

  • Август 2023 — аудит версии 0.2.0
  • Август 2025 — аудит версии 0.2.8

Отчёты доступны в репозитории проекта.

Показательный момент: в начале 2025 года в классическом sudo были обнаружены две критические уязвимости — CVE-2025-32462 (обход ограничений хоста) и CVE-2025-32463 (выполнение root-оболочки через --chroot), которые оставались незамеченными более десятилетия. В sudo-rs аналогичные проблемы были оперативно исправлены.


Автоматизация и Expect-скрипты

Если вы используете Expect или аналогичные инструменты для автоматизации, обратите внимание на изменение приглашения. Сценарии, которые ожидают [sudo] password for, могут сломаться.

Решение: используйте флаг --prompt "" для пропуска регулярного выражения при сопоставлении приглашения.

Пример Expect-скрипта:

# Вместо ожидания [sudo] password for user
expect "[sudo: authenticate]"
send "$password\r"

Или более универсально:

sudo --prompt "" command

Практические сценарии

Сценарий 1: Миграция существующей инфраструктуры

  1. Проверьте текущую версию: sudo --version
  2. Если используется классический sudo, установите sudo-rs через пакетный менеджер
  3. Проверьте совместимость ваших sudoers-правил — большинство стандартных записей работают без изменений
  4. Протестируйте критичные скрипты и автоматизацию на тестовой машине
  5. Переключитесь на sudo-rs в production через update-alternatives

Сценарий 2: Использование в CI/CD

Для конвейеров сборки, где важна предсказуемость:

# В Dockerfile или CI-скрипте
RUN apt-get update && apt-get install -y sudo-rs
ENV PATH=/usr/lib/cargo/bin:$PATH

Сценарий 3: Отладка проблем

Если команда не работает с sudo-rs, проверьте:

# Получить справку по доступным опциям
$ sudo-rs --help

# Просмотреть мануал по sudoers-rs
$ man sudoers-rs


⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды

Оставьте комментарий