web-dev-qa-db-fra.com

Règles udev pour n'autoriser qu'un seul fournisseur et modèle de clé USB, mais aucun autre

Nous travaillons donc à la création d’un environnement dans lequel nous avons une configuration de stockage sécurisé sur nos ordinateurs portables Linux, de telle sorte que nos ordinateurs portables Linux ne peuvent connecter qu’un lecteur USB spécifique: un Kingston DataTraveler 2.0. Vendor: Le code du modèle est ceci (de lsusb): Bus 003 Device 003: ID 0951:1665 Kingston Technology

J'ai essayé de faire fonctionner ces règles, mais sur un environnement 12.04, les règles ne fonctionnent pas. (Notez que j'ai commenté avec # lignes pré-ajoutées, mais elles ne figurent pas dans les fichiers 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"

Le problème que j'ai est que AUCUNE de ces règles ne fonctionne, et je ne sais pas si c'est même la bonne approche pour cela.

Pensées?

5
Thomas Ward

J'ai déjà eu le même problème avec ignore_device non efficace. Je n'arrivais pas à comprendre pourquoi, alors je choisissais toujours d'autres solutions.

  • Bien, ignore_device a été supprimé avec la version 148 d'UDev. Voir note de version ou journal des modifications

    Si vous avez remarqué, tous les sujets suggérant son utilisation sont anciens (~ 2009).

  • Une alternative rapide consiste à utiliser: ENV{UDISKS_PRESENTATION_HIDE}="1" (Ubuntu 12.04). Pour les versions (> = 12.10) incluant udisks2, utilisez: ENV{UDISKS_IGNORE}="1".

    Référence: Archlinux Wiki: Udisks

Les autres solutions utilisent SYSFS. Soit device/authorized (comme indiqué sur le sol), device/remove ou driver/unbind. Voir tiliser uniquement des périphériques de stockage de masse sur un port USB sélectionné - comment?

La difficulté est de refuser tout stockage sauf une seule marque/modèle. La condition de correspondance de règles doit donc filtrer un seul nœud de périphérique, pas plus, pas moins (pas de périphériques enfants ou parents). C'est pourquoi j'ai ajouté 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"

Eh bien, UDisks ne cache que le crochet de montage. Ceux-ci peuvent être mieux en utilisant le pilote SYSFS unbind.

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

Référence: règle udev avec peu d'attributs de périphérique parent

7
user.dz

NOTE: Obsolète par la réponse de Sneetsher. Cette réponse est laissée ici pour des raisons d'héritage.

Donc, j'ai en quelque sorte résolu cela, et c'était une douleur à faire.

J'ai réexaminé les restrictions de mes règles et j'ai modifié les fonctionnalités. Apparemment, 12.04 n'honore pas l'option _ignore_device_. J'ai donc improvisé et écrit un script démontable. Puisqu'il n'y a qu'un seul port USB fonctionnel sur ces systèmes, nous nous retrouvons avec ce qui suit, ce que je sais peut casser autre chose:

/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 - Juste un script qui vérifie d'abord les périphériques existants, puis tous les autres périphériques de lecteur et qui se démonte si et seulement si le script s'exécute. Puisque tous les périphériques seraient sdb, sdc, etc., il existe des moyens de le faire fonctionner pour tout.


Morale de l'histoire: le système ignore l'option _ignore_device_ dans 12.04. Je dois tout script. : /

2
Thomas Ward