udev を使用した USB フラッシュのホワイト リスト

udev を使用した USB フラッシュのホワイト リスト

USB フラッシュ ドライブの「ホワイト リスト」のようなものを作成したいと考えています。つまり、「許可されていないものはすべて拒否する」ということです。

udevルールを使うべきだということは分かっています:

  1. /etc/udev/rules.d/すべてのUSBフラッシュドライブを拒否するルールを追加する
  2. 必要なものを許可するには、より高い番号の別のルールを追加します

USB フラッシュ ドライブのみを扱いたいです。ルールは USB ドライブのあらゆる情報に基づいて設定できます。つまり、ベンダー ID、シリアル番号などです。つまり、このケースでは何も希望はありません。何か解決策はありますか。

しかし、ルール ファイルに何を記述すればよいかわかりません。例を挙げていただけますか?

UPD。次の内容のファイルを作成します。

deck@crunch /etc/udev/rules.d $ cat 90-deny-usbflash.rules 
BUS=="usb", OPTIONS+="ignore_device"

このフォルダーは によって監視されているのでudevinotify変更はすぐに有効になるはずです。しかし、変更は適用されませんでした。

答え1

すべてのドライブを自動マウントする他のソフトウェアがインストールされているかどうかは述べていません。以下の私の解決策では、インストールされていないことを前提としています。インストールされている場合は、問題が異なります。アンインストールまたは制御する方法を提案できるように、それが何であるかを指定する必要があります。

許可されたドライブのみをマウントする udev ルールの例を次に示します (テストは行われていませんが、私が使用している同様のルールに基づいています)。

#-- Skip if not an appropriate "sd" device
KERNEL!="sd[b-z]*", GOTO="99_exit"
SUBSYSTEM!="block", GOTO="99_exit"

#-- Handle 'remove' and 'change' events
SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/usr/bin/pumount /dev/%k", GOTO="99_exit"
ACTION=="remove|change", GOTO="99_exit"

#-- Create useful environment variables
SUBSYSTEMS=="usb", ENV{ID_SERIAL}!="?*", IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_FS_LABEL}!="?*", IMPORT{program}="/sbin/blkid -o udev -p %N"

#-- Skip if this is not a filesystem (e.g. if this is the whole drive, not a formatted partition)
ENV{ID_FS_USAGE}!="filesystem", GOTO="99_exit"

#-- Mount only allowed drives:
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="something_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/some_name"
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="other_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/other_name"

#-- Exit
LABEL="99_exit"

使用するマウントコマンドは、もちろん好み次第です。私が示したものは、単なる例です。

更新: コメントから、自動マウントを行う何かがインストールされていることがわかります。私のシステム (Debian Wheezy) では、インストールされていません。提案された grep を試したところ、異なる結果が得られました。 で/lib/udev/rules.d/80-udisks.rules、次のコード セクションを見つけました。

# Mark devices that shouldn't be automounted / autoassembled etc.
#
# Deny all, then punch holes for what looks like physical drives
# (TODO: this heuristic might need some work)
#

ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{DISKS_PRESENTATION_NOPOLICY}="0"

これは、もし自動マウント ソフトウェアがインストールされていましたが、これは UDISKS_PRESENTATION_NOPOLICY 環境変数によって制御できます。ディストリビューションを指定していませんが、明らかに異なっています。

答え2

試してみるといいUSBガードこれは、UDevとLinuxカーネルUSB認証フレームワークの上にUSBデバイスのブラックリスト/ホワイトリストを実装します。すでに提案されているように、UDevを使用して同じことを実現できますが、USBGuardはそのジョブ専用のツールであり、ルール言語および(オプションの)GUI アプレット。

USB フラッシュ ディスクには通常シリアル番号があるため、usbguard では VID:PID とシリアル番号を使用したホワイトリストは次のようになります。

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

これにより、マスストレージ インターフェイス、VID:PID または 1234:5678、および iSerial 値が "123456" または "abcdef" のみの 2 つの USB デバイスを接続 (承認) できるようになります。その他はすべてブロックされます。

免責事項: 私はそのプロジェクトの作者です。

関連情報