Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.12. USBGuardの使用

USBGuard ソフトウェアフレームワークは、デバイス属性に基づく基本的なホワイトリスト機能およびブラックリスト機能を実装することにより、侵入型 USB デバイスに対するシステム保護を提供します。ユーザー定義のポリシーを適用するために、USBGuard は Linux カーネルの USB デバイス認証機能を使用します。USBGuard フレームワークは、以下のコンポーネントを提供します。
  • 動的対話とポリシー施行のためのプロセス間通信 (IPC) インターフェイスを持つデーモンコンポーネント。
  • 実行中の USBGuard インスタンスと対話するコマンドラインインターフェイス。
  • USB デバイス認証ポリシーを記述するルール言語
  • 共有ライブラリーに実装されているデーモンコンポーネントと対話する C++ API

4.12.1. USBGuardのインストール

usbguard パッケージをインストールするには、root で以下のコマンドを入力します。
~]# yum install usbguard
初期ルールセットを作成するには、root で以下のコマンドを入力します。
~]# usbguard generate-policy > /etc/usbguard/rules.conf
注記
USBGuard ルールセットをカスタマイズするには、/etc/usbguard/rules.conf ファイルを編集します。詳細は、usbguard-rules.conf (5) の man ページを参照してください。使用例は 「ルール言語を使って独自のポリシーを作成する」 を参照してください。
USBGuard デーモンを起動するには、root で以下のコマンドを入力します。
~]# systemctl start usbguard.service
~]# systemctl status usbguard
● usbguard.service - USBGuard daemon
   Loaded: loaded (/usr/lib/systemd/system/usbguard.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-06-06 13:29:31 CEST; 9s ago
     Docs: man:usbguard-daemon(8)
 Main PID: 4984 (usbguard-daemon)
   CGroup: /system.slice/usbguard.service
           └─4984 /usr/sbin/usbguard-daemon -k -c /etc/usbguard/usbguard-daem...
システムの起動時に USBGuard が自動的に開始するようにするには、root で以下のコマンドを使用します。
~]# systemctl enable usbguard.service
Created symlink from /etc/systemd/system/basic.target.wants/usbguard.service to /usr/lib/systemd/system/usbguard.service.
USBGuard が認識するすべての USB デバイスを一覧表示するには、root で次のコマンドを実行します。
~]# usbguard list-devices
1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00
...
6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
デバイスがシステムと対話することを許可するには、allow-device オプションを使用します。
~]# usbguard allow-device 6
デバイスの認証を解除してシステムから削除するには、reject-device オプションを使用します。デバイスの認証を解除するには、block-device オプションを指定して usbguard コマンドを使用します。
~]# usbguard block-device 6
USBGuard では、block および reject は以下の意味で使用されます。
  • block - 今は、このデバイスとはやりとりしない
  • reject - このデバイスは存在しないものとして無視する
usbguard コマンドのすべてのオプションを表示するには、--help ディレクティブを指定して入力します。
~]$ usbguard --help

4.12.2. ホワイトリストおよびブラックリストの作成

usbguard-daemon.conf ファイルは、コマンドラインオプションを解析した後に usbguard デーモンによって読み込まれ、デーモンのランタイムパラメーターを設定するために使用されます。デフォルトの設定ファイル(/etc/usbguard/usbguard-daemon.conf)をオーバーライドするには、-c コマンドラインオプションを使用します。詳細は、usbguard-daemon (8)の man ページを参照してください。
ホワイトリストまたはブラックリストを作成するには、usbguard-daemon.conf ファイルを編集し、以下のオプションを使用します。

USBGuard 設定ファイル

RuleFile=<path>
usbguard デーモンは、このファイルを使用して、そこからポリシールールセットを読み込み、IPC インターフェイスを介して受信した新しいルールを書き込みます。
IPCAllowedUsers=<username> [<username> ...]
デーモンが IPC 接続を受け入れるユーザー名のスペース区切りのリスト。
IPCAllowedGroups=<groupname> [<groupname> ...]
デーモンが IPC 接続を受け入れるグループ名のスペース区切りのリスト。
IPCAccessControlFiles=<path>
IPC アクセス制御ファイルを保持するディレクトリーへのパス。
ImplicitPolicyTarget=<target>
ポリシーのどのルールにも一致しないデバイスを処理する方法。許容される値は allow、block、および reject です。
PresentDevicePolicy=<policy>
デーモンの起動時にすでに接続されているデバイスを処理する方法:
  • allow - 存在するデバイスをすべて認証する
  • block - 存在するデバイスの認証をすべて解除する
  • reject - 存在するデバイスをすべて削除する
  • keep - 内部ステータスの同期してそのままにする
  • apply-policy - 存在するすべてのデバイスに対してルールセットを評価する
PresentControllerPolicy=<policy>
デーモンの起動時にすでに接続されている USB コントローラーを処理する方法:
  • allow - 存在するデバイスをすべて認証する
  • block - 存在するデバイスの認証をすべて解除する
  • reject - 存在するデバイスをすべて削除する
  • keep - 内部ステータスの同期してそのままにする
  • apply-policy - 存在するすべてのデバイスに対してルールセットを評価する

例4.5 USBGuard 設定

