web-dev-qa-db-ja.com

1つのベンダーとモデルのUSBドライブのみを許可し、他は許可しないudevルール

そのため、Linuxラップトップで特定のUSBドライブ(Kingston DataTraveler 2.0)のみを接続できるように、Linuxラップトップで安全なストレージをセットアップする環境をセットアップするために取り組んでいます。ベンダー:モデルコードは次のとおりです(lsusbから):Bus 003 Device 003: ID 0951:1665 Kingston Technology

私はこれらのルールを機能させようとしましたが、12.04環境ではルールが機能しません。 (注:#の先頭に行を追加してコメントを作成しましたが、udevファイルにはありません):

# If a device is NOT a Kingston drive, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device"

# If a device is a Kingston drive, but is NOT the model we have, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device"

# If a device is a Kingston drive and is the model we have, then run a script
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh"

私が抱えている問題は、これらのルールのどれも機能していないことであり、これがこれに対する正しいアプローチであるかどうかはわかりません。

考え?

5
Thomas Ward

非効果的なignore_deviceに関する同じ問題の前に直面しました。なぜ他のソリューションを採用するのか、私には理解できませんでした。

  • さて、ignore_deviceはudevリリース148で削除されました。 リリースノート または changelog を参照してください

    気づいたなら、それの使用を示唆するすべてのトピックは古いです(〜2009)。

  • 簡単な代替手段は、ENV{UDISKS_PRESENTATION_HIDE}="1"(Ubuntu 12.04)を使用することです。 udisks2を含むリリース(> = 12.10)では、ENV{UDISKS_IGNORE}="1"を使用します。

    リファレンス:Archlinux Wiki:Udisks

他のソリューションはSYSFSを使用しています。 device/authorized(solsTiCeに記載)、device/remove、またはdriver/unbindのいずれか。 を参照してください選択したUSBポートで大容量記憶装置のみを使用する-方法は?

1つのブランド/モデルのみを除くすべてのストレージを拒否する方法には困難が伴います。そのため、ルールの一致条件は、1つ以上のデバイスノード(子デバイスまたは親デバイスなし)をフィルタリングする必要があります。だからKERNELS=="[1-9]*-[0-9]*"を追加しました

KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", ENV{UDISKS_PRESENTATION_HIDE}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", ENV{UDISKS_PRESENTATION_HIDE}="1"

さて、UDisksは取り付けフックのみを隠します。これらは、SYSFSドライバーのバインド解除を使用する方が適切な場合があります。

KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="125f", ENV{IF_STORAGE_REMOVE_ME}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="125f", ATTRS{idProduct}!="c96a", ENV{IF_STORAGE_REMOVE_ME}="1"
ENV{IF_STORAGE_REMOVE_ME}=="1", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"

参照:少数の親デバイス属性を持つudevルール

7
user.dz

注:Sneetsherの回答によって廃止されました。この答えは、レガシーの理由でここに残されています。

だから、私はこれを解決しました、そしてそれはやるべき痛みでした。

ルールの制限を再検討し、機能を変更しました。どうやら、12.04はignore_deviceオプションを尊重しません。そこで、アンマウントスクリプトを即興で作成しました。これらのシステムには機能するUSB​​ポートが1つしかないため、次のようになりますが、他の問題が発生する可能性があります。

/etc/udev/rules.d/100-restrict-usb-devices.rules

# If a device is NOT a Kingston drive, ignore it.
ACTION=="add", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"

# If a device is a Kingston drive, but is NOT the model we have, ignore it.
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"

# If a device is a Kingston drive and is the model we have, then run a script
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh", RUN+="/usr/bin/logger AuthorizedUSBConnected"

/lib/udev/unmount.sh-現在存在するデバイスを最初にチェックし、次に他のすべてのドライブデバイスをチェックし、スクリプトが実行される場合にのみアンマウントするスクリプト。すべてのデバイスはsdbsdcなどになるため、すべてのデバイスを機能させる方法があります。


ストーリーの教訓:12.04では、システムはignore_deviceオプションを無視します。すべてのスクリプトを作成する必要があります。 :/

2
Thomas Ward