web-dev-qa-db-ja.com

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

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

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

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

ここでは完璧なセキュリティは実行不可能であり、ユーザーがanyの方法でシステムと対話できるようにすることは危険であることに気づいています-しかし、残念ながら、セキュリティのバランスを取る必要があります使いやすさに対して:コンピューターはクライアントが使用できる必要があります。また、私はこれでターゲットを絞った攻撃者に対して防御しようとはしていません。むしろ、私はこれを緩和技術の1つとして使用しているため、システムはハングアップしません。

14
Piskvor

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

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

    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/ttyACM0にKERNELS == "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
    

参照:

16
user.dz