Protection des appareils contre les commandes dd et fdisk


8

Je me demande s'il existe un moyen d'empêcher certains appareils de devenir le fichier de sortie de la ddcommande et la cible de la fdiskcommande. J'utilise actuellement les deux opérations pour configurer l'écriture d'un chargeur de démarrage, d'un noyau et d'un système de fichiers racine sur une carte SD, qui apparaît comme /dev/sdd. Je suis toujours un peu impatient de me mélanger sddavec sdb, ou sdadepuis les lettres Aet Dsont proches sur le clavier, et je voudrais trouver un moyen d'empêcher les commandes avec ce format:

dd if=/dev/sd[a-zA-Z0-9]* of=/dev/sd[ab]

ou

fdisk /dev/sd[ab]

1
Une solution possible consiste à configurer les autorisations afin que vous n'ayez qu'un accès direct en écriture à la carte SD, mais pas sur un autre périphérique de stockage.
Sampo Sarrala - codidact.org

Réponses:


5

Vous pouvez essayer d'écrire une règle udev pour donner aux disques durs supplémentaires des noms suffisamment uniques.

Une autre idée: chaque fois que vous pouvez formuler une exigence de sécurité comme "Ce n'est pas qui le fait, c'est la façon dont ils le font", vous parlez d'application de type, et dans la plupart des distributions Linux, TE se fait au niveau MAC. La plupart de mon expérience MAC est avec "SELinux"

Vous ne pouvez pas le verrouiller au niveau du DAC, sinon vous ne seriez pas en mesure d'effectuer des E / S sur le périphérique (pas nécessairement une défaillance du DAC en tant que modèle de sécurité, c'est juste que la stratégie DAC actuelle est uniquement basée sur l'identité, donc tous les programmes exécutés sous une identité particulière obtiennent des droits identiques sans expression administrative supplémentaire possible). Le verrouillage au niveau MAC peut être effectué de sorte que les composants de l'espace utilisateur normal ne puissent rien faire avec le fichier de blocage, contrairement à vos utilitaires racine et à certaines parties de la plate-forme. Sur Fedora, c'est déjà un peu le cas avec les périphériques de bloc qui apparaissent avec le type SELinux fixed_disk_device_tet grub ayant bootloader_exec_tl'exemple suivant:

[root@localhost ~]# ls -lhZ $(which grub2-install)
-rwxr-xr-x. root root system_u:object_r:bootloader_exec_t:s0 /sbin/grub2-install
[root@localhost ~]# ls -lhZ /dev/sda
brw-rw----+ root disk system_u:object_r:fixed_disk_device_t:s0 /dev/sda
[root@localhost ~]# sesearch --allow | egrep bootloader | grep fixed
   allow bootloader_t fixed_disk_device_t : lnk_file { read getattr } ; 
   allow bootloader_t fixed_disk_device_t : chr_file { ioctl read write getattr lock append open } ; 
   allow bootloader_t fixed_disk_device_t : blk_file { ioctl read write getattr lock append open } ; 
[root@localhost ~]# 

Alors qu'il dda une étiquette bin_t régulière:

[root@localhost ~]# ls -lhZ $(which dd)
-rwxr-xr-x. root root system_u:object_r:bin_t:s0       /bin/dd

bin_t(apparemment) peut toujours écrire sur des périphériques bloqués, mais la création d'un nouveau type de contexte de fichier pour fdisket ddet l'écriture d'une règle selinux pour interdire l'accès au nouveau type fixed_disk_device_tne devrait pas être trop difficile. Vous auriez juste besoin de le faire pour que les rôles d'utilisateur normaux ne puissent pas le faire mais les utilisateurs avec le sysadm_tpeuvent le faire, puis n'oubliez pas de faire un newrole -r root:sysadm_ravant d'essayer de re-partitionner le disque ou de faire un ddsur le périphérique de bloc (ce qui ne devrait pas t être une affaire énorme car ce n'est pas comme si vous couriez fdisktous les jours toute la journée).

Probablement plus de travail que ce que vous recherchiez, mais TE est le mécanisme qui résout le problème général que vous rencontrez. Personnellement, la udevrègle est probablement que vous êtes le pari le plus sûr. Je ne mentionne que les trucs TE au cas où vous souhaiteriez résoudre un ensemble plus large de problèmes similaires à celui-ci.


4

En cas de doute /dev/sdx, utilisez les autres noms de périphériques que vous pouvez trouver dans /dev/disk/.

Par exemple, mon lecteur de carte SD est /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. C'est un peu bavard, bien sûr, mais au moins il n'y a aucun moyen de le confondre avec un disque dur.

Alternativement, un hdparm -i /dev/sdxpeut afficher des informations utiles s'il s'agit d'un disque dur et aider à éviter les accidents malheureux ...


Est-il possible de créer un lien au nom unique vers un appareil?
sj755

1
Avec les règles udev, mais cela ne fonctionnera que sur les boîtes qui utilisent ces règles (et non lors du démarrage d'un Live CD ou similaire), alors qu'il /dev/disk/*est disponible sur n'importe quel système Linux.
frostschutz

Les règles udev y parviendront, mais il est plus facile d'utiliser des liens symboliques (tant que le lien "de" n'est pas lui-même dans / dev, / proc ou / run) OU simplement créer une variable (comme dans bash / zsh): mysdcard=/dev/sdd, et ensuite vous utilisez bien sûr $mysdcardcomme argument partout où vous en avez besoin.
tgm1024 - Monica a été maltraitée le

3

Il y a des noms plus longs et significatifs /dev/disk/by-*. Pour un disque entier, /dev/disk/by-idcontient un lien symbolique vers le périphérique de disque qui contient le modèle de disque et le numéro de série.

Pour une protection supplémentaire, donnez-vous la permission d'accéder à l'appareil (par exemple sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), puis faites le reste sous votre propre utilisateur au lieu de root.

Assurez - vous de double vérifier que le disque que vous allez agir sur le contenu a prévu, par exemple , vérifier fdisk -l /dev/whatever, file - </dev/sdz99... Dans la coquille, Esc .de rappeler l'argument de la commande précédente, jamais retaper le nom du périphérique.


1

Je vois deux façons d'y parvenir:

  1. Écrivez un wrapper (fonction shell) et vérifiez les arguments avant de les passer au programme réel.
  2. Effectuez ces opérations à partir d'un shell qui a été restreint par SELinux, AppArmor ou similaire.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.