USBGuard
USBGuard は USB デバイスに対してホワイトリスト・ブラックリストを設定できるソフトウェアです。BadUSB などの exploit に対抗するために作られました。Linux カーネルに含まれているデバイスブロック機構を利用しており、デーモンとフロントエンドが存在します。
インストール
usbguard パッケージをインストールしてください。開発版は usbguard-gitAUR でインストールできます。
公式の Qt アプレットは 削除されusbguard-notifierAUR に 置き換え られました。Qt アプレットの非公式の分岐バージョンは、usbguard-applet-qtAUR として入手できます。
設定
メインの設定ファイルは /etc/usbguard/usbguard-daemon.conf です。編集するには root 権限が必要です。
IPC 経由でデーモンを制御したい場合、使用しているユーザー名を IPCAllowedUsers に、ユーザーのグループを IPCAllowedGroups に追加してルールを永続化させてください。大抵の場合、この設定が必要になります。
デフォルトでは usbguard は新しく接続されたデバイスを全てブロックします。デーモンが起動する前に接続されたデバイスはそのまま使うことができます。PresentDevicePolicy オプションを使うことでこの設定を変更できます。apply-policy に設定するとデーモンが再起動したときでもセキュリティが保証されます。
ImplicitPolicyTarget オプションではルールにマッチしないデバイスの扱い方を設定できます。一番セキュアな設定は block です。
設定に関する詳細は設定ファイル内の豊富なコメントを見てください。
使用方法
USBGuard にはコアデーモンと CLI、Qt GUI、D-Bus インターフェイスと libusbguard で使える API が備わっています。
Qt GUI や DBUS 経由で通信する他のプログラム (GNOME 統合も含む) を使用する場合は、usbguard-dbus.service を 有効化 して 起動 してください。
API による通信のみを行う場合 (CLI ツールや libusbguard を利用した他のソフトウェアで行う場合) usbguard.service を 有効化 して 起動 します。
CLI は usbguard コマンドで起動できます。
詳しくはそれぞれの man ページを見てください。
Qt アプレットは usbguard-applet-qt で起動でき、インタラクティブなグラフィカルインターフェイスが表示されます。
ルール
/etc/usbguard/rules.conf を編集することで、必要に応じて usbguard を設定できます。ただしルールを手動で編集する必要は通常ありません。
ルールの構文については こちら で詳しく解説されています。USB 接続の HP 製プリンターのルールは以下のようになります:
allow id 03f0:0c17 serial "00CNFD234631" name "hp LaserJet 2020" hash "a0ef07fceb6fb77698f79a44a450121m" parent-hash "69d19c1a5733a31e7e6d9530e6k434a6" with-interface { 07:01:03 07:01:02 07:01:01 }
ルールにはまずポリシーを指定します。allow はデバイスをホワイトリストに追加し、block はデバイスの使用を停止し、reject はデバイスをシステムから排除します。ポリシーの後には以下の属性とオプションを記述します:
| 属性 | 説明 |
|---|---|
| id usb-device-id | USB のデバイス ID が一致。 |
| id [operator] { usb-device-id ... } | USB デバイス ID がどれかに一致。 |
| hash "value" | デバイスの属性値や USB 記述子のデータから計算されるハッシュが一致。USBGuard は全てのデバイスのハッシュを計算します。 |
| hash [operator] { "value" ... } | デバイスのハッシュがどれかに一致。 |
| parent-hash "value" | 親デバイスのハッシュが一致。 |
| parent-hash [operator] { "value" ... } | 親デバイスのハッシュがどれかに一致。 |
| name "device-name" | USB のデバイス名が一致。 |
| name [operator] { "device-name" ... } | USB のデバイス名がどれかに一致。 |
| serial "serial-number" | USB の iSerial デバイス属性が一致。 |
| serial [operator] { "serial-number" ... } | USB の iSerial デバイス属性がどれかに一致。 |
| via-port "port-id" | デバイスを接続するのに使用した USB 端子が一致。環境によってはシステムを再起動したりカーネルモジュールがリロードされたときに端子の番号が変わってしまうことがあるので注意してください。特定の親デバイスで接続されたことを条件にしたい場合は親デバイスのハッシュ属性を使ってください。 |
| via-port [operator] { "port-id" ... } | USB 端子がどれかに一致。 |
| with-interface interface-type | USB デバイスのインターフェイスタイプが一致。 |
| with-interface [operator] { interface-type interface-type ... } | USB デバイスのインターフェイスタイプがどれかに一致。 |