Как с помощью udev заблокировать некоторые устройства, но при этом запретить доступ ко всем остальным?

Как я могу использовать udev для блокировки различных типов USB-устройств? Вот несколько примеров сценариев, которые мне интересны: 

1. Блокировать все устройства, кроме клавиатур и мышей.
2. Разрешить только определенный набор USB-носителей, а также любые клавиатуры и мыши, заблокировав все остальные устройства.
3. Запретить любые сетевые адаптеры (Ethernet и Wi-Fi).

В данный момент я могу писать правило, которое запрещает все, кроме конкретной клавиатуры (идентификаторы idVendor и idProduct взяты из lsusb), вот как оно выглядит:

```plaintext
SUBSYSTEM=="usb", ATTR{idVendor}!="1c4f", ATTR{idProduct}!="0002", ENV(ID_SERIAL)!="EM_HCT_Keyboard",  ATTR{authorized}="0"
```

Как мне изменить это правило, чтобы оно разрешало любые клавиатуры? 

Я также нашел несколько примеров в Google, например:

```plaintext
#type:usb-storage
ACTION!="add", GOTO="dont_remove_usb"
ENV{DRIVER}!="usb-storage", GOTO="dont_remove_usb"
ENV{DRIVER}=="usb-storage", ATTR{authorized}="0"
LABEL="dont_remove_usb"

#type:usb-modems
ACTION!="add", GOTO="dont_remove_usb"
DRIVER!="rndis_host", GOTO="dont_remove_usb"
DRIVER=="rndis_host", ATTR{authorized}="0"
LABEL="dont_remove_usb"

#type:gphoto2
ACTION!="add", GOTO="dont_remove_usb"
ENV{GPHOTO2_DRIVER}!="PTP",GOTO="dont_remove_usb"
ENV{GPHOTO2_DRIVER}=="PTP",ATTR{authorized}="0"
LABEL="dont_remove_usb"
```

Однако моя флешка не имеет `ENV{DRIVER}=="usb-storage"`, а мой Wi-Fi-адаптер не соответствует `DRIVER=="rndis_host"`:

```plaintext
Bus 007 Device 002: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
# udevadm info /dev/bus/usb/007/002 | grep DRIVER
E: DRIVER=usb
E: DEVTYPE=usb_device
# udevadm info -a /dev/bus/usb/007/002 | grep SUBSYSTEM
    SUBSYSTEM=="usb"
```

Как мне подойти к данной задаче?
  • 11 ноября 2024 г. 9:43
Ответы на вопрос 1
Для того чтобы использовать `udev` для управления доступом к USB-устройствам в соответствии с вашими требованиями, необходимо создать правила, которые будут разрешать или блокировать определённые устройства на основе их атрибутов.

Сначала, чтобы разрешить любые клавиатуры и мыши, можно воспользоваться атрибутами `idVendor` и `idProduct`, чтобы проверить, является ли устройство клавиатурой или мышью. Это можно сделать с помощью глобальных переменных `KERNEL` и `ENV`. Например, вот как можно разрешить все клавиатуры и мыши, блокируя все остальные устройства.

### Пример правил `udev`

1. **Блокировать все устройства, кроме клавиатур и мышей:**
   ```plaintext
   # Блокируем все USB-устройства, кроме клавиатур и мышей
   SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}!="*", ATTR{idProduct}!="*"
   ENV{ID_INPUT}!="", ATTR{authorized}="1"
   ENV{ID_INPUT_KEYBOARD}=="*", ATTR{authorized}="1"
   ENV{ID_INPUT_MOUSE}=="*", ATTR{authorized}="1"
   ATTR{authorized}="0"
   ```

2. **Разрешить только определённый набор USB-носителей, а также любые клавиатуры и мыши:**
   ```plaintext
   # Разрешаем только определенный USB-носитель и любые клавиатуры и мыши
   SUBSYSTEM=="usb", ACTION=="add", \
   ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", ATTR{authorized}="1" \
   ENV{ID_INPUT}!="", ATTR{authorized}="1" \
   ENV{ID_INPUT_KEYBOARD}=="*", ATTR{authorized}="1" \
   ENV{ID_INPUT_MOUSE}=="*", ATTR{authorized}="1" \
   ATTR{authorized}="0"
   ```

   Замените `1234` и `5678` на `idVendor` и `idProduct` вашего USB-носителя.

3. **Запретить любые сетевые адаптеры (Ethernet и Wi-Fi):**
   ```plaintext
   # Блокируем любые сетевые адаптеры (Ethernet и Wi-Fi)
   SUBSYSTEM=="net", ACTION=="add", ATTR{authorized}="0"
   ```

### Как применить правила

1. Создайте файл правил в директории `/etc/udev/rules.d/`. Например, вы можете создать файл `99-usb-block.rules`:
   ```bash
   sudo nano /etc/udev/rules.d/99-usb-block.rules
   ```

2. Вставьте необходимые правила в этот файл.

3. После внесения изменений перезагрузите `udev`, чтобы применить новые правила:
   ```bash
   sudo udevadm control --reload-rules
   ```

4. Также перезагрузите систему или отключите/подключите USB-устройства, чтобы изменения вступили в силу.

### Уточнения

- Убедитесь, что вы правильно указали идентификаторы устройств (vendor и product) для конкретных устройств, которые хотите разрешить.
- Для проверки правил можно использовать команду `udevadm monitor`, чтобы видеть активность устройств в реальном времени при их подключении и отключении.

Эти примеры могут быть адаптированы и комбинированы в зависимости от ваших нужд и типов устройств, которые вы хотите заблокировать или разрешить.
Похожие вопросы