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 (inter-process communication) インターフェースを使用したデーモンコンポーネント
  • 実行中の 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 ファイルを変更します。詳細は、man ページの usbguard-rules.conf(5) を参照してください。使用例は 「ルール言語を使用した独自ポリシーの作成」 を参照してください。
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 オプションを使用します。デバイスの認証解除だけを行う場合は、usbguard コマンドに block-device オプションを付けて使用します。
~]# 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 コマンドラインオプションを使用します。詳細は、man ページの usbguard-daemon(8) を参照してください。
ホワイトリストまたはブラックリストを作成するには、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 Access Control List (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 ユーザーにのみ制限されます。IPCAccessControlFiles オプション (推奨)、または IPCAllowedUsers オプションおよび IPCAllowedGroups オプションを設定して IPC インターフェースへのアクセスを制御することを検討してください。ACL は未設定のままにしないでください。未設定のままにすると IPC インターフェースがすべてのローカルユーザーに公開され、USB デバイスの認証状態を操作し、USBGuard ポリシーを修正できるようになります。
詳細は、man ページの usbguard-daemon.conf(5) の IPC アクセス制御セクションを参照してください。

4.12.3. ルール言語を使用した独自ポリシーの作成

usbguard デーモンは、ルールセットが定義するポリシーに基づいて USB デバイスを認証するかどうかを決定します。USB デバイスがシステムに挿入されると、デーモンが既存のルールを順次スキャンし、一致ルールが見つかると、ルールのターゲットに基づいて認証 (allows)、認証解除 (blocks)、または削除 (rejects) します。一致するルールが見つからない場合、決定は暗黙のデフォルトターゲットに基づいています。暗黙のデフォルトは、ユーザーが決定を行うまで、デバイスをブロックします。
ルール言語の文法は以下のようになります。
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 ::= .
ターゲット、デバイス指定、デバイス属性などのルール言語の詳細は、man ページの usbguard-rules.conf(5) を参照してください。

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

Allow USB mass storage devices and block everything else
このポリシーは、大容量のストレージデバイス以外のデバイスをブロックするだけではありません。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 の詳細は、以下のドキュメントを参照してください。
  • man ページの usbguard(1)
  • man ページの usbguard-rules.conf(5)
  • man ページの usbguard-daemon(8)
  • man ページの usbguard-daemon.conf(5)