Представьте себе паровую машину, которая десятилетиями исправно качает воду из шахты. Она старая, надёжная, но её поршни и клапаны изношены — то тут заклинит, то там пар прорвётся сквозь микротрещину. Именно таким был классический 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 sudoArch 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.
| Критерий | Классический sudo | sudo-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: Миграция существующей инфраструктуры
- Проверьте текущую версию:
sudo --version - Если используется классический sudo, установите sudo-rs через пакетный менеджер
- Проверьте совместимость ваших sudoers-правил — большинство стандартных записей работают без изменений
- Протестируйте критичные скрипты и автоматизацию на тестовой машине
- Переключитесь на 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 и в нашем Телеграф-канале.
📋 Все команды