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

  • 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, SD-карты) оговорены в тексте.

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

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).

  • No labels