USBGuard
USBGuard は USB デバイスに対してホワイトリスト・ブラックリストを設定できるソフトウェアです。BadUSB などの exploit に対抗するために作られました。Linux カーネルに含まれているデバイスブロック機構を利用しており、デーモンとフロントエンドが存在します。
インストール
usbguard パッケージをインストールしてください。開発版は usbguard-gitAUR でインストールできます。
設定
メインの設定ファイルは /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 を使ったり他のプログラムから D-Bus で通信したい場合、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 デバイスのインターフェイスタイプがどれかに一致。 |