- Постановка задачи
- Особенности применения
- Решение
- Разграничение прав доступа при работе в доменах
- Проверка корректности работы
- Настройка udev rules в Linux
- Общая информация про udev
- Как переименовать устройство в Linux
- Как переименовать сетевую карту
- Как запустить скрипт при подключении устройства
- Отладка правил
- Выводы
Постановка задачи
На компьютере под управлением Astra Linux требуется настроить разделение прав прямого доступа пользователей к оптическим дискам. При этом должны быть разграничены права пользователей на прямое копирование и запись оптических дисков.
Приведенные ниже правила ограничивают только прямой доступ к носителям (доступ к данным, находящимся на устройствах /dev/sr*). Права на монтирование оптических дисков и права доступа к примонтированным файловым системам управляются отдельно. Доступ к носителям может быть отдельно ограничен для учтенных носителей и при работе в сессиях с ненулевой классификационной меткой. Подробнее см. Съемные носители в Astra Linux.
Особенности применения
Приводы оптических дисков представлены устройствами /dev/sr* с дискретными правами доступа на чтение и запись для владельца root и группы cdrom:
ls -l /dev/sr*
brw-rw—-+ 1 root cdrom 11, 0 авг 4 08:05 /dev/sr0
brw-rw—-+ 1 root cdrom 11, 1 авг 4 08:05 /dev/sr1
При этом прямой доступ на чтение и запись к таким устройствам по умолчанию предоставляется всем пользователям автоматически при входе пользователя в сессию. Это делается с помощью правила UDEV /usr/lib/udev/rules.d/70-uaccess.rules (правила /lib/udev/rules.d/70-uaccess.rules для Astra Linux выпущенных ранее обновления x.7). В указанном правиле перечислены различные устройства, доступ к которым должен быть общим. При подключении таких устройств правило 70-uaccess.rules присваивает устройству тэг uaccess. Тэг обрабатывается службами systemd при входе в пользовательскую сессию и таким устройствам присваивается атрибут ACL (см. Списки управления доступом к файловым объектам (ACL) в Astra Linux) разрешающий пользователю прямое чтение и запись. Из сессии пользователя права доступа к устройству выглядят так:
getfacl: Removing leading ‘/’ from absolute path names
# file: dev/sr0
# owner: root
# group: cdrom
user::rw-
user::rw-
group::rw-
mask::rw-
other::—
# file: dev/sr1
# owner: root
# group: cdrom
user::rw-
user::rw-
group::rw-
mask::rw-
other::—
Где строка user:<имя_пользователя>:rw- задает индивидуальное разрешение прямого чтения и прямой записи для указанного в ней пользователя.имя_пользователя>
Решение
Для отключения автоматически предоставляемого общего доступа следует отменить назначение ACL, этот доступ разрешающий, то есть удалить тэг uaccess из атрибутов устройства. Для этого:
- Создать правило udev, которое будет выполняться после правила 70-uaccess.rules и удалять тэг uaccess. Например, создать файл 71-uaccess-astra.rules (порядок выполнения правил определяется алфавитной сортировкой имен файлов с правилами). Файл разместить в том же каталоге, в котором находится правило 70-uaccess.rules. Пример правила:
SUBSYSTEM=="block", KERNEL=="sr8*", TAG-="uaccess", RUN+="/usr/bin/logger 'Astra UDEV: set access for device %E'"
- команды SUBSYSTEM==»block», KERNEL==»sr5*» выбирают блочные устройства с именем sr*;
- команда TAG-=uaccess удаляет ранее назначенный тэг uaccess
- команда RUN+=»/usr/bin/logger ‘Astra UDEV: set access for device %E'» выполняет запись в системный журнал (необязательное действие);
Удаление ACL, назначенных systemd, командой setfacl из сессии администратора не работает. ACL должны быть удалены с помощью правила udev.
Для того чтобы ACL удалялись автоматически без перезагрузки компьютера при смене носителя можно привести правило к виду:
SUBSYSTEM=="block", KERNEL=="sr9*", TAG-="uaccess", RUN+="/usr/bin/setfacl -b %E", RUN+="/usr/bin/logger 'Astra UDEV: set access for device %E'"
После выполнения указанных действий прямой доступ к оптическим дискам на чтение и запись будет разрешен только суперпользователю (sudo) и пользователям, входящим в группу cdrom.
Для более точного разделения прав дополнительно можно определить права только на прямое чтение без права прямой записи. Для этого:
- Создать группу, которой будет разрешено чтение. При работе в домене это может быть доменная группа (см. документацию на используемый домен), или это может быть локальная группа, например, локальная группа cdrom_ro. Создать локальную группу:
SUBSYSTEM=="block", KERNEL=="sr6*", TAG-="uaccess", RUN+="/usr/bin/setfacl -b %E ; /usr/bin/setfacl -m g:cdrom_ro:r %E", RUN+="/usr/bin/logger 'Astra UDEV: set access for device %E'"
После выполнения указанных действий прямой доступ к оптическим дискам на чтение и запись будет разрешен суперпользователю (sudo) и пользователям, входящим в группу cdrom, а также разрешен доступ на чтение пользователям, входящим в группу cdrom_ro.
Разграничение прав доступа при работе в доменах
При работе в доменах (FreeIPA, Samba, ALD, Windows AD) для разграничения доступа рекомендуется использовать доменные группы. Принципы их применения аналогичны изложенным выше принципам применения локальных групп. При этом для разрешения записи можно использовать несколько модифицированное правило для разрешения чтения:
SUBSYSTEM=="block", KERNEL=="sr2*", TAG-="uaccess", RUN+="/usr/bin/setfacl -b %E ; /usr/bin/setfacl -m g:domain_cdrom_rw:rw %E", RUN+="/usr/bin/logger 'Astra UDEV: set access for device %E'"
Отличие от ранее приведенного правила, разрешающего чтение:
- использовано имя группы domain_cdrom_rw;
- устройству присваивается ACL разрешающий и чтение и запись: g:domain_cdrom_rw:rw.
Проверка корректности работы
При правильно настроенных правах доступа:
- Команда прямого чтения носителя должна успешно выполняться от имени суперпользователя (sudo), пользователей, входящих в группу cdrom или cdrom_ro и не должна выполняться от имени остальных пользователей. Пример команды:
Настройка udev rules в Linux
Начнём с небольшого введения для новичков. Философия Unix гласит, что всё есть файл. Таким образом, файлы в Unix — это не только информация, хранимая на жёстком диске, но и устройства. Да, в Linux жёсткий диск, мышь, клавиатура, флешка, сетевой адаптер и другие устройства имеют свои файлы, с помощью которых с ними и взаимодействуют различные системные программы.
Все файлы устройств хранятся в каталоге /dev. Этот каталог генерируется во время загрузки специальным сервисом — udev. Происходит это на основе подключённых к компьютеру устройств и определённых правил. По умолчанию в udev уже заложены все необходимые для нормальной работы устройств правила. Но некоторые пользователи хотят самим настраивать устройства и выбирать им имена и права доступа. Кроме того, понимание процесса генерации файлов устройств даёт возможность глубже понять работу операционной системы.
Правила udev помогут вам, если вы хотите:
- переименовать устройство, например жёсткий диск или сетевую карту;
- создать дополнительное имя для устройства;
- поменять права доступа к устройству;
- установить владельца и группу;
- выполнить скрипт при подключении или отключении устройства.
Общая информация про udev
Правила udev хранятся в папке /etc/udev/rules.d. Файл правил обязательно должен иметь расширение .rules. Обычно в этой папке уже есть несколько файлов udev rules, но их трогать не рекомендуется, для своих правил лучше создать отдельный файл, например:
Правило udev состоит из нескольких пар ключ — значение, разделённых запятой. Одни ключи используются для проверки соответствия устройства определённому правилу. В таких ключах используется знак == для разделения пары, например: SUBSYSTEM == «block». Это значит, что правило будет применено, только если значение ключа SUBSYSTEM для этого устройства равно block. Другие ключи используются для указания действия, если все условия соответствия выполняются. Для разделения пар в таких ключах используется знак равно » mydisk». Ну и полностью правило:
SUBSYSTEM==»block», ATTR(size)==»1343153213″, NAME=»mydisk»
Это правило выполниться только для устройства подсистемы block и с размером 1343153213 байт. Откуда брать эти значения, мы рассмотрим ниже, а пока разберёмся, что же значат те или иные ключи. Сначала ключи соответствия:
- SUBSYSTEM — подсистема устройства;
- KERNEL — имя, выдаваемое устройству ядром;
- DRIVER — драйвер, обслуживающий устройство;
- ATTR — sysfs-атрибут устройства;
- SUBSYSTEMS — подсистема родительского устройства.
Устройство может иметь родительские устройства, например, жёсткий диск имеет родительское устройство SSCI, которое в свою очередь имеет родительское устройство — шину BUS. Иногда необходимо получить информацию от родительского устройства. Для этого используются ключи SUBSYSTEMS, KERNELS, DRIVERS, ATTRS соответственно.
Для действий используются ключи:
- NAME — установить имя файла устройства;
- SYMLINK — альтернативное имя устройства;
- RUN — выполнить скрипт при подключении устройства;
- GROUP — группа, у которой есть доступ к файлу;
- OWNER — владелец файла устройства;
- MODE — маска прав доступа.
Рассмотрим подробнее ключ ATTR. Он позволяет получить информацию об устройстве, доступную в sysfs. Например, ATTR=13413423124, если размер устройства равен 13413423124. Посмотреть все возможные sysfs-параметры для устройства можно непосредственно в файловой системе /sys. Например, для диска /dev/sda есть каталог /sys/block/sda/, в котором можно найти файлы size, stat, ro, range и т д. Также посмотреть все возможные udev- параметры для устройства можно с помощью утилиты udevadm. Например, для диска /dev/sda:
Опция -n задаёт имя устройства, -p — путь в sysfs. Например, то же самое получим, если выполнить:
udevadm info -a -p /sys/block/sda/sda1
Как переименовать устройство в Linux
Теперь на основе полученной из udevadm информации можем составить udev rules для добавления альтернативного имени диска:
SUBSYSTEM==»block», ATTR==»976773168″, SYMLINK+=»root»
SUBSYSTEM==»block», ATTR==»976773168″, name=»root»
Получим устройство /dev/root, которое будет указывать на корневой раздел (sda1), то же самое можно сделать для привода оптических дисков:
udevadm info -a -p /sys/block/sr0
Затем добавляем правило на основе модели:
SUBSYSTEM==»block», ATTRS==»DVDRAM GH22NS70 «, SYMLINK+=»cdrom»
После перезагрузки появится файл устройства /dev/cdrom. Хотя, конечно, это можно сделать без udev, прописав в автозагрузку команду создания символической ссылки:
Как переименовать сетевую карту
Настройка udev Linux на этом не заканчивается. Сетевая карта — тоже устройство и тоже управляется udev. Файлы сетевых устройств хранятся в /sys/class/net. Поэтому получаем информацию о ней с помощью udevadm:
udevadm info -a -p /sys/class/net/enp24s0
И создаём правило, например на основе mac-адреса:
SUBSYSTEM==»net», ATTR==»00:d8:61:16:a5:a5″, NAME=»eth0″
Перезагружаем компьютер, и теперь устройство называется eth0.
Как запустить скрипт при подключении устройства
Например, мы хотим автоматически скопировать все данные с флешки при её подключении к компьютеру. Мы знаем, что флешка будет называться /dev/sdb, тогда можно создать правило udev такого вида:
При подключении флешки выполнится скрипт /usr/bin/my_script и сделает необходимые действия. Нужно заметить, что скрипт не должен выполняться слишком долго, так как udev остановится и будет ожидать завершения его работы.
Отладка правил
Если вы не уверены, правильно ли составлено правило, можно воспользоваться командой udevadm test для проверки. В единственном параметре нужно передать путь sysfs-устройства. Например, проверим наше правило для жёсткого диска:
Среди многочисленного вывода видим строчку:
creating link ‘/dev/root’ to ‘/dev/sda’
Значит всё работает, и настройка udev выполнена успешно. Если же в правиле допустить синтаксическую ошибку, например UBSYSTEM вместо SUBSYSTEM, udevadm test выдаст что-то подобное:
read rules file: /etc/udev/rules.d/10-local.rules
unknown key ‘UBSYSTEM’ in /etc/udev/rules.d/10-local.rules:2
invalid rule ‘/etc/udev/rules.d/10-local.rules:2’
Здесь мы видим саму причину ошибки, неверный ключ, а также файл и строку, в которой допущена ошибка.
Выводы
На этом всё. Теперь вы знаете, как создать правило udev и взять под полный контроль все ваши устройства. Если нужна более подробная информация по созданию и использованию правил udev, читайте официальную документацию по udev в man.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.