Вопрос или проблема
У меня возникли проблемы с написанием правила, которое позволяло бы всем (или некоторой подмножеству пользователей) получить доступ к yubikey (USB-устройству безопасности). Устройство отображается как /dev/hidraw2, и обычный пользователь находится в списке управления доступом (ACL), который предоставляет разрешение на его использование. Однако, если второй пользователь также вошел в систему, он не включен в ACL устройства. Система работает на openrc, а не на systemd, поэтому elogind контролирует ACL. (Elogind — это демон для openrc, который эмулирует некоторые функции systemd, которых нет в openrc изначально).
Когда я вручную добавляю вторичного пользователя в ACL для этого устройства с помощью setfacl, это работает. Но это не является постоянным решением, и когда устройство удаляется и вновь вставляется, setfacl нужно вызывать снова.
Насколько я могу судить, elogind использует polkit для определения, какой пользователь попадает в ACL. Но мне не удалось написать правило polkit, которое позволяло бы всем пользователям (или некоторому ограниченному подмножеству всех пользователей) использовать устройство. Вот пример правила, которое я пробовал:
if ( subject.isInGroup("plugdev")) {
return polkit.Result.YES;
}
}
});
Этот пример слишком щедрый, поскольку он должен позволять любому в plugdev получать доступ к любому устройству (я так думаю). Но даже это не позволяет вторичным пользователям получить доступ к устройству. Я изучил множество примеров правил polkit и немного запутался. Есть идеи?
Ответ или решение
Устранение проблемы доступа к USB-устройствам с помощью Polkit в системе, использующей OpenRC и elogind, может быть сложной задачей, особенно в контексте обеспечения безопасного доступа для определённой группы пользователей. В этой статье мы рассмотрим, как создать правило Polkit, которое позволит пользователям получать доступ к YubiKey и другим USB-устройствам, сохраняя при этом безопасность и контроль доступа.
Шаг 1: Понимание структуры прав доступа
Ещё до написания правил Polkit важно понять, как система управляет правами доступа к устройствам. Поскольку вы используете elogind
, который эмулирует функциональность системы systemd
, доступ к устройствам может управляться через ACL (Access Control List) и Polkit.
YubiKey, отображаемый как /dev/hidraw2
, требует управления правами доступа на уровне устройства. Если у вас уже есть возможность добавлять пользователей в ACL с помощью setfacl
, это показывает, что проблема заключается в автоматизации этого процесса при подключении устройства.
Шаг 2: Изучение правил Polkit
Правила Polkit пишутся в формате JavaScript и размещаются в каталоге, который зависит от вашей системы. Обычно это /etc/polkit-1/rules.d/
или /usr/share/polkit-1/rules.d/
. Для начала создайте новое правило, назовите его, например, 99-yubikey.rules
.
Шаг 3: Написание правила
Вот пример правила, которое позволяет пользователям, принадлежащим к группе plugdev
, доступ к YubiKey, но при этом будет ограничено определённой логикой:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.UDisks2.filesystem-mount" && subject.isInGroup("plugdev")) {
return polkit.Result.YES;
}
if (action.id == "org.freedesktop.login1.manage-sessions" && subject.isInGroup("users")) {
return polkit.Result.YES;
}
});
В этом примере правило проверяет, принадлежит ли пользователь к группе plugdev
или users
, прежде чем предоставить доступ к определённым действиям, связанным с устройствами. Убедитесь, что указанные ID действий соответствуют тем действиям, которые вам нужно разрешить.
Шаг 4: Тестирование и отладка
После создания правила выполните следующие шаги:
-
Проверьте логи: Запустите систему и проверяйте логи через
journalctl
или другие инструменты мониторинга, чтобы видеть, срабатывают ли ваши правила. -
Попробуйте подключить YubiKey: Подключите устройство, и проверьте, может ли вторичный пользователь получить доступ.
-
Регулируйте правила: Если необходимо, вносите изменения в правила в зависимости от полученных результатов тестирования и требований к безопасности.
Шаг 5: Постоянство прав доступа
Для обеспечения постоянства прав доступа рассмотрите возможность использования скрипта, который будет запускаться при подключении устройства и автоматически настраивать ACL. Это может быть сделано с помощью системы событий udev
. Создайте файл, например, в /etc/udev/rules.d/99-yubikey.rules
, который будет выглядеть так:
KERNEL=="hidraw2", MODE="0666"
Это правило предоставит доступ ко всем пользователям с правами на чтение и запись. Измените значение MODE
для ограничения прав доступа только на чтение.
Заключение
Создание правил Polkit для управления доступом к USB-устройствам – это необходимый шаг для обеспечения безопасности и удобства использования в многопользовательской среде. Следуя указанным шагам, вы сможете обеспечить правильный доступ к вашем YubiKey, оптимизировав правила доступа для пользователей и соблюдая высокие стандарты безопасности. Не забудьте периодически пересматривать ваши правила и настройки ACL в зависимости от изменяющихся потребностей сети и пользователей.