以下の設定ファイルは、usbguard デーモンが /etc/usbguard/rules.conf ファイルからルールをロードするように順序付け、usbguard グループのユーザーのみが IPC インターフェイスを使用できるようにします。
RuleFile=/etc/usbguard/rules.conf
IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/
IPC アクセス制御リスト(ACL)を指定するには、usbguard add-user または usbguard remove-user コマンドを使用します。詳細は usbguard (1) を参照してください。この例では、usbguard グループのユーザーが USB デバイス承認状態の変更、USB デバイスの一覧表示、例外イベントのリッスン、USB 認証ポリシーの一覧表示を許可するには、root で次のコマンドを実行します。
~]# usbguard add-user -g usbguard --devices=modify,list,listen --policy=list --exceptions=listen
重要
デーモンは、USBGuard パブリック IPC インターフェイスを提供します。Red Hat Enterprise Linux では、このインターフェイスへのアクセスはデフォルトで root ユーザーのみに制限されます。IPC インターフェイスへのアクセスを制限するには、IPCAccessControlFiles オプション (推奨)、IPCAllowedUsers オプション、および IPCAllowedGroups オプションを設定することを検討してください。ACL を未設定のままにしないでください。設定しないと、すべてのローカルユーザーに IPC インターフェイスが公開され、USB デバイスの認証状態を操作して USBGuard ポリシーを変更できるようになります。
詳細は、usbguard-daemon.conf (5) man ページの IPC Access Control セクションを参照してください。

4.12.3. ルール言語を使って独自のポリシーを作成する

usbguard デーモンは、一連のルールで定義されたポリシーに基づいて USB デバイスを承認するかどうかを決定します。USB デバイスがシステムに挿入されると、デーモンは既存のルールを順次スキャンし、一致するルールが見つかると、ルールのターゲットに基づいて、デバイスを承認 (許可)、非承認 (ブロック)、または削除 (拒否) します。一致するルールが見つからない場合、決定は暗黙のデフォルトターゲットに基づいて行われます。この暗黙のデフォルトとは、ユーザーが決定を下すまでデバイスをブロックすることです。
ルール言語の文法は以下のようになります。
rule ::= target device_id device_attributes conditions.

target ::= "allow" | "block" | "reject".

device_id ::= "*:*" | vendor_id ":*" | vendor_id ":" product_id.

device_attributes ::= device_attributes | attribute.
device_attributes ::= .

conditions ::= conditions | condition.
conditions ::= .
ターゲット、デバイス仕様、デバイス属性などのルール言語の詳細は、usbguard-rules.conf (5) の man ページを参照してください。

例4.6 USBguard のサンプルポリシー

USB 大容量ストレージデバイスを許可し、それ以外をすべてブロックする
このポリシーは、単なる大容量ストレージデバイスではないあらゆるデバイスをブロックします。USB フラッシュディスクにキーボードインターフェイスが隠されているデバイスはブロックされます。大容量ストレージインターフェイスが 1 つあるデバイスのみが、オペレーティングシステムと対話することを許可されます。ポリシーは、以下のような 1 つのルールで設定されます。
allow with-interface equals { 08:*:* }
ブロックルールがないため、ブロックは暗黙のうちに行われます。USBGuard イベントをリッスンするデスクトップアプレットは、デバイスに対して暗黙的なターゲットが選択されているかどうかをユーザーに尋ねることができるため、暗黙的なブロックはデスクトップユーザーにとって便利です。
特定の Yubikey デバイスを特定のポート経由で接続できるようにする
そのポートの他のすべてを拒否します。
allow 1050:0011 name "Yubico Yubikey II" serial "0001234567" via-port "1-2" hash "044b5e168d40ee0245478416caf3d998"
reject via-port "1-2"
インターフェイスの組み合わせに不審な点があるデバイスは排除する
キーボードやネットワークインターフェイスを実装した USB フラッシュディスクは非常に疑わしいものです。次の一連のルールは、USB フラッシュディスクを許可し、追加の疑わしいインターフェイスを備えたデバイスを明示的に拒否するポリシーを形成します。
allow with-interface equals { 08:*:* }
reject with-interface all-of { 08:*:* 03:00:* }
reject with-interface all-of { 08:*:* 03:01:* }
reject with-interface all-of { 08:*:* e0:*:* }
reject with-interface all-of { 08:*:* 02:*:* }
注記
ブラックリストは間違ったアプローチであり、あるデバイスだけをブラックリストに入れ、残りを許可するということはしないでください。上記のポリシーは、ブロッキングが暗黙のデフォルトであることを前提としています。"不良" と見なされる一連のデバイスを拒否することは、そのようなデバイスへのシステムの露出を可能な限り制限するための良いアプローチです。
キーボードのみの USB デバイスを許可
以下のルールは、キーボードインターフェイスを持つ USB 機器がすでに許可されていない場合にのみ、キーボードのみの USB 機器を許可するものです。
allow with-interface one-of { 03:00:01 03:01:01 } if !allowed-matches(with-interface one-of { 03:00:01 03:01:01 })
usbguard generate-policy コマンドを使用して最初のポリシーを生成したら、/etc/usbguard/rules.conf を編集して USBGuard ポリシールールをカスタマイズします。
~]$ usbguard generate-policy > rules.conf
~]$ vim rules.conf
更新されたポリシーをインストールし、変更を有効にするには、次のコマンドを使用します。
~]# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf

4.12.4. 関連情報

USBGuard の詳細は、以下のドキュメントを参照してください。
  • usbguard (1) の man ページ
  • usbguard-rules.conf(5) man page
  • usbguard-daemon(8) man page
  • usbguard-daemon.conf(5) man page