USBメモリを社内Linuxサーバーに接続させたくない、でも全ポートを物理的に塞ぐのは現実的ではない――こう悩んでいる情シス担当者は多いはずです。Linuxサーバーや管理端末でも、「USBデバイスの接続を制御する仕組み」がなければ、悪意のあるデバイスや不用意なデータ持ち出しを防ぐことができません。
この記事では、Linuxカーネルレベルでのデバイス認可フレームワーク「USBGuard」について、インストールから実践的なポリシー設定まで現場で使えるレベルで解説します。RHEL系・Ubuntu系どちらの手順も網羅しています。

USBGuardとは?なぜLinuxでUSBデバイス制御が必要か
USBGuardは、Linuxカーネルのデバイス認可フレームワークを活用し、「ルールに合致しないUSBデバイスの接続を自動的にブロック」するセキュリティツールです。RHEL 7以降でサポートされ、現在はUbuntuやDebianのリポジトリにも標準で収録されています。
USBデバイスが攻撃の入り口になるケースは大きく3つあります。
・BadUSB攻撃: USBデバイスのファームウェアを書き換え、正規デバイスを装いながら悪意のあるコマンドをPCに送り込む手法です。外見上は普通のUSBメモリでもキーボードとして振る舞い、自動的にコマンドを実行します
・マルウェア媒介: 感染したUSBメモリを接続することでマルウェアがシステムに侵入します。autorun機能が無効化されているLinuxでも、ファイルを手動で開かせる社会工学的手法が併用されます
・内部不正・データ持ち出し: 退職者や悪意ある内部者がUSBメモリで機密データを持ち出すインサイダー脅威です。物理的なアクセスさえあれば実行可能であるため、ソフトウェア対策との組み合わせが不可欠です
USBGuardを使えば、ポリシーで許可したデバイス(例: 特定ベンダーのキーボードとマウスのみ)以外は接続時点でカーネルレベルでブロックできます。ソフトウェア的なファイルシステム制限ではなく、デバイス認証ベースで遮断するため、マルウェアがroot権限を取得していても容易には迂回できません。
USBGuardのインストールと初期起動
1. パッケージのインストール
RHEL 8/9・AlmaLinux・Rocky Linuxの場合:
# BaseOSリポジトリに含まれているためEPELは不要 sudo dnf install usbguard
Ubuntu 22.04・24.04の場合:
sudo apt update sudo apt install usbguard
2. 現在接続中のデバイスから初期ポリシーを生成する
いきなりUSBGuardを起動すると、接続中のデバイス(キーボード・マウス・内部USBコントローラーを含む)がすべてブロックされ、操作不能になる場合があります。最初に「今接続されているデバイスを許可する」ポリシーを生成してから起動するのが安全な手順です。
# 現在接続中のデバイスから初期ポリシーを生成し、設定ファイルに書き込む sudo usbguard generate-policy | sudo tee /etc/usbguard/rules.conf
生成されるルールは以下のような形式です。
# 例: 生成された rules.conf の一部 allow id 1d6b:0002 name "Linux Foundation 2.0 root hub" with-interface 09:00:00 allow id 1d6b:0003 name "Linux Foundation 3.0 root hub" with-interface 09:00:00 allow id 046d:c52b name "Logitech USB Receiver" with-interface { 03:01:01 03:01:02 03:00:00 } # デフォルト拒否: 上記ルールに一致しないデバイスはすべてブロック block
最後の block が「ルールに一致しないデバイスはすべてブロック」を意味するデフォルト拒否設定です。この行がある限り、許可リストにないデバイスの接続は自動的に弾かれます。
3. サービスの起動と自動起動設定
sudo systemctl enable usbguard sudo systemctl start usbguard # 動作状態を確認する sudo systemctl status usbguard
USBGuardのポリシー設定
1. 接続済みデバイスの確認とアドホック操作
USBGuard起動後、現在の接続デバイスと許可状態を確認します。
# 接続中のすべてのUSBデバイスを一覧表示 sudo usbguard list-devices # 出力例: # 1: allow id 1d6b:0002 serial "" name "Linux Foundation 2.0 root hub" ... # 5: block id 0951:1666 serial "" name "DataTraveler 3.0" ...
ブロックされたデバイス(block 表示)には番号が振られています。一時的に許可したい場合は以下を使います。
# ID 5 のデバイスを一時的に許可する(デバイス再挿入で元に戻る) sudo usbguard allow-device 5 # ポリシーに恒久追加して許可する(rules.conf に書き込まれる) sudo usbguard allow-device -p 5
2. インターフェースクラスによるデバイス種別制御
USBデバイスには機能を示す「インターフェースクラス」が定義されています。これを使えば「HIDデバイス(キーボード・マウス)は許可するが、ストレージデバイスは全拒否」という細粒度制御が可能です。
| インターフェースクラス | デバイス種別 | 推奨設定 |
|---|---|---|
| 09:00:00 | USB Hub | 許可(内部コントローラー用) |
| 03:01:01 | キーボード(HID) | 許可(製品IDで絞る) |
| 03:01:02 | マウス(HID) | 許可(製品IDで絞る) |
| 08:06:50 | USBメモリ・外付けHDD | 原則ブロック |
| 0e:02:00 | Webカメラ(映像ストリーミング) | 要件に応じて制御 |
| e0:01:01 | Bluetoothアダプタ | 要件に応じて制御 |
ストレージデバイス(Bulk-Only Transport)をすべて拒否するルールを rules.conf に追加する例です。
# rules.conf の末尾の block より前に追加する # reject は block よりも強い拒否(接続要求をカーネルへ上げず即時切断する) reject with-interface 08:06:50
3. デバイスハッシュによる厳密な許可リスト
特定の個体だけを物理的に識別して許可したい場合は、generate-policy が出力するハッシュ値(hash フィールド)を使います。ハッシュはデバイスのファームウェア情報を元に算出されるため、同じベンダーIDでも別の個体は通過できません。
# 許可したいUSBメモリを挿した状態でポリシー候補を確認する sudo usbguard generate-policy # 出力されたルールのうち、対象デバイスの行をコピーして rules.conf に追記する # 例: # allow id 0951:1666 hash "cgO/JSBHEhRAG2kIH..." name "DataTraveler 3.0" with-interface 08:06:50
このようにhash値を含めることで、「USB-IDが同じでも別の個体はブロック」という厳密な制御が実現できます。
中小企業でも今日からできること
「Linuxサーバーに触れるのはエンジニアだけ」という環境でも、USBGuardの導入はリスク管理の観点から有効です。情シス担当者が最低限押さえておくべき3つのステップを紹介します。
・ステップ1 ─ 優先サーバーへの即時導入: インターネット公開サーバーや認証サーバー(LDAP・RADIUSと連携しているLinux機など)にUSBGuardを導入し、管理者が許可したデバイス以外はブロックする設定を整備します。Ansibleのplaybookにrules.conf管理を組み込めば、複数台への展開も簡単です
・ステップ2 ─ ポリシーの文書化と定期棚卸し: 「どのデバイスをなぜ許可しているか」をスプレッドシートや構成管理ツールで記録します。半年ごとにrules.confと実際の使用デバイスを照合し、不要な許可ルールを削ぎ落とす習慣をつけましょう
・ステップ3 ─ ログ監視との連携: USBGuardのイベントはsyslogに記録されます。rsyslogによる中央ログ転送と組み合わせれば、異常なデバイス接続試行のアラートも設定できます
Windows端末側のUSBデバイス管理については、姉妹記事「中小企業のUSBデバイス管理と情報持ち出し対策」もあわせてご覧ください。Linux・Windowsの両面から対策することで、より確実なUSBセキュリティ体制を築けます。
Linuxの権限管理やファイルシステム保護の基礎については、姉妹サイトLinuxMaster.JPでも詳しく解説しています。
よくある誤解と注意点
【注意1】USBGuardはBadUSBを「完全には」防げない
USBGuardはベンダーID・プロダクトID・ハッシュ値でデバイスを識別します。しかし、BadUSB攻撃の中には正規デバイスと同一のIDを持つよう作られたものも存在します。hash値による識別で精度は上がりますが、高度に偽装されたBadUSBに対しては限界があります。物理的な入退室管理(外部者の持ち込みを防ぐ)との組み合わせを前提にしてください。
【注意2】デスクトップ環境(GUI)との相性
GNOMEなどのデスクトップ環境を使っているLinuxマシンに導入する場合、USB経由のワイヤレスレシーバー(キーボードとマウスの一体型)が意図せずブロックされることがあります。generate-policyで初期ポリシーを作ってから起動する手順を必ず守り、起動後も usbguard list-devices で状態を確認してください。
【注意3】rules.confの権限管理
rules.conf は root 所有で権限 0600 に設定しておくことを推奨します。一般ユーザーがルールを書き換えられると、制御の意味がなくなります。
# rules.conf の権限を確認・修正する ls -la /etc/usbguard/rules.conf sudo chmod 0600 /etc/usbguard/rules.conf sudo chown root:root /etc/usbguard/rules.conf

