選択した USB ポートでのみ大容量ストレージ デバイスを使用する方法

選択した USB ポートでのみ大容量ストレージ デバイスを使用する方法

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

再プログラムされたUSBファームウェアによる脅威近い将来、状況は悪化する一方です。私は、次のような使用例で、この問題を軽減しようとしています。私は、内部接続された USB 周辺機器 (ネットワーク カード、特殊な周辺機器、キーボード) と、ファイル転送にのみ使用するパブリック USB ポートを 1 つ備えたコンピューターを持っています。そのため、他の USB モジュールをすべてブラックリストに登録することはできませんが、その特定のポートを「サニタイズ」して、別の種類のデバイスを接続しても何も起こらないようにしたいと考えています。

ケースは物理的にロックされており、外部からアクセスできるのはこの特定の USB ポートのみであるため、ケースをいじったりキーボード ケーブルに継ぎ足したりすることは、物理的なセキュリティ レスポンスを引き起こすほど疑わしい行為であるはずです。さらに、ほとんどのユーザーが積極的に悪意を持っているとは思いませんが、再フラッシュされた USB ドライブを知らないうちに持ち込む人の数は増えると思います (昔のフロッピー ブート セクターの感染のときのように)。セキュリティに関しては、ユーザーが悪意を持って「武器化された」USB ディスクを持ち込むか、単に「感染」していることを知らないかは、あまり問題ではありません。

完全なセキュリティは実現不可能であり、ユーザーがシステムと対話できるようにするのはどれでもこの方法は危険ですが、残念ながら、セキュリティと使いやすさのバランスを取る必要があります。つまり、コンピュータはクライアントが使用できる必要があります。また、私はこれで、標的を定めた断固とした攻撃者から身を守ろうとしているわけではありません。むしろ、システムを簡単に攻撃できないようにするための緩和技術の 1 つとしてこれを使用しています。

答え1

私の環境では、2 つのフラッシュ キーと Android フォンをストレージとして使用し、USB ネットワーク アダプターと Web カメラを他のタイプとして使用した Ubuntu 14.04 で動作するようです。(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'"
    

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

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

    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
    

参考文献:

関連情報