USBGuard

Материал из ALT Linux Wiki

USBGuard (https://usbguard.github.io/) предлагает механизм белого/чёрного списка для USB-устройств.

USBGuard решает, какое USB-устройство авторизовать, на основе политики, определенной набором правил. При подключении USB-устройства к системе служба последовательно сканирует существующие правила. Если соответствующее правило найдено, оно либо авторизует (разрешает), деавторизует (блокирует) или удаляет (отклоняет) устройство в зависимости от цели правила. Если соответствующее правило не найдено, решение принимается на основе неявной цели по умолчанию. Это неявное значение по умолчанию заключается в блокировке устройства до тех пор, пока пользователь не примет решение.

Примечание: Для выполнения задач по администрированию модуля можно также воспользоваться модулем ЦУС USBGuard.


Установка и первоначальная настройка

Установить пакет usbguard:

# apt-get install usbguard

Создать исходный набор правил на основе подключенных в данный момент USB-устройств (в правила с действием «allow» будут добавлены все подключенные устройства):

# usbguard generate-policy > /etc/usbguard/rules.conf
Примечание: Создать исходный набор правил, не генерируя атрибуты хэш-функции для устройств:
# usbguard generate-policy --no-hashes > /etc/usbguard/rules.conf


Запустить службу usbguard и добавить её в автозагрузку:

# systemctl enable --now usbguard

Команда usbguard

Синтаксис команды usbguard:

usbguard [ОПЦИИ] <команда> [ОПЦИИ КОМАНДЫ]

где команда может принимать одно из следующих значений:

  • get-parameter <name> — получить значение параметра времени выполнения;
  • set-parameter <name> <value> — установить значение параметра времени выполнения;
  • list-devices — вывести список всех USB-устройств, распознаваемых демоном USBGuard;
  • allow-device <id|rule|p-rule> — разрешить устройству взаимодействовать с системой;
  • block-device <id|rule|p-rule> — деавторизовать устройство;
  • reject-device <id|rule|p-rule> — деавторизовать и удалить устройство из системы;
  • list-rules — вывести набор правил (политику), используемый демоном USBGuard;
  • append-rule <rule> — добавить правило в набор правил;
  • remove-rule <id> — удалить правило из набора правил;
  • generate-policy — сгенерировать набор правил (политику) на основе подключенных USB-устройств;
  • watch — следить за событиями интерфейса IPC и выводить их на стандартный вывод;
  • read-descriptor — прочитать дескриптор USB из файла и вывести его в удобочитаемой форме;
  • add-user <name> — добавить пользователя/группу USBGuard IPC (требуются права root);
  • remove-user <name> — удалить пользователя/группу USBGuard IPC (требуются права root).

Дополнительную информацию смотрите на соответствующих страницах руководства, например:

$ usbguard add-user -h

Примеры:

  • вывести список подключенных устройств:
    $ usbguard list-devices
    1: allow id 1d6b:0002 serial "0000:00:0b.0" name "EHCI Host Controller" hash "SEiVqUWwefEKDMN9OJUyXkFIvvFPJmvPTRKIlVCvlvE=" parent-hash "BfFg9THiKJIvTnHGCjHfrWc00WcrIzhayJ9C3BiPYho=" via-port "usb1" with-interface 09:00:00 with-connect-type ""
    2: allow id 1d6b:0001 serial "0000:00:06.0" name "OHCI PCI host controller" hash "lUN32sIeMBBlD8Pd82mxu95iCTw8oKlT8iZDeg628/o=" parent-hash "XokStAV3JXWqQkW0l6YD7ZPFcHse1OtwuGmVNBCe46E=" via-port "usb2" with-interface 09:00:00 with-connect-type ""
    3: allow id 13fe:3e00 serial "11101094E6BA1A00A4A5200A" name "Silicon-Power4G" hash "0Dcf+ZVj7NkORO+RN1kxcP0rgDl6CqvqkcYkcf+0X/k=" parent-hash "SEiVqUWwefEKDMN9OJUyXkFIvvFPJmvPTRKIlVCvlvE=" via-port "1-1" with-interface 08:06:50 with-connect-type "unknown"
    
  • временно заблокировать устройство с id 3:
    $ usbguard block-device 3
    
  • для постоянной блокировки или и авторизации USB-устройство, следует использовать опцию -p. В этом случае в текущую политику будет добавлено правило для конкретного устройства:
    $ usbguard block-device 3 -p
    
  • вывести список правил:
    $ usbguard list-rules
    4: allow id 1d6b:0002 serial "0000:00:0b.0" name "EHCI Host Controller" hash "SEiVqUWwefEKDMN9OJUyXkFIvvFPJmvPTRKIlVCvlvE=" parent-hash "BfFg9THiKJIvTnHGCjHfrWc00WcrIzhayJ9C3BiPYho=" via-port "usb1" with-interface 09:00:00 with-connect-type ""
    5: allow id 1d6b:0001 serial "0000:00:06.0" name "OHCI PCI host controller" hash "lUN32sIeMBBlD8Pd82mxu95iCTw8oKlT8iZDeg628/o=" parent-hash "XokStAV3JXWqQkW0l6YD7ZPFcHse1OtwuGmVNBCe46E=" via-port "usb2" with-interface 09:00:00 with-connect-type ""
    6: block id 090c:1000 serial "2010121200000186" name "USB DISK" hash "2dfdMHZxF5olAaNbsh68G4fpzD3iQLPL3+M7KHnSRjE=" parent-hash "SEiVqUWwefEKDMN9OJUyXkFIvvFPJmvPTRKIlVCvlvE=" via-port "1-1" with-interface 08:06:50 with-connect-type "unknown"
    
  • дать пользователю user полный доступ к разделам «devices» и «exceptions», также, user будет иметь возможность просматривать и изменять текущую политику:
    # usbguard add-user -u user --devices ALL --policy modify,list --exceptions ALL
    
  • удалить права у пользователя user:
    # usbguard remove-user -u user
    

Конфигурация

Основной файл конфигурации USBGuard — /etc/usbguard/usbguard-daemon.conf.

В параметре PresentDevicePolicy определяется как обращаться с устройствами, которые уже подключены, при запуске службы. По умолчанию для PresentDevicePolicy установлено значение apply-policy, т.е. USBGuard оценивает набор правил для каждого подключенного устройства. Это наиболее безопасный параметр, который обеспечивает безопасность даже при перезагрузке службы.

В параметре ImplicitPolicyTarget настраивается политика обработки устройств по умолчанию, если ни одно правило не соответствует. Самый безопасный вариант здесь — block.

По умолчанию служба usbguard записывает события в файл /var/log/usbguard/usbguard-audit.log (параметр AuditFilePath).

В параметре IPCAllowedUsers (устарел) можно указать список имен пользователей, разделенных пробелами, от которых служба будет принимать запросы (по умолчанию: root).

В параметре IPCAllowedGroups (устарел) можно указать список имен групп, разделенных пробелами, от которых служба будет принимать запросы (по умолчанию: wheel).

В параметре IPCAccessControlFiles указывается каталог, файлы в котором будут интерпретироваться службой как файлы определения управления доступом. Каждый файл в этом каталоге обрабатывается следующим образом:

  • базовое имя файла интерпретируется как имя пользователя, UID, имя группы или GID;
  • если имя файла начинается с : (двоеточие), предполагается, что остальная часть имени представляет собой идентификатор группы (имя группы или GID в случае, если строка содержит только числовые значения);
  • если имя файла не начинается с :, то имя файла интерпретируется как идентификатор пользователя (имя пользователя или UID в случае, если строка содержит только числовые значения).

Содержимое файла анализируется построчно. Каждая строка определяет привилегии раздела в формате:

Раздел=привилегия [привилегия ...]

Если раздел опущен, предполагается, что для этого раздела привилегии не предоставлены.

Например:

IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/

Пример ACL пользователя user (содержимое файла /etc/usbguard/IPCAccessControl.d/user):

Devices=list,modify,listen
Policy=list,modify
Exceptions=listen

Доступные следующие разделы и привилегии:

  • Devices
    • modify: изменение состояния авторизации устройств, включая постоянные изменения (т.е. изменение правил для конкретных устройств в политике);
    • list: возможность получить список распознанных устройств и их атрибутов;
    • listen: прослушивание присутствия устройства и изменение политики устройства.
  • Policy
    • modify: возможность добавления/удаления правил в политике;
    • list: возможность просмотра текущей политики;
  • Exceptions
    • listen: возможность получения сообщений об исключениях;
  • Parameters
    • modify: возможность установить значения параметров времени выполнения;
    • list: возможность получить значения параметров времени выполнения.
Примечание: Для управления списком управления доступом (ACL), следует использовать команды usbguard add-user и usbguard remove-user.


Правила

Набор правил USBGuard по умолчанию хранится в файле /etc/usbguard/rules.conf. Но ручное редактирование правил обычно не требуется.

Синтаксис правила:

rule ::= target attributes.

target ::= "allow" | "block" | "reject".

attributes ::= attributes | attribute.
attributes ::= .

Например, правило для принтера Canon, подключенного через USB:

allow id 04a9:177a name "Canon E400" serial "F572EC" via-port "1-2" hash "eql9yA8m+5VVMmhXOvbUzwNPDGCAPq+fxIQHvbptlsY="

Первое слово в правиле определяет политику (цель):

  • allow — добавляет устройство в белый список;
  • block — останавливает обработку устройства;
  • reject — удаляет устройство из системы.
Примечание: USBGuard использует термины block и reject в следующих значениях:
  • block — пока не взаимодействовать с этим устройством;
  • reject — игнорировать это устройство, как будто его не существует.


Затем следует набор атрибутов с их параметрами. Атрибуты устройства — это определенные значения, считываемые с USB-устройства после его подключения к системе. Все атрибуты поддерживают две формы:

  • однозначная:
    name value
    
  • многозначная:
    name [operator] { value1 value2 … }
    

Возможные атрибуты:

Атрибут Описание
id usb-device-id Соответствует идентификатору USB-устройства. Идентификатор USB-устройства представляет собой пару, разделенную двоеточием, в форме vendor_id:product_id. И vendor_id и Product_id — это 16-битные числа в шестнадцатеричной системе счисления. Символ звездочки можно использовать для соответствия любому идентификатору устройства *:* или любому идентификатору продукта от конкретного поставщика, например, 1234:*.
id [оператор] {usb-device-id … } Соответствует набору идентификаторов USB-устройств
hash "value" Соответствует хэшу, вычисленному на основе значений атрибутов устройства и данных дескриптора USB. Хэш вычисляется USBGuard для каждого устройства
hash [оператор] { "value" … } Соответствует набору хэшей устройств
parent-hash "value" Соответствует хэшу родительского устройства
parent-hash [оператор] { "value" … } Соответствует набору хэшей родительского устройства
name "device-name" Соответствует имени USB-устройства
name [оператор] { "device-name" … } Соответствует набору имен USB-устройств
serial "serial-number" Соответствует серийному номеру устройства USB
serial [оператор] { "serial-number" … } Соответствует набору серийных номеров устройства USB
via-port "port-id" Соответствует USB-порту, через который подключено устройство. Значение port-id — это идентификатор USB-порта, специфичный для платформы. В Linux он имеет форму «usbN» в случае USB-контроллера (точнее, «корневого концентратора») или «bus-port[.port[.port …​]]» (например, 1-2, 1-2.1 , …​) в случае USB-устройства.

Некоторые системы имеют нестабильную нумерацию портов, которая меняется после перезагрузки системы или перезагрузки определенных модулей ядра. Необходимо использовать атрибут parent-hash, чтобы убедиться, что устройство подключено через определенное родительское устройство

via-port [оператор] { "port-id" … } Соответствует набору портов USB
with-interface interface-type Соответствует типу интерфейса, предоставляемому USB-устройством. Тип интерфейса указывается как три 8-битных числа в шестнадцатеричном формате, разделенных двоеточием, т.е. cc:ss:pp. Числа обозначают класс интерфейса (cc), подкласс (ss) и протокол (pp), назначенные USB-IF. Вместо номера подкласса и протокола можно использовать символ *, чтобы соответствовать всем подклассам или протоколам. Сопоставление определенного класса и определенного протокола не допускается, т.е. если в качестве номера подкласса используется «*», то для протокола также необходимо использовать «*».
with-interface [оператор] { interface-type interface-type … } Сопоставляет набор типов интерфейсов с набором интерфейсов, предоставляемых USB-устройством
with-connect-type "connect-type" Соответствует атрибуту устройства USB-порт/connect_type.
with-connect-type [оператор] { "connect-type" … } Соответствует набору атрибутов устройства USB-порт/connect_type.

Необязательный параметр оператор является одним из:

  • all-of — набор атрибутов устройства должен содержать все указанные значения;
  • one-of — набор атрибутов устройства должен содержать хотя бы одно из указанных значений;
  • none-of — набор атрибутов устройства не должен содержать ни одного из указанных значений;
  • equals — набор атрибутов устройства должен содержать данный набор значений;
  • equals-ordered — набор атрибутов устройства должен содержать данный набор значений в том же порядке;
  • match-all — набор атрибутов устройства должен быть подмножеством указанных значений.

Если оператор не указан, ему присваивается значение equals.

За исключением цели, все остальные поля правила являются необязательными. Правило, в котором указана только цель, будет соответствовать любому устройству. Это позволяет администратору политики указать явную цель по умолчанию. Если к устройству не применимо ни одно правило из политики, будет использоваться неявная цель, настроенная в /etc/usbguard/usbguard-daemon.conf.

Примеры политик:

  • разрешить USB-накопители (карты-памяти) и заблокировать все остальное (например, мыши, клавиатуры):
    allow with-interface 08:*:*
    
  • разрешить подключение принтера Canon, подключенного через USB, через определённый порт:
    allow id 04a9:177a name "Canon E400" serial "F572EC" via-port "1-2" hash "eql9yA8m+5VVMmhXOvbUzwNPDGCAPq+fxIQHvbptlsY="
    
  • отклонять устройства с подозрительной комбинацией интерфейсов (USB-накопитель, оснащенный клавиатурой или сетевым интерфейсом):
    allow with-interface equals { 08:*:* }
    reject with-interface all-of { 08:*:* 03:00:* }
    reject with-interface all-of { 08:*:* 03:01:* }
    reject with-interface all-of { 08:*:* e0:*:* }
    reject with-interface all-of { 08:*:* 02:*:* }