3

У меня вопрос, как я могу настроить systemd(?) чтобы перестать открывать это надоедливое всплывающее окно всякий раз, когда я забываю набрать sudo. Просто дайте мне текстовое приглашение sudo или покажите ошибку, чтобы я мог быстро исправить ошибку.

Это последняя версия Arch Linux (systemd 238.133).

3 ответа3

4

Это не приглашение sudo, это приглашение polkit. Один из способов избежать этого - глобальный для всего программного обеспечения, а не только для systemctl - это написать правило polkit, которое немедленно запрещает действие (или немедленно разрешает его).

polkit.addRule(function(action, subject) {
    if (subject.user !== "root") {
        if (/^org\.freedesktop\.systemd1\./.test(action.id)) {
            return polkit.Result.NO;
        }
    }
});

(Тест subject.user может быть опущен, поскольку действия, вызываемые корневыми обходными проверками polkit, полностью.)

Правила polkit хранятся в /etc/polkit/rules.d/*.rules , обычно именуются как 80-custom.rules (обрабатываются в порядке возрастания). Для получения дополнительной информации см. Polkit (8).


(Тем не менее, если ваша конфигурация sudo не имеет пароля, то нет никакой практической разницы в безопасности между использованием 'sudo' и немедленным разрешением действия polkit. И наоборот, если вашему sudo требуется пароль ... тогда почему бы просто не ввести его в диалог polkit? Это тот же пароль.)

2

Есть опция --no-ask-password . Сделать псевдоним:

alias systemctl='systemctl --no-ask-password'

(проверено в Баш, Кубунту).

0

Не используйте Sudo для systemctl, когда - либо; если вам разрешено делать техническое обслуживание, настроить polkit правильно.

Обоснование: sudo делает программу, которую вы эффективно запускаете запрошенным пользователем (обычно: root). Включая все связанные наборы инструментов. Любая ошибка в программе, библиотеках или ... конфигурации sudo делает вас уязвимыми. В случае systemd бинарный файл systemctl является всего лишь контроллером (в общем). Для него не требуются привилегии суперпользователя (для большинства случаев использования), поскольку он не выполняет привилегированную операцию сам по себе, а запрашивает init . Использование действительной учетной записи root (напрямую или через sudo) - это атомарное решение (бомба) «все или ничего», в то время как единственное, что требуется, - это авторизоваться (не аутентифицироваться) против systemd . Поскольку systemd понимает polkit для авторизации, использование аутентифицированного root слишком много разрешений.

Рассмотрим ошибку в systemctl , которая позволяет вызывать произвольную команду напрямую (не через systemd). Когда разрешения root задаются sudo можно выполнить любую команду с EUID = 0. Когда systemctl работает как непривилегированный пользователь, такую команду можно запустить только с той учетной записью, к которой он получил доступ ранее. Это простое следствие некоторых основных правил безопасности:

  • использовать только необходимый набор разрешений (не полный набор == root),
  • предоставьте эти разрешения только коду, который требует этого (авторизуйтесь в systemd без предоставления разрешений для systemctl).

Что касается того, что вы являетесь единственным пользователем компьютера - если вы работаете с непривилегированной учетной записью, а не с учетной записью root , я предполагаю, что вы хотите ограничить программы, которые вы запускаете, от получения лишних разрешений. Предоставление их systemctl только потому, что root учетная запись authorized для команды systemd является таким лишним разрешением.

Более того, с помощью polkit вы можете иметь разные критерии доступа для разных действий (запуск / остановка / перезагрузка / что угодно) и разных сервисов. Вы можете поместить точные команды в sudoers , но решение polkit знает о конкретных частях таких команд.

Вывод: не используйте sudo если доступен какой-либо менее привилегированный метод. sudo - последнее или окончательное решение.

Если вы хотите, чтобы запрос пароля отображался в текстовом, а не графическом виде, просто unset DISPLAY, например: отсоедините ваш терминал от графического сеанса, который запускает агент аутентификации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .