Utilisez uniquement des périphériques de stockage de masse sur un port USB sélectionné - comment?

14

Sur un port USB donné, je veux seulement accepter les capacités de stockage de masse USB, et rien d'autre. Pas d'appareils HID, pas d'adaptateurs Bluetooth, pas de convertisseurs RS232, rien. Existe-t-il un moyen de le faire, par exemple en utilisant udev? Je sais que je peux écrire une règle udev personnalisée pour inclure un pilote pour un périphérique donné, ou un port donné, mais puis-je en quelque sorte exclure tous les autres pilotes? J'essaie de n'autoriser qu'une seule classe d'appareils, à savoir le stockage de masse USB; il existe une myriade de modèles de périphériques différents dans cette classe, et je ne sais pas lesquels vont se connecter au port (les clients apporteront le leur, il n'y a aucun moyen pour moi d'affecter cela).

Les menaces du micrologiciel USB reprogrammé ne feront qu'empirer dans un avenir prévisible. J'essaie de les atténuer pour ce cas d'utilisation: j'ai un ordinateur avec des périphériques USB connectés en interne (carte réseau, périphériques spécialisés, clavier) et un port USB public, qui est uniquement censé être utilisé pour le transfert de fichiers. Donc, je ne peux pas mettre sur liste noire les autres modules USB; mais je voudrais "désinfecter" ce port particulier, de sorte que le branchement dans un type d'appareil différent ne fasse rien.

Le boîtier est physiquement verrouillé, de sorte que seul ce port USB spécifique est accessible de l'extérieur, et l'ingérence avec le boîtier ou l'épissure dans le câble du clavier doit être suffisamment suspecte pour déclencher une réponse de sécurité physique; de plus, je ne m'attends pas à ce que la plupart des utilisateurs soient activement malveillants, mais je m'attends à ce que le nombre de transporteurs involontaires de clés USB re-flashées augmente (comme c'était le cas avec les infections du secteur de démarrage de disquette d'autrefois). En ce qui concerne la sécurité, peu importe que l'utilisateur apporte le disque USB "armé" avec une intention malveillante, ou qu'il ne sache tout simplement pas qu'il est "infecté".

Je suis conscient qu'une sécurité parfaite est irréalisable ici, et permettre à l'utilisateur d'interagir avec le système de quelque manière que ce soit est risqué - mais hélas, je dois équilibrer la sécurité et la convivialité: l'ordinateur doit être utilisable par le client. De plus, je n'essaie pas de me défendre contre un attaquant ciblé et déterminé avec cela; je l'utilise plutôt comme l'une des techniques d'atténuation, afin que le système ne soit pas un fruit à faible pendaison.

Piskvor a quitté le bâtiment
la source
2
Hum. J'apprends juste des trucs, donc je ne sais pas si cela peut aider, mais voyez si cela est pertinent: " linux-usb.org/FAQ.html " Spécifiquement, faites défiler jusqu'à "Pourquoi je ne vois qu'un seul appareil de mon périphérique de stockage polyvalent "question, et il y a une ligne" Si vous ne voulez pas faire cela pour tous les périphériques SCSI, vous pouvez dire au noyau de rechercher un périphérique spécifique en utilisant; echo> / proc / scsi / scsi "scsi add-single-device 0 0 0 1 ""
Sergiy Kolodyazhnyy
1
Vous souhaitez uniquement qu'un port spécifique soit verrouillé sur le stockage de masse USB?
Kaz Wolfe
3
"Avec un accès physique, la bataille pour la sécurité est perdue." ~ Chaque utilisateur Security.SE jamais.
Kaz Wolfe
1
@Piskvor Je ne suis pas sûr, mais vous aurez peut-être plus de chance de trouver une réponse sur security.stackexchange.com ou sur l'un des autres sites plus avancés / professionnels.
Brian Z
2
Peut-être que cela peut aider: irongeek.com/… , en particulier la section 3.2 Verrouillage de Linux en utilisant UDEV.
alci

Réponses:

16

Cela semble fonctionner pour moi dans Ubuntu 14.04 avec 2 touches flash et un téléphone Android comme stockage et un adaptateur réseau USB et une webcam comme un autre type. (Je n'ai pas pu tester le placement d'un hub USB)

  1. Vérifiez le port USB (qui est un périphérique parent pour le périphérique branché)

    $ 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. Créer une règle udev, correspondant au nom du noyau du port usb sans usb-storagepilote

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

    Autoriser tout appareil disposant d'un stockage comme première interface (appareils composites autorisés)

    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'"
    

    Bloquer tout appareil qui n'a pas d'interface de stockage (appareils composites refusés)

    En fait, le téléphone est monté comme modem sur /dev/ttyACM0KERNELS == "2-1.2: 1.1". Cela ne permettra pas aux téléphones (périphériques composites) d'être montés, seuls les périphériques de stockage simples le seront.

    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'"
    

    Bloquer uniquement les interfaces qui ne sont pas de stockage (les périphériques composites sont autorisés comme stockage uniquement)

    Après quelques recherches sur un moyen de désactiver uniquement les interfaces non autorisées. La dissociation du pilote semble fonctionner. Mon téléphone ne peut être utilisé que comme stockage, il ne crée pas /dev/ttyACM0.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. Recharger les règles udev

    udevadm control --reload-rules
    

Les références:

user.dz
la source
Battez-moi ...
Kaz Wolfe
@Whaaaaaat, yep authorizedfonctionne aussi, mais removec'est un moyen plus propre car l'utilisateur va le débrancher de toute façon. J'ai vérifié les disques non montés, ils ont toujours usb-storagecomme pilote pour un nœud parent. Je suis d'accord, il y a des cas où usb-storageils ne peuvent pas être utilisés. BTW, :) u consommez trop de commentaires (2min, 1min), vous pouvez modifier le premier (en <5min)
user.dz
@Whaaaaaat: Lorsque je testais cela, le pilote de stockage USB a été chargé juste avant la création du ou des périphériques de bloc; leur montage n'était pas nécessaire.
Piskvor a quitté le bâtiment
@Piskvor Cela at-il répondu à votre question? Si c'est le cas, vous devez la marquer comme la bonne réponse et attribuer votre prime.
John Scott