選択したUSBポートでのみ大容量記憶装置を使用します-方法は?


14

特定のUSBポートで、USB大容量ストレージ機能のみを受け入れ、それ以外は受け入れません。HIDデバイス、Bluetoothアダプター、RS232コンバーター、何もありません。たとえばudevを使用してこれを行う方法はありますか?特定のデバイスまたは特定のポートのドライバーを含めるためのカスタムudevルールを作成できることは知っていますが、他のすべてのドライバーを何らかの方法で除外できますか?1つのクラスのデバイス、つまりUSB大容量ストレージのみを許可しようとしています。このクラスには無数の異なるデバイスモデルがあり、どのポートに接続するのかわかりません(クライアントが自分で持ってくるので、これに影響を与える方法はありません)。

再プログラムされたUSBファームウェアからの脅威は、予見可能な将来にのみ悪化するでしょう。私はこのユースケースのためにそれらを軽減しようとしています:内部的に接続されたUSB周辺機器(ネットワークカード、専用周辺機器、キーボード)と1つの公共向けUSBポートを備えたコンピューターがあり、ファイル転送にのみ使用されることになっています。したがって、他のUSBモジュールをすべてブラックリストに登録することはできません。しかし、その特定のポートを「サニタイズ」したいので、異なるデバイスタイプを接続しても何も起こりません。

ケースは物理的にロックされているため、この1つの特定のUSBポートのみが外部からアクセスでき、ケースに干渉したり、キーボードケーブルに接続したりすると、物理的なセキュリティ応答がトリガーされます。さらに、ほとんどのユーザーが積極的に悪意があるとは思わないが、再フラッシュされたUSBドライブの無意識のキャリアの数が増えると予想される(以前のフロッピーブートセクタ感染のように)。セキュリティに関しては、ユーザーが「武器化された」USBディスクを悪意を持って持ち込むか、それが「感染」したことを知らないかは問題ではありません。

ここでは完璧なセキュリティを実現することは不可能であり、ユーザーがシステムと何らかの方法でやり取りできるようにすることはリスクが高いことを承知しています。また、私はこれでターゲットを絞った攻撃者に対して防御しようとはしていません。むしろ、私はこれを緩和技術の1つとして使用しているため、システムはハングアップしません。


2
あの 私は何かを学んでいるので、これが役立つかどうかはわかりませんが、これが関連するかどうかを確認してください: " linux-usb.org/FAQ.html " 「質問、そして行があります」すべてのSCSIデバイスに対してこれを行いたくない場合、カーネルに特定のデバイスをスキャンするように指示できます; echo> / proc / scsi / scsi "scsi add-single-device 0 0 0 1" "
Sergiy Kolodyazhnyy

1
特定のポートのみをUSB大容量ストレージにロックしたいですか?
カズウルフ14

3
「物理的なアクセスにより、セキュリティのための戦いは失われます。」〜これまでのすべてのSecurity.SEユーザー。
カズウルフ14

1
@Piskvor確信はありませんが、security.stackexchange.comまたは他のより高度な/専門家向けのサイトのいずれかで答えを見つけることができるかもしれません。
ブライアンZ 14年

2
irongeek.com/…、特に3.2 UDEVを使用してLinuxをロックダウンするセクションが役立ちます。
ALCI

回答:


16

Ubuntu 14.04では、2つのフラッシュキーとAndroidフォンをストレージとして使用し、USBネットワークアダプターとWebカメラを他のタイプとして使用しているようです。(USBハブの配置をテストできませんでした)

  1. USBポート(接続されたデバイスの親デバイス)を確認します

    $ udevadm info --name=/dev/sdc --attribute-walk
    
      looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0':
        KERNELS=="2-1.2:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="usb-storage"
        ATTRS{bInterfaceClass}=="08"
        ATTRS{bInterfaceSubClass}=="06"
        ATTRS{bInterfaceProtocol}=="50"
        ATTRS{bNumEndpoints}=="02"
        ATTRS{supports_autosuspend}=="1"
        ATTRS{bAlternateSetting}==" 0"
        ATTRS{bInterfaceNumber}=="00"
    
  2. usb-storageドライバーなしでusbポートのカーネル名に一致するudevルールを作成します

    /etc/udev/rules.d/90-remove-non-storage.rules

    第1インターフェースとしてストレージを持つデバイスを許可します(複合デバイスは許可されます)

    KERNELS=="2-1.2:1.0", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    非ストレージインターフェイスを持つデバイスをブロックする (複合デバイスは拒否されます)

    実際、電話は/dev/ttyACM0KERNELS == "2-1.2:1.1" としてモデムとしてマウントされます。これにより、電話(複合デバイス)を単純なストレージデバイスのみにマウントすることはできません。

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    ストレージではないインターフェースのみをブロックする (ストレージとしてのみ許可される複合デバイス)

    許可されていないインターフェイスのみを無効にする方法について調べた後。ドライバーのバインド解除は機能しているようです。私の電話はストレージとしてのみ使用でき、作成されません/dev/ttyACM0

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. udevルールをリロードする

    udevadm control --reload-rules
    

参照:


...それに私を打つ
カズウォルフ

@Whaaaaaat、うんauthorizedも動作しますが、removeユーザーがとにかくそれを抜くつもりなので、きれいな方法です。マウントされていないドライブをチェックしましたが、それらはまだusb-storage親ノードのドライバーとして持っています。私は同意します、usb-storage使われないかもしれないいくつかのケースがあります。ところで、:)あまりにも多くのコメントを消費します(2分、1分)、最初のコメントを編集できます(5分未満)
user.dz 14年

@Whaaaaaat:これをテストしていたとき、ブロックデバイスが作成される直前にusbストレージドライバーが読み込まれました。それらをマウントする必要はありませんでした。
Piskvorは、14

@Piskvorこれはあなたの質問に答えましたか?その場合、これを正解としてマークし、賞金を授与する必要があります。
ジョンスコット14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.