Найти в Дзене
Tominoff

Как монтировать разделы в Linux без ввода пароля или щепотка JavaScript для polkit

Оглавление

По умолчанию, по крайней мере в Fedora, диски, не монтирующиеся в систему при запуске через fstab, требуют ввода пароля пользователя при попытке обращения к ним.

Думаю многим кто сталкивался с подобным, хотелось бы иметь способ избавиться от такого поведения системы.

Почему вообще запрашивается пароль?

В общем-то, дело в том, что монтирование дисков требует наличия привилегий администратора.

Разумеется, давать каждому желающему монтировать usb-флешки и накопители root доступ (или даже, sudo) было бы крайне безответственно, а поэтому существуют специальные инструменты, позволяющие выполнять некоторые административные действия обычным пользователям.

Очень грубо говоря, пользователь не выполняет некое административное действие (подключи D), а лишь создаёт запрос на выполнение такого действия (я, пользователь U, хотел бы подключить D) и отправляет его в системную шину DBus.

Как правило, этот запрос не поступает сразу к получателю, а сначала приходит в программу управления доступом - Policy Kit или polkit. Эта программа и решает что делать с запросом благодаря очень гибким правилам.

Очень грубая схема работы
Очень грубая схема работы

По умолчанию, например для монтирования дисков, polkit запрашивает у пользователя ввод его пароля, таким образом программа убеждается, что запрос поступил именно от пользователя, а не третьего лица. В случае успешной аутентификации, запрос передаётся по шине к конкретному ПО.

Анатомия монтирования раздела

Уверен, опытные пользователи командной строки знают такую программу как mount. И тут может возникнуть резонный вопрос — а как запрос из DBus может быть передан в эту команду?

На самом деле для выполнения монтирования диска используется другая программа — UDisks2. Эта программа с помощью своего демона прослушивает DBus и при поступлении запросов выполняет монтирование/размонтирование/прочие операции.

Существует возможность для гибкой настройки монтирования, например, можно указать набор параметров для определённых устройств или файловых систем — все возможности можно посмотреть в файле /etc/udisks2/mount_options.conf.example.

Так как же разрешить монтировать диски без ввода пароля?

Для того чтобы разрешить монтировать любые устройства без пароля, нужно всего лишь добавить новую политику для polkit.

Политика представляет собой файл в каталоге /etc/polkit-1/rules.d с названием в следующем формате:

<ЧИСЛО>-<Название>.rules

Число в имени файла используется для сортировки правил, чем меньше число - тем раньше polkit выполнит проверку этого правила. Такой подход часто используется в GNU/Linux системах.

Давайте создадим новое правило на языке JavaScript, которое позволит монтировать файловые системы без ввода пароля, для пользователей из группы
storage.

Редактирование и управление правилами осуществляется от лица привилегированного пользователя

Файл: /etc/polkit.1/rules.d/40-allow-mount-for-storage.rules

polkit.addRule(function(action, subject) {
const actionIds = [
"org.freedesktop.udisks2.filesystem-mount",
"org.freedesktop.udisks2.filesystem-mount-system"
];
if (actionIds.indexOf(action.id) !== -1 && subject.isInGroup("storage")) {
return polkit.Result.YES;
}
})

Как видно из исходного текста - мы проверяем несколько условий:

  1. Запрошенный идентификатор действия находится в списке ids

    Эти идентификаторы определяют тип запрашиваемого пользователем действия, все доступные типы как правило можно посмотреть в XML описаниях действий -
    /usr/share/polkit-1/actions/*

    В нашем случае мы отслеживаем filesystem-mount - монтирование и filesystem-mount-system - монтирование системных разделов (системные разделы в терминах udisks это те которые поключаются и отключаются к системе, например usb-flash)
  2. Пользователь находится в группе 'storage'

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

Если оба условия выполнены, наша функция возвращает значение polkit.Result.YES, сообщая polkit что запрошенное действие можно выполнить без дополнительной аутентификации.

Применение нового правила polkit

После добавления правила, оно обычно применяется сразу, т.е. polkit сам следит за изменениями правил, однако, если вы не уверены в том что правило всё же применилось, некоторые ресурсы рекомендуют также перезапускать службу polkit командой:

systemctl restart polkit.service

Что дальше?

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

udev — управление устройствами в Linux
Tominoff17 апреля 2023