USB Guardを使ってUSBデバイスを利用制限する方法

# はじめに
　USBポートのセキュリティ対策のために、USBGuardを使った方法を紹介する。USBGuardは、不要なUSBデバイスをPCにつながせないためのツールである。ホワイトリスト形式で、記載のあるデバイスのみを利用可能とすることができる。

 # 動作確認環境
 * Ubuntu 20.04 (arm64)
   * Jetson Jetpack 5.1.1 

# インストール

下記コマンドでインストールする。

```bash
sudo apt update
sudo apt install usbguard
```

:::note warn
* インストール時に接続されているUSBのみが許可されるようになる
  * インストール時とは、別のUSBマウスやキーボードは利用できくなる（後述の許可設定が必要）
* USB Guardインストールは、USBデバイスを利用するには、都度許可が必要
:::

# 方法

## 接続デバイスの設定

　接続されているデバイスを確認して、デバイスの設定(許可・禁止・削除)する。

### 確認

```bash
sudo usbguard list-devices
```
　allowになっているのが、許可されているデバイス。デフォルトでは、インストール時に認識されていたUSBデバイスが、allowになっている。左端に表示されている番号がデバイス番号で、設定に使う番号となる。

```bash
7: allow id 1d6b:0002 serial "3610000.xhci" name "xHCI Host Controller" hash "..." via-port "usb1" with-interface 09:00:00 with-connect-type ""
8: allow id 1d6b:0003 serial "3610000.xhci" name "xHCI Host Controller" hash "..." via-port "usb2" with-interface 09:00:00 with-connect-type ""
9: allow id 2109:2812 serial "" name "USB2.0 Hub" hash "..." via-port "1-2" with-interface 09:00:00 with-connect-type "unknown"
10: allow id 1a40:0101 serial "" name "USB 2.0 Hub" hash "..." via-port "1-4" with-interface 09:00:00 with-connect-type "unknown"
11: allow id 2109:0812 serial "" name "USB3.0 Hub" hash "..." parent-hash "..." via-port "2-3" with-interface 09:00:00 with-connect-type "unknown"
12: allow id 1a81:1004 serial "" name "Wireless Dongle" hash "..." parent-hash "..." via-port "1-2.2" with-interface { 03:01:01 03:01:02 } with-connect-type "unknown"
```

### 許可

USBデバイスの利用を許可する。
```bash
sudo usbguard allow-device -p {device_no}
```
* -p: 恒久化オプション（設定を永続化するオプション)
* {device_no}: list-devicesで表示される左端の数字
  下記の場合は、「7」を指定する
  ```bash
  7: allow id 1d6b:0002 serial ....
  ```
### 禁止

リストには表示されるが、USBデバイスを利用できなくする。
```bash
sudo usbguard block-device -p {device_no}
```
* -p: 恒久化オプション（設定を永続化するオプション)
* {device_no}: list-devicesで表示される左端の数字

:::note warn
USBキーボード、マウスを禁止にすると操作不能になるので注意する。
:::

#### 例：デバイス番号17を禁止

```bash
sudo usbguard block-device -p 17
```

確認
```bash
sudo usbguard list-devices
```

blockが表示されていればOK。
```bash
...
17: block id 2109:0812 serial "" name "USB3.0 Hub" hash "..." parent-hash "..." via-port "2-3" with-interface 09:00:00 with-connect-type "unknown"
```

### 削除

デバイス認証を解除してシステムから削除する。blockとの違いは以下（[RedHatドキュメント 4.12. USBGuardの使用](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/security_guide/sec-using-usbguard)より引用）。
> USBGuard では、block および reject は以下の意味で使用されます。
    block - 今は、このデバイスとはやりとりしない
    reject - このデバイスは存在しないものとして無視する 



```bash
sudo usbguard reject-device -p {device_no}
```
* -p: 恒久化オプション（設定を永続化するオプション)
* {devide_no}: list-devicesで表示される左端の数字

## ルール
　ベンダIDなどルールを追加または削除する。デバイスが接続されていなくても設定可能。

### 確認

```bash
sudo usbguard list-rules
```

左側のIDが、```list-devices```の時のNoとは異なりルールNoとなっている。

```bash
1: allow id 1d6b:0002 serial "3610000.xhci" name "xHCI Host Controller" hash "..." parent-hash "..." with-interface 09:00:00 with-connect-type ""
2: allow id 1d6b:0003 serial "3610000.xhci" name "xHCI Host Controller" hash "..." parent-hash "..." with-interface 09:00:00 with-connect-type ""
3: allow id 2109:2812 serial "" name "USB2.0 Hub" hash "..." parent-hash "..." via-port "1-2" with-interface 09:00:00 with-connect-type "unknown"
4: allow id 1a40:0101 serial "" name "USB 2.0 Hub" hash "..." parent-hash "..." via-port "1-4" with-interface 09:00:00 with-connect-type "unknown"
5: block id 2109:0812 serial "" name "USB3.0 Hub" hash "..." with-interface 09:00:00 with-connect-type "unknown"
6: allow id 1a81:1004 serial "" name "Wireless Dongle" hash "..." parent-hash "..." with-interface { 03:01:01 03:01:02 } with-connect-type "unknown"
20: allow id 0bda:0409 serial "" name "USB3.2 Hub" hash "..." parent-hash "..." with-interface 09:00:00 with-connect-type "unknown"
```

### 追加

ベンダIDなどで追加する。

#### 例：許可ルールの追加 (allow id xxxx:xxxx)
```bash
sudo usbguard append-rule "allow id xxxx:xxxx"
```

確認
```bash
sudo usbguard list-rules 
```

正常に追加されると以下のようになる。

```bash
...
24: allow id 1a81:1004
```

### 削除

例：ルールの削除
```bash
sudo usbguard remove-rule {rule_no}
```
* {rule_no}: list-rulesで表示される左端の番号


# まとめ

　USB Guardを使って、USBデバイスの利用制限をすることができた。簡単に設定可能なので不要なUSBデバイスを繋がれたくない場合に使える。

# 参考

 https://gihyo.jp/admin/serial/01/ubuntu-recipe/0740

 https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/sec-using-usbguard