Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1
  • Astra Linux Special Edition РУСБ.10015-16 исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12

Общий обзор доступных параметров идентификации

В данный обзор не включены параметры устройств, относящиеся к их подключению к ОС. Такие параметры нежелательно применять для идентификации устройств, так как они:

  • могут повторяться для разных устройств (присвоение имени sdX);
  • могут зависеть от порядка подключения устройств (присвоение имен sdX);
  • могут изменяться при изменении аппаратной конфигурации;
  • с высокой вероятностью будут отличаться на разных доменных компьютерах, имеющих разную аппаратную конфигурацию.
Далее под термином устройство в настоящей статье по умолчанию подразумеваются устройства с интегрированным носителем информации: накопители на жестких магнитных дисках, накопители SSD, USB-flash. Особенности применения накопителей со  сменными носителями информации (CD, DVD) оговорены в тексте.

Все параметры подключенного устройства можно получить командой:

sudo udevadm info --query=property --name=/dev/<имя_устройства>

Выполнить мониторинг событий, происходящих при операциях с устройствами, можно командой:

udevadm monitor

  1. Операции назначения мандатных атрибутов выполняются при подключении устройства:

    1. для всех обнаруженных носителей применяется операция "добавление":

      ACTION=="add"

      при этом операции добавления выполняются раздельно для самого носителя и для всех находящихся на этом носителе дисковых разделов.

    2. Для приводов компакт-дисков при смене CD/DVD-диска и для адаптеров SD-карт может применяться операция "смена носителя":

      ACTION=="change"
  2. Съемные и сменные носители всегда являются блочными устройствами:

    ENV{SUBSYSTEM}=="block"
  3. Съемные и сменные носители всегда являются устройствами типа "диск" (disk) или типа "дисковый раздел" (partition):

    ENV{DEVTYPE}=="disk"
    ENV{DEVTYPE}=="partition"

    при этом правила МРД Parsec, применяемые для реализации учета съемных носителей, работают с дисковыми разделами.

  4. Атрибуты, теоретически применимые для идентификации носителей:

    Для идентификации сменных носителей типа CD/DVD-диск и SD-карта применимы только параметры "ID_FS_LABEL" и "ID_FS_LABEL_ENC".
    1. Для съемных устройств типа "диск" (также применимы к устройствам типа "дисковый раздел", которыми наследуются от устройства "диск"):

      1. ENV{ID_VENDOR}=="SanDisk"
      2. ENV{ID_VENDOR_ID}=="0781"
      3. ENV{ID_VENDOR_ENC}=="SanDisk\\x20"
      4. ENV{ID_MODEL}=="Cruzer_Glide"
      5. ENV{ID_MODEL_ID}=="5575"
      6. ENV{ID_MODEL_ENC}=="Cruzer\\x20Glide\\x20\\x20\\x20\\x20"
      7. ENV{ID_SERIAL}=="SanDisk_Cruzer_Glide_XXXXXXXXXXXXXXXXXX-0:0"
      8. ENV{ID_SERIAL_SHORT}=="XXXXXXXXXXXXXXXXXX"
    2. Дополнительные атрибуты, применимые к устройствам типа "дисковый раздел":
      1. "ENV{ID_FS_LABEL}=="FLASH128G2"
      2. "ENV{ID_FS_LABEL_ENC}=="FLASH128G2"
      3. "ENV{ID_PART_ENTRY_NUMBER}=1"
      4. "ENV{ID_FS_TYPE}=="vfat"
      5. "ENV{ID_FS_USAGE}=="filesystem"
      6. "ENV{ID_FS_UUID}=="0047-C44D"
      7. "ENV{ID_FS_UUID_ENC}=="0047-C44D"
      8. "ENV{ID_FS_VERSION}=="FAT32" 
      9. "ENV{ID_PART_ENTRY_NUMBER}=1"

Рекомендации по выбору параметров идентификации

  1. Основным минимальным параметром идентификации съемного носителя является его серийный номер (ID_SERIAL или ID_SERIAL_SHORT). Для сменных носителей идентифицирующими являются только параметры ID_FS_LABEL и ID_FS_LABEL_ENC;

  2. Для гарантированной уникальности идентификации съемных носителей при использовании оборудования разных моделей и разных производителей можно использовать набор параметров "Производитель" - "Модель" - "Серийный номер" (например, ID_VENDOR, ID_MODEL, ID_SERIAL или ID_VENDOR_ID, ID_MODEL_ID, ID_SERIAL и т.д.);

  3.  С учетом того, что на одном устройстве может располагаться несколько дисковых разделов в дополнение к параметрам идентификации носителя для идентификации дисковых разделов можно использовать:

    Следует помнить, что все параметры файловой системы подделать гораздо проще, чем параметры физического носителя, поэтому предпочтительно придерживаться политики "один носитель - один дисковый раздел".
    1. Метку файловой системы (ID_FS_LABEL);
    2. Универсальный идентификатор файловой системы UUID (ID_FS_UUID);
    3. Номер раздела на носителе (ID_PART_ENTRY_NUMBER}.

