Как запретить USB-устройства на уровне ядра

В некоторых инфраструктурах USB-устройства являются реальным вектором атак.

Для решения задач безопасности инфраструктуры от несанкционированного доступа посредством USB-устройств, в Linux существует довольно мощный инструмент встроенный в ядро USBGuard.

USBGuard создаёт политику разрешённых USB-устройств по их VID/PID и серийному номеру. Всё, что не разрешено — автоматически блокируется.

Debian/Ubuntu

$ sudo apt install usbguard

Fedora

$ sudo dnf install -y usbguard usbguard-selinux usbguard-notifier

Arch

$ sudo pacman -S usbguard

Генерируем политику

$ sudo usbguard generate-policy > /etc/usbguard/rules.conf

Включаем автозапуск службы

$ sudo systemctl enable --now 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:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00
...
6: allow id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50

временно заблокировать устройство с id 6:

# usbguard block-device 6

для постоянной блокировки и авторизации USB-устройство, следует использовать опцию -p. В этом случае в текущую политику будет добавлено правило для конкретного устройства:

# usbguard block-device 6 -p
1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00
...
6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50

USBGuard использует термины block и reject в следующих значениях:

  • block — пока не взаимодействовать с этим устройством;
  • reject — игнорировать это устройство, как будто его не существует.

Более подробно об утилите на официальной странице