本記事のまとめ
| 対策 | 効果 | 難易度 |
|---|---|---|
| USBGuard のインストールと初期ポリシー生成 | 未登録デバイスの接続を自動ブロック | 低(30分程度) |
| インターフェースクラスによる種別制御 | USBストレージを一括拒否しキーボード等は許可 | 中 |
| ハッシュ値による厳密な許可リスト | 登録済みの個体のみ接続可能 | 中 |
| rsyslogとの連携・中央ログ転送 | 不審な接続試行を可視化・アラート | 中 |
| rules.conf の権限を 0600 に設定 | ルールの無断改ざんを防止 | 低(即実行可) |
USBGuardはLinuxカーネルに組み込まれた堅牢な仕組みを活用するため、運用コストが低く、サーバー環境への導入に適しています。「USB接続は現場に任せている」という状況を脱するための第一歩として、まず管理対象のLinuxサーバーへの導入から始めてみてください。また、auditdと組み合わせた侵入後のログ追跡も整備することで、USBを起点とした攻撃チェーン全体への対応力が高まります。
PR
Linuxサーバーの権限管理からSSH強化・ログ監視・ファイアウォール設定まで、現場で即使える設定手順を体系的に解説した一冊。USBGuardなど個別の対策を有機的に組み合わせる際の全体像を把握するのに最適です。
