Вопрос или проблема
У нас есть ситуация, где в офисе сайта несколько серверов на Rocky Linux 8, которые регулярно получают большие объемы данных от клиентов. Данные поступают на различные внешние USB жесткие диски и иногда на USB накопители. Эти диски могут иметь самые разные файловые системы, но наиболее распространены NTFS и exFAT.
NTFS поддерживается в RL8 по умолчанию, но exFAT — нет. Мы использовали пакет fuse-exfat из rpmfusion. (https://github.com/relan/exfat).
Я бы хотел, чтобы мои пользователи, не имеющие и не долженствующие иметь root доступ, могли монтировать их без проблем. Раньше мы использовали pmount, но pmount не работает с exFAT. Думаю, это связано с тем, что это FUSE, а не из-за exFAT.
Есть ли хороший, безопасный способ достигнуть этого?
Редактировать: по-видимому, pmount является очень тонкой оболочкой вокруг mount, и права устанавливаются через бит setuid на исполняемом файле. Таким образом, это по существу конечный набор команд mount, и exfat не входит в их число. Здесь есть некоторое обсуждение: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755434 и предлагаемый патч здесь: launchpadlibrarian.net/229524614/pmount.exfat.patch
Вы можете использовать udisks2
, который позволяет пользователям управлять и монтировать устройства хранения данных без root доступа.
- Установите инструмент:
sudo dnf install udisks2 ntfs-3g fuse-exfat
- Разрешите пользователю управлять:
sudo usermod -a -G disk <username>
Пользователи без прав root в группе disk
могут использовать командную строку udisksctl
для управления и монтирования внешних дисков.
Замените <username>
на пользователя, которому вы хотите разрешить управление дисками.
- Монтирование диска:
udisksctl mount -b /dev/sdXY
- Отмонтирование диска:
udisksctl unmount -b /dev/sdXY
- Получение информации:
udisksctl info -b /dev/sdXY
Думаю, я нашел решение. Добавьте следующее правило polkit в файл /etc/polkit-1/rules.d/10-allow-usb-mounts.rules
:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" && subject.isInGroup("groupforthosewhocanmountusbdisks")) {
var bus = action.lookup("drive.removable.bus");
if (bus == "usb" || bus == "firewire") {
polkit.log("polkit правило для монтирования USB дисков с помощью udisks2")
polkit.log("Устройство: " + action.lookup("device"))
polkit.log("Диск: " + action.lookup("drive"))
polkit.log("Шина: " + bus)
polkit.log("Серийный номер: " + action.lookup("drive.serial"))
polkit.log("Производитель: " + action.lookup("drive.vendor"))
polkit.log("Модель: " + action.lookup("drive.model"))
return polkit.Result.YES;
}
}
});
Для тестирования смонтируйте диск как обычный пользователь с помощью:
udisksctl mount -b /dev/sdb
И проверьте вывод с помощью journalctl
.
Вы можете настроить sudo
чтобы позволить пользователям выполнять специально разработанный скрипт для монтирования USB дисков в фиксированной точке монтирования, указывая только устройство. Например, они могут выполнить команду:
sudo mount-usb /dev/sdb
где скрипт попытается смонтировать /dev/usb и монтировать его, например, в /mnt/usb, и сообщить об этом пользователю. Аналогично, можно иметь скрипт umount-usb
для отмонтирования диска с помощью:
sudo umount-usb
Скрипт mount-usb может выглядеть так:
#!/bin/bash
# mount-usb: монтировать диски в /mnt/usb
[ -z "$1" ] && echo "Используйте: $0 устройство" && exit
if ! [[ $1 =~ ^/dev/.*$ ]] ; then
echo "Используйте /dev/xxx как устройство"
exit
fi
mount -t auto -o uid=$SUDO_UID,gid=$SUDO_UID,ro "$1" /mnt/usb
mount | grep /mnt/usb #-- показать результат
Мы используем переменные SUDO* для получения реального id/gid вызывающего пользователя и простую проверку спецификации устройства с помощью регулярного выражения. Соответствующий скрипт umount-usb
будет таким:
#!/bin/bash
# umount-usb: отмонтировать устройство в /mnt/usb
umount /mnt/usb
Настройка sudo
выполняется редактированием файла /etc/sudoers
с помощью команды visudo
(или VISUAL=nano visudo
, чтобы использовать другой редактор вместо vi), где мы можем разрешить некоторым пользователям или группе выполнять определенные команды как root без запроса пароля. Пример для пользователя john и группы usb-mounters:
Defaults !lecture
Cmnd_Alias USBMNT = /root/mount-usb ^/dev/.*$, umount-usb ""
john ALL=NOPASSWD: USBMNT
%usb-mounters ALL=NOPASSWD: USBMNT
Обратите внимание на регулярное выражение, чтобы включить только аргументы /dev/xx в mount-usb
и пустую строку, чтобы исключить их в umount-usb
(как описано в руководстве sudoers). С этой настройкой мы можем опустить проверку /dev/xx в скрипте, но я предпочитаю оставить ее в любом случае.
.
Ответ или решение
В мире современных информационных технологий конфиденциальность и безопасность данных занимают первостепенное место среди приоритетов. Одной из частых задач, с которой сталкиваются IT специалисты, является организация безопасного доступа для обычных пользователей к монтированию внешних USB-устройств на сервере с Linux, например, в вашей ситуации с использованием серверов на базе Rocky Linux 8.
Теория
Традиционно монтирование файловых систем в Linux требует прав суперпользователя (root), поскольку оно затрагивает важные аспекты системы, такие как управление устройствами и файловыми системами. Однако предоставление прав root обычным пользователям может создать значительные риски для безопасности. Поэтому задача заключается в поиске методов, позволяющих пользователям, без прямого предоставления административных прав, монтировать внешние устройства в необходимой бизнес-процедуре.
Существует несколько подходов к решению этой задачи. Основной из них — использование системы udisks2
. Эта утилита предоставляет удобные средства для управления блоковыми устройствами, позволяя монтировать, размонтировать и управлять устройствами без необходимости получения прав root. Настройка политики безопасного доступа к USB-устройствам пользователей также играет ключевую роль.
Пример
Ваш сценарий включает использование fuse-exfat для поддержки форматов файловых систем, таких как exFAT, а также ntfs-3g для NTFS. Для реализации требований можно следовать следующей схеме:
-
Установка необходимых инструментов:
sudo dnf install udisks2 ntfs-3g fuse-exfat
-
Настройка прав доступа:
Вы можете создать отдельную группу пользователей, например, "usb-mounters," и разрешить этой группе возможность монтировать USB-устройства. Дайте соответствующие права:sudo groupadd usb-mounters sudo usermod -a -G usb-mounters <username>
-
Настройка Udisks2 с Polkit:
Создайте файл с политикой доступа, например, в/etc/polkit-1/rules.d/10-allow-usb-mounts.rules
:polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.udisks2.filesystem-mount-other-seat" && subject.isInGroup("usb-mounters")) { var bus = action.lookup("drive.removable.bus"); if (bus == "usb") { return polkit.Result.YES; } } });
-
Использование Udisksctl:
Теперь пользователи из группы "usb-mounters" могут использовать командыudisksctl
:- Монтирование устройства:
udisksctl mount -b /dev/sdXY
- Снятие монтирования устройства:
udisksctl unmount -b /dev/sdXY
- Монтирование устройства:
-
Обеспечение безопасного аудита:
Используйтеjournalctl
для мониторинга любых действий, связанных с монтированием USB-устройств. Это поможет вовремя выявить и исправить возможные нарушения политики безопасности.
Применение
Данный подход обеспечивает баланс между удобством использования и безопасностью. Обычные пользователи получают возможность самостоятельно монтировать и снимать монтирование USB-устройств, что облегчает рабочий процесс и увеличивает продуктивность. В то же время администраторы сохраняют контроль над системой доступа, благодаря интеграции c Polkit и системой аудита, что делает этот подход надежным и безопасным.
Этот процесс может быть детализирован в зависимости от специфики работы компании, типа данных, которые обрабатываются, и уровня технической компетенции пользователей. Использование обучения и документации поможет персоналу быстро освоить новые процессы, тем самым минимизируя время простоя и ошибки. Встраивание данной системы в общую политику управления информацией организации способствует улучшению общих показателей IT-безопасности и эффективности.