Параметры дисковых разделов, описывающие файловую систему (ID_FS_TYPE и ID_FS_VERSION) могут быть использованы для создания правил монтирования с учетом кодировок (известная проблема: правило монтирования, по умолчанию заданное в файле etc/fstab.pdac для устройства /dev/sd* несовместимо с устройствами с файловой системой ext4).

Ограничение портов подключения устройств

Для программного запрета подключать учтенные устройства к незарегистрированным портам можно использовать параметр DEVPATH в правилах вида:

ENV{DEVPATH}!="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/*", GOTO="END"

где в качестве аргумента указывается префикс пути к подключенному устройству. Обратите внимание на последний символ - '*', обеспечивающий возможность сравнения неполных строк.

Следует помнить, что на разных машинах пути подключения могут быть разными, а при изменении аппаратной конфигурации пути подключения могут изменяться.
Также нельзя гарантировать, что пути подключения останутся неизменными после перезагрузки, так как устройства при загрузке ОС могут определяться в разном порядке.

Примерный шаблон правила udev

Автоматически создаваемые локальные правила Parsec находятся в каталоге /etc/udev/rules.d/.
Автоматически создаваемые доменные правила Parsec находятся в каталоге /run/udev/rules.d/.

Идентификация дискового раздела по серийному номеру устройств и UUID:

# отсекаются ненужные устройства - вероятность несовпадения серийника выше, правило сработает чаще
ENV{ID_SERIAL}!="SanDisk_Cruzer_Glide_ХХХХХХХХХХХХХ-0:0", GOTO="END"  
ENV{ID_FS_UUID}!="0047-C44D", GOTO="END"  

# отсекаются ненужные события
ACTION!="add",             GOTO="END"
ENV{SUBSYSTEM}!="block",   GOTO="END"
ENV{DEVTYPE}!="partition", GOTO="END" 

# настройка правил Parsec
OWNER="luser", GROUP="root", MODE="740", PDPL="0:0:0x0:0x0!:", AUDIT="o:0x0:0x0"
ENV{ID_FS_TYPE}=="?*", SYMLINK+="%k_$env{ID_FS_TYPE}", RUN+="/bin/ln -f /dev/%k /dev/%k_$env{ID_FS_TYPE}"

LABEL="END"

Запрет подключения USB-устройств

Автоматическое удаление всех USB-устройств

Для полного запрета подключения USB-устройств создать правило udev, например, в файле /etc/udev/rules.d/99-local.rules:

ACTION!="add", GOTO="DONE"
ENV{ID_BUS}!="usb", GOTO="DONE"
RUN="/bin/sh -c 'echo 1 >/sys$devpath/remove'", RUN="/usr/bin/logger -s 'Astra mount: remove device %E{DEVNAME} %E{ID_VENDOR} %E{ID_SERIAL}'"
LABEL="DONE"

Это правило отключает все USB-устройства (диски и дисковые разделы) немедленно после их подключения.

Автоматическая деавторизация всех USB-устройств

Для запрета использования USB-устройств создать правило udev, например, в файле /etc/udev/rules.d/99-local.rules:

ACTION!="add", GOTO="DONE"
ENV{ID_BUS}!="usb", GOTO="DONE"
RUN="/bin/sh -c 'echo 0 >/sys$devpath/authorized'", RUN="/usr/bin/logger -s 'Astra mount: deauth device %E{DEVNAME} %E{ID_VENDOR} %E{ID_SERIAL}'"
LABEL="DONE"

Это правило запрещает использовать все USB-устройства немедленно после их подключения.

Селективное удаление USB-устройств

  1. Создать сценарий для удаления устройства, например:
    1. Создать файл /usr/sbin/astra-mount со следующим содержимым:

      #!/bin/bash
      
      l="/usr/bin/logger -s -t \"Astra-mount:\""
      path="/sys$1"
      
      while true ; do
          if [[ "$path" == "/sys/devices" ]] ; then
              $l "Remove option not found"
              exit 1
          fi
          if [ -f "$path/remove" ] ; then
              $l "Removing $path/remove"
              echo 1 > "$path/remove" || $l "Can not remove $path/remove"
              break
          fi
          path=`dirname "$path"`
      done

      Данный сценарий:

      1. Получает в качестве единственного аргумента путь к устройству;

      2. Последовательно ищет по полученному пути к устройству родительское устройство, поддерживающее операцию удаления;

      3. Выполняет операцию удаления;

    2. Ограничить доступ к созданному файлу и сделать созданный файл исполняемым:

      sudo chmod +x,go-w /usr/sbin/astra-mount

  2. Создать udev-правило проверки параметров устройств для вызова сценария удаления устройства, например, в файле /etc/udev/rules.d/99-local.rules:

    ACTION=="add", ENV{ID_BUS}=="usb", ENV{DEVTYPE}=="disk", RUN+="/usr/sbin/astra-mount $devpath"

    Данное правило при добавлении (ACTION=="add") устройств USB (ENV{ID_BUS}=="usb") типа disk (ENV{DEVTYPE}=="disk") вызывает сценарий удаления (/usr/sbin/astra-mount), передавая вызываемому сценарию путь к устройству ($devpath).