USBGuard: различия между версиями
Строка 71: | Строка 71: | ||
По умолчанию служба usbguard записывает события в файл {{path|/var/log/usbguard/usbguard-audit.log}} (параметр ''AuditFilePath''). | По умолчанию служба usbguard записывает события в файл {{path|/var/log/usbguard/usbguard-audit.log}} (параметр ''AuditFilePath''). | ||
В параметре ''IPCAllowedUsers'' | В параметре ''IPCAllowedUsers'' (устарел) можно указать список имен пользователей, разделенных пробелами, от которых служба будет принимать запросы (по умолчанию: root). | ||
В параметре ''IPCAllowedGroups'' | В параметре ''IPCAllowedGroups'' (устарел) можно указать список имен групп, разделенных пробелами, от которых служба будет принимать запросы (по умолчанию: wheel). | ||
В параметре ''IPCAccessControlFiles'' указывается каталог, файлы в котором будут интерпретироваться службой как файлы определения управления доступом. Например: | В параметре ''IPCAccessControlFiles'' указывается каталог, файлы в котором будут интерпретироваться службой как файлы определения управления доступом. | ||
Каждый файл в этом каталоге обрабатывается следующим образом: | |||
* базовое имя файла интерпретируется как имя пользователя, UID, имя группы или GID; | |||
* если имя файла начинается с : (двоеточие), предполагается, что остальная часть имени представляет собой идентификатор группы (имя группы или GID в случае, если строка содержит только числовые значения); | |||
* если имя файла не начинается с :, то имя файла интерпретируется как идентификатор пользователя (имя пользователя или UID в случае, если строка содержит только числовые значения). | |||
Содержимое файла анализируется построчно. Каждая строка определяет привилегии раздела в формате: | |||
Раздел=привилегия [привилегия ...] | |||
Если раздел опущен, предполагается, что для этого раздела привилегии не предоставлены. | |||
Например: | |||
<syntaxhighlight lang="ini">IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/</syntaxhighlight> | <syntaxhighlight lang="ini">IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/</syntaxhighlight> | ||
Строка 83: | Строка 94: | ||
Policy=list,modify | Policy=list,modify | ||
Exceptions=listen</syntaxhighlight> | Exceptions=listen</syntaxhighlight> | ||
Доступные следующие разделы и привилегии: | |||
* Devices | |||
**modify: изменение состояния авторизации устройств, включая постоянные изменения (т.е. изменение правил для конкретных устройств в политике); | |||
**list: возможность получить список распознанных устройств и их атрибутов; | |||
**listen: прослушивание присутствия устройства и изменение политики устройства. | |||
*Policy | |||
**modify: возможность добавления/удаления правил в политике; | |||
**list: возможность просмотра текущей политики; | |||
*Exceptions | |||
**listen: возможность получения сообщений об исключениях; | |||
*Parameters | |||
**modify: возможность установить значения параметров времени выполнения; | |||
**list: возможность получить значения параметров времени выполнения. | |||
{{Note|Для управления списком управления доступом (ACL), следует использовать команды {{cmd|usbguard add-user}} и {{cmd|usbguard remove-user}}.}} | {{Note|Для управления списком управления доступом (ACL), следует использовать команды {{cmd|usbguard add-user}} и {{cmd|usbguard remove-user}}.}} |
Текущая версия от 18:03, 16 мая 2024
USBGuard (https://usbguard.github.io/) предлагает механизм белого/чёрного списка для USB-устройств.
USBGuard решает, какое USB-устройство авторизовать, на основе политики, определенной набором правил. При подключении USB-устройства к системе служба последовательно сканирует существующие правила. Если соответствующее правило найдено, оно либо авторизует (разрешает), деавторизует (блокирует) или удаляет (отклоняет) устройство в зависимости от цели правила. Если соответствующее правило не найдено, решение принимается на основе неявной цели по умолчанию. Это неявное значение по умолчанию заключается в блокировке устройства до тех пор, пока пользователь не примет решение.
Установка и первоначальная настройка
Установить пакет 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: возможность получить значения параметров времени выполнения.
Правила
Набор правил 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 — удаляет устройство из системы.
- 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:*:* }