USBGuard

提供: ArchWiki
2023年11月14日 (火) 02:21時点におけるKgx (トーク | 投稿記録)による版 (→‎GNOME との統合: リンクを修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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、GUI、D-Bus インターフェイスと libusbguard で使える API が備わっています。

警告: デーモンを起動/有効化する前に必ず実際に設定してください、しない場合キーボードとマウスを含むすべての USB デバイスが直ちにブロックされます!

Qt GUI や DBUS 経由で通信する他のプログラム (GNOME 統合も含む) を使用する場合は、usbguard-dbus.service有効化 して 起動 して下さい。

API による通信のみを行う場合 (CLI ツールや libusbguard を利用した他のソフトウェアで行う場合) usbguard.service有効化 して 起動 して下さい。

CLI は usbguard コマンドで起動できます。

詳しくはそれぞれの man ページを見てください。

ルール

必要に応じて USBGuard を構成するには、/etc/usbguard/rules.conf を編集します。ただし、通常、ルールを手動で編集する必要はありません。root として usbguard generate-policy > /etc/usbguard/rules.conf を実行することにより、現在接続されている USB デバイスに基づいてルールセットを生成できます。

ルールの構文は、こちら で正式に説明されています。 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 デバイスのインターフェイスタイプがどれかに一致。

GNOME との統合

GNOME には USBGuard のサポートが組み込まれています 3.36 から GNOME のアクセスを許可するためには polkit ルールの設定が必要で、デフォルトではデバイスを許可しロックスクリーンでのみブロックするように dconf が変更されています。

警告: 最初に実際にポリシーを生成してください (使い方ルール を参照してください) しない場合キーボードやマウスの入力を含むすべての USB デバイスがすぐにブロックされます!

USBGuard デーモンに GNOME アクセスを許可する

次のファイルを作成して、USBGuard へのアクセスが割り当てられた wheel グループを持つユーザーの下で実行されている GNOME Shell を承認します。

/etc/polkit-1/rules.d/70-allow-usbguard.rules
// Allow users in wheel group to communicate with USBGuard
polkit.addRule(function(action, subject) {
    if ((action.id == "org.usbguard.Policy1.listRules" ||
         action.id == "org.usbguard.Policy1.appendRule" ||
         action.id == "org.usbguard.Policy1.removeRule" ||
         action.id == "org.usbguard.Devices1.applyDevicePolicy" ||
         action.id == "org.usbguard.Devices1.listDevices" ||
         action.id == "org.usbguard1.getParameter" ||
         action.id == "org.usbguard1.setParameter") &&
        subject.active == true && subject.local == true &&
        subject.isInGroup("wheel")) {
            return polkit.Result.YES;
    }
});

polkit ルールへの変更は、polkit デーモン自体によって自動的に取得されます。

GNOME USB 保護をオンにする

USBGuard サービスが存在し、この設定が有効な場合、USB デバイスは usb-protection-level の設定で設定されたとおりに保護されます。以下のコマンドを実行することで有効にします。

$ gsettings set org.gnome.desktop.privacy usb-protection true

デフォルトですべての USB デバイスをブロック

lockscreen に設定すると、ロック画面が表示されている場合にのみ、新しい USB デバイスが拒否されます。always に設定すると、すべての新しい USB デバイスが常に拒否されます。以下のコマンドを実行して、すべての新しい USB デバイスを拒否します。

$ gsettings set org.gnome.desktop.privacy usb-protection-level always

関連プロジェクト

  • usbkill-gitAUR (USB ポートの変更を待機し、すぐにコンピュータをシャットダウンする anti-forensic kill-switch)
  • silk-guardian-dkmsAUR (不明な USB デバイスのキルスイッチ (DKMS))

参照