USB — це зручно, але інколи небезпечно: флешка з шкідником, неконтрольовані копії даних або випадкове зчитування секретів. Сьогодні ми навчимося, як у Linux тонко контролювати доступ до USB‑пристроїв: блокувати масові накопичувачі через udev, фіксувати всі підключення за допомогою systemd і вимагати підтвердження адміністратора через PolicyKit. Я покажу прості рецепти, які ви виконаєте у терміналі Linux навіть без магії 🛡️
Що саме ми будемо контролювати
Мета — заблокувати доступ до USB‑накопичувачів (Mass Storage) за замовчуванням, дозволяючи лише схвалені пристрої. Клавіатура/миша мають продовжити працювати. Також додамо логи підключень через systemd і заборонимо звичайним користувачам монтувати USB через PolicyKit, якщо пристрій не у білому списку.
Крок 1. Досліджуємо пристрій через udev
Спочатку глянемо, які атрибути має ваше USB‑залізо. Це допоможе сформувати правила udev для блокування або винятків. Відкрийте термінал Linux і виконайте:
# Подивитися події udev у реальному часі
udevadm monitor --udev --environment
# Дізнатися шлях у sysfs для, наприклад, /dev/sdb
udevadm info -q path -n /dev/sdb
# Показати всі атрибути та відповідності для цього девайса
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
Зверніть увагу на: idVendor, idProduct, bInterfaceClass (для Mass Storage це 08), а також DEVPATH. Це знадобиться для фільтрів у правилах.
Крок 2. Блокуємо USB‑накопичувачі через udev
Схема проста: udev ловить підключення інтерфейсу класу 08 (Mass Storage) і негайно «деавторизує» USB‑пристрій, відмовляючи в роботі драйверам зберігання. Зробимо невеликий bash‑скрипт і правило udev.
2.1. Скрипт для деавторизації
sudo install -d /usr/local/sbin
sudo nano /usr/local/sbin/usbblock
Вставте вміст:
#!/usr/bin/env bash
set -euo pipefail
# Виклик: usbblock %p (udev DEVPATH інтерфейсу)
DEVPATH="$1"
SYS="/sys${DEVPATH}"
PARENT_DIR="$(dirname "$SYS")"
LOGTAG="usbblock"
# Спробувати деавторизувати батьківський USB-пристрій
if [[ -w "$PARENT_DIR/authorized" ]]; then
echo 0 > "$PARENT_DIR/authorized" || true
logger -t "$LOGTAG" "Blocked USB storage at $PARENT_DIR"
fi
# На деяких хостах діє authorized_default
if [[ -w "$PARENT_DIR/authorized_default" ]]; then
echo 0 > "$PARENT_DIR/authorized_default" || true
fi
sudo chmod +x /usr/local/sbin/usbblock
2.2. Правило udev
Створимо правило, яке реагує лише на USB‑інтерфейси класу 08 (Mass Storage), щоб не чіпати клавіатури, миші та інші девайси 🔌
sudo nano /etc/udev/rules.d/80-usbblock.rules
Вставте:
# Блокувати інтерфейси Mass Storage (08)
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", ATTR{bInterfaceClass}=="08", \
RUN+="/usr/local/sbin/usbblock %p", \
ENV{SYSTEMD_WANTS}+="usb-audit@%E{DEVPATH}.service"
sudo udevadm control --reload
# (Опційно) Перезапустити тригер для usb
sudo udevadm trigger --subsystem-match=usb
Тепер щойно підключений USB‑накопичувач буде деавторизований. Якщо потрібно дозволити конкретну флешку, додайте вище забороняючого правила «білий список» за vendor/product:
# Дозволити конкретний USB-накопичувач
ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \
ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1666", ATTR{bInterfaceClass}=="08", \
GOTO="usbblock_end"
# ...інші правила блокування...
LABEL="usbblock_end"
Тут ми використали природні можливості udev і базові права доступу Linux, щоб відмовляти пристрою ще до монтування.
Крок 3. Логи та нотифікації через systemd
Ми вже додали у правило змінну SYSTEMD_WANTS, яка стартує одиничний сервіс для аудиту кожного підключення. Створимо цей сервіс:
sudo nano /etc/systemd/system/usb-audit@.service
Вставте:
[Unit]
Description=Audit USB device %I
[Service]
Type=oneshot
ExecStart=/usr/bin/logger -t usb-audit "USB event: %I"
sudo systemctl daemon-reload
Перевіряти події зручно так:
journalctl -t usbblock -t usb-audit -f
Крок 4. Обмежуємо монтування через PolicyKit (udisks2)
Навіть якщо якийсь пристрій проскочить блокування, заборонимо «звичайним» користувачам монтувати USB‑накопичувачі без підвищення прав. Додамо групу дозволених користувачів (наприклад, для адмінів) — тут стане в пригоді тема користувачі та групи Linux:
sudo groupadd -f usb-allow
sudo usermod -aG usb-allow <your-login>
Створіть полісі‑правило для UDisks2:
sudo nano /etc/polkit-1/rules.d/49-usb-udisks2.rules
polkit.addRule(function(action, subject) {
if (action.id && action.id.indexOf("org.freedesktop.udisks2.") === 0) {
var sysfs = action.lookup("sysfs-path");
// Обмежуємо саме USB-пристрої
if (sysfs && sysfs.indexOf("/usb") >= 0) {
if (subject.isInGroup("usb-allow")) {
return polkit.Result.YES; // Білий список групи
}
// Вимагати пароль адміністратора для монтування/форматування USB
return polkit.Result.AUTH_ADMIN_KEEP;
}
}
});
Перезапуск polkit не потрібен; правило підхопиться автоматично. Тепер монтування USB через файловий менеджер чи інші інструменти запросить права адміністратора, якщо користувач не у групі usb-allow. Це прозорий спосіб посилити права доступу Linux без грубих заборон.
Альтернативні способи
- Заборонити модуль ядра usb-storage: створіть файл /etc/modprobe.d/deny-usb-storage.conf з рядком
blacklist usb-storageі перезавантажте систему. Мінус: надто грубо, важко робити винятки. - Правила монтуння у fstab з
noautoта без опціїuser. Це працює, якщо пристрій уже видимий системі, але не вирішує низькорівневого доступу. - USBGuard. Окремий інструмент з білими/чорними списками та навіть аплетом. Підходить, якщо хочете централізовані політики й GUI.
GUI-спосіб: USBGuard Applet (швидкий старт)
Якщо вам зручніше контроль у треї, спробуйте USBGuard з аплетом. Він добре доповнює наші udev/PolicyKit‑налаштування:
# Debian/Ubuntu
sudo apt install usbguard usbguard-applet-qt
sudo systemctl enable --now usbguard
# Згенерувати політику з поточних пристроїв (дозволити вже підключені)
sudo usbguard generate-policy | sudo tee /etc/usbguard/rules.conf
sudo systemctl restart usbguard
Аплет дозволяє у кілька кліків дозволяти/блокувати нові USB‑девайси. Для любителів графіки — саме те, хоча базові кроки все одно виконуються у термінал Linux.
FAQ
Клавіатура або миша перестали працювати. Що робити?
Ваше правило надто широке. Переконайтеся, що ви блокуєте лише інтерфейси з bInterfaceClass=="08" (Mass Storage). Видаліть або відкоментуйте зайві правила, перезавантажте udev: sudo udevadm control --reload. Тримайте під рукою SSH або консоль TTY на випадок помилок.
Як дозволити конкретну флешку?
Додайте вище правила блокування виняток з ATTRS{idVendor} та ATTRS{idProduct} для вашого пристрою (див. приклад у розділі 2.2), або додайте сторінку до білого списку в USBGuard. Це акуратніше, ніж знімати блокування для всіх.
Як протестувати без ризику «замкнути» себе?
Почніть з віртуальної машини або забезпечте запасний доступ: SSH, локальна TTY. Правило робіть тільки для Mass Storage. Можна тимчасово коментувати RUN‑рядки і перевіряти спрацьовування через udevadm test для конкретного DEVPATH.
Як швидко повернути все як було?
Видаліть /etc/udev/rules.d/80-usbblock.rules, скрипт /usr/local/sbin/usbblock, і (за потреби) правило PolicyKit. Потім: sudo udevadm control --reload, sudo systemctl daemon-reload. Перевірте: journalctl -b | grep usbblock.
Чи працює це на всіх дистрибутивах?
Так, бо ми використовуємо стандартні механізми udev, systemd і polkit. Шляхи до файлів можуть трохи відрізнятися, але загальна логіка однакова.
Порада від Kernelka
Перш ніж розгортати політики по всій організації, зберіть журнал типових USB‑девайсів протягом тижня та складіть «білий список». Так ви не зламаєте робочі процеси і уникнете валу звернень у підтримку 🙂 А ще тримайте список винятків у git — це зручно для рев’ю та аудитів.
Підсумок
- Udev блокує Mass Storage на рівні ядра через деавторизацію пристрою.
- Systemd фіксує всі підключення у журналі для аудиту.
- PolicyKit не дозволяє змонтувати USB без прав адміністратора або членства у групі usb-allow.
- Для зручності можна додати GUI‑контроль через USBGuard.
- Використані інструменти прозорі, керовані та дружать з bash скрипти і принципами безпеки Linux.