USBを挿すだけ — 簡単そうに見えて、実はかなり危険
以前こんな場面を目にしたことがある。同僚がデスクにUSBを置き忘れ、誰かが「誰のものか確認しよう」と拾ってPCに挿した。結果は?気づかないうちにキーロガーが仕込まれていた。作り話のように聞こえるかもしれないが、これはBadUSBと呼ばれる攻撃の典型的なシナリオだ。
BadUSBの恐ろしいところは、見た目はごく普通のUSBなのに、内部のマイクロコントローラーがキーボード、ネットワークカード、その他のHIDデバイスを偽装するよう書き換えられている点だ。挿した瞬間に自動でコマンドを実行し、マルウェアをダウンロードし、バックドアを開く——気づく前にすべてが数秒で完了する。
Fedoraをメインの開発マシンとして2年使っているが、パッケージの更新速度には満足している。そこで気づいたのが、Fedoraの公式リポジトリにはUSBGuardというツールが最初から用意されているということだ。これを使えば、どのUSBデバイスをシステムで使用可能にするかを細かく制御できる。多くの人が存在すら知らないまま見過ごしているセキュリティ層だ。
USBGuardとは何か、どのように動作するか
USBGuardはカーネル層で動作するセキュリティデーモンで、USBのenumeration(システムが新しいデバイスを認識するプロセス)に介入する。カーネルが接続されたすべてのデバイスを自動的に許可する代わりに、USBGuardはデバイスをポリシールールと照合する——ファイアウォールと同じ仕組みを、USBに適用したものだ。
主なポリシーの状態は3つある:
- allow — デバイスの通常使用を許可する
- block — デバイスを無効化する。使用不可だがシステムからは見える
- reject — カーネル層で完全に拒否し、ユーザースペースからは存在しない扱いになる
重要なのは、USBGuardはファイル名やウイルスシグネチャでブロックするわけではない点だ。ハードウェアの特性——vendor ID、product ID、シリアル番号、インターフェースクラス——でブロックする。つまり、見た目は普通でもUSBストレージとして挿したのにキーボード(HID)として自己申告するデバイスは、即座にブロックされる。
FedoraにUSBGuardをインストールする
FedoraのデフォルトリポジトリにUSBGuardが含まれているため、コマンド一つでインストールできる:
sudo dnf install usbguard usbguard-tools -y
インストール後、サービスを有効化して起動する:
sudo systemctl enable --now usbguard
サービスの稼働状況を確認する:
sudo systemctl status usbguard
重要な注意事項: ポリシーが何もない状態でUSBGuardを有効にすると、デフォルトの動作はすべてのUSBデバイスをブロックする——現在接続中のキーボードやマウスも例外ではない。SSH接続中やUSBキーボードを使用中の場合は、サービスを有効化する前にポリシーを作成すること。
接続中のデバイスから初期ポリシーを作成する
最も簡単な方法は、USBGuardに現在接続されているすべてのデバイスをスキャンさせ、それらに対するallowルールを自動生成させることだ。サービスを初めて起動する前に次のコマンドを実行する:
sudo usbguard generate-policy > /etc/usbguard/rules.conf
このコマンドは`/sys/bus/usb/devices/`をスキャンし、接続中のすべてのデバイスを認識してポリシーファイルを生成する。内容を確認するには:
cat /etc/usbguard/rules.conf
出力はこのような形になる:
allow id 1d6b:0002 serial "" name "xHCI Host Controller" hash "..." parent-hash "..." with-interface 09:00:00
allow id 046d:c52b serial "" name "USB Receiver" hash "..." parent-hash "..." with-interface { 03:01:01 03:00:00 }
allow id 058f:6387 serial "1234567890" name "Mass Storage" hash "..." parent-hash "..." with-interface 08:06:50
各行が1つのデバイスのルールだ。idはvendor:product ID、with-interfaceはインターフェースの種類を示す(03 = HID/キーボード、08 = mass storage、09 = hub)。
USBデバイスをリアルタイムで管理する
サービスが起動した状態で新しいUSBを挿すと、そのデバイスはデフォルトのポリシーによりブロックされる。ブロックされているデバイスの一覧を表示するには:
sudo usbguard list-devices
出力例:
1: allow id 1d6b:0002 serial "" name "xHCI Host Controller" ...
5: block id 0781:5591 serial "4C5300........" name "SanDisk Ultra" ...
行頭の数字はデバイスIDだ。デバイスを一時的に許可する場合(次回再起動まで):
sudo usbguard allow-device 5
永続的に許可する場合(rules.confに追加):
sudo usbguard allow-device --permanent 5
許可済みのデバイスを再度ブロックする:
sudo usbguard block-device 5
複雑なケース向けにポリシールールを手動で記述する
特定のベンダーのUSBストレージだけを許可するなど、より細かいルールを書きたい場合もある。ルールファイルを開く:
sudo nano /etc/usbguard/rules.conf
例:SanDisk(vendor ID 0781)のUSBストレージのみを許可し、実際に使用しているキーボード以外のキーボード偽装デバイス(with-interface 03:01:01)をすべて拒否する場合:
# 使用中のLogitechキーボードを許可
allow id 046d:c52b name "USB Receiver" with-interface { 03:01:01 03:00:00 }
# SanDiskの任意のproduct IDを許可、mass storageインターフェースのみ
allow id 0781:* with-interface 08:06:50
# 既知のキーボード以外でHIDキーボードを申告するデバイスをすべてreject
reject with-interface 03:01:01
# 残りをすべてblock(rejectにしないことでログが残る)
block
編集後、ポリシーをリロードする:
sudo systemctl reload usbguard
監査ログでUSBイベントを監視する
USBGuardはLinuxの監査サブシステムと統合されており、すべてのUSB接続イベントが記録される:
sudo journalctl -u usbguard -f
完全な監査ログを確認するには:
sudo ausearch -m USER_DEVICE | tail -20
個人的に最も便利だと感じているのがこの機能だ。席を外している間に誰かがUSBを挿した場合、ログにはすぐにvendor ID、product ID、タイムスタンプが記録される。インシデント後の調査がしやすい。
sudoなしで使用できるようIPCパーミッションを設定する
デフォルトではrootだけがusbguard CLIを実行できる。一般ユーザーがデバイスの一覧表示や許可操作をsudoなしで行えるようにするには、IPC ACLファイルを編集する:
sudo nano /etc/usbguard/usbguard-daemon.conf
IPCAllowedUsersの行を見つけ、ユーザー名を追加する:
IPCAllowedUsers=root hieu
グループで指定する場合:
IPCAllowedGroups=wheel
設定を反映させるためにサービスを再起動する:
sudo systemctl restart usbguard
まとめ
USBGuardは、一般的なアンチウイルスが見逃しがちな問題を正確に解決する。悪意のあるハードウェアデバイスはファイルシステムより低いレイヤーで動作するため、シグネチャベースの検出では対処できない。数ステップの設定で明確なUSB制御層を手に入れられる——ホワイトリストに登録されたデバイスだけが動作でき、それ以外はカーネル層でブロックされる。
実際の運用フロー:インストール直後にポリシーを生成し、reject with-interface 03:01:01ルールを追加してキーボード偽装BadUSBをブロックし、監査ログを有効化する。新しいUSBを挿すたびにusbguard allow-device --permanentを一度実行するだけだ。慣れてしまえば手間に感じないし、カフェや共有オフィスで作業するときの安心感は段違いだ。
