Защита устройств от команд dd и fdisk


8

Мне интересно, есть ли какой-нибудь способ не допустить того, чтобы определенные устройства стали выходным файлом ddкоманды и целью fdiskкоманды. В настоящее время я использую две операции для настройки записи загрузчика, ядра и корневой файловой системы на SD-карту, которая выглядит как /dev/sdd. Я всегда немного тревожно , что я буду смешивать sddс sdb, или sdaтак как буквы Aи Dблизко на клавиатуре, и я хотел бы найти способ , чтобы предотвратить команды с этим форматом:

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

или

fdisk /dev/sd[ab]

1
Одним из возможных решений является настройка разрешений, чтобы у вас был прямой доступ только для записи на SD-карту, но не на любое другое устройство хранения.
Сампо Саррала - codidact.org

Ответы:


5

Вы можете попробовать написать правило udev, чтобы дать дополнительным жестким дискам достаточно уникальные имена.

Другая идея: всякий раз, когда вы можете сформулировать требование безопасности: «Дело не в том, кто это делает, а в том, как они это делают», вы говорите о принудительном применении типов, и в большинстве дистрибутивов Linux TE делается на уровне MAC. Большая часть моего опыта работы с MAC связана с "SELinux"

Вы не можете заблокировать его на уровне DAC, иначе вы не сможете выполнить ввод-вывод на устройстве (не обязательно сбой DAC в качестве модели безопасности, просто текущая политика DAC основана исключительно на идентификации, поэтому все программы работающие под определенным именем получают одинаковые права без дополнительного административного выражения). Можно заблокировать его на уровне MAC, чтобы обычные компоненты пользовательского пространства не могли ничего сделать с файлом блока, но ваши корневые утилиты и некоторые части платформы могут это сделать. На Fedora это уже в некотором роде, когда блочные устройства отображаются с типом SELinux fixed_disk_device_tи grub, bootloader_exec_tувидев следующий пример:

[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 ~]# 

Принимая во внимание, что ddесть обычная метка bin_t:

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

bin_t(очевидно) все еще может писать на блокирующие устройства, но создание нового типа контекста файла для fdiskи ddи написание правила selinux для запрета доступа нового типа fixed_disk_device_tне должно быть слишком сложным. Вам просто нужно сделать так, чтобы обычные пользовательские роли не могли этого сделать, но пользователи с этим sysadm_tмогут это сделать, затем не забудьте просто сделать newrole -r root:sysadm_rперед тем, как пытаться переразметить диск или выполнить перезапись ddна блочном устройстве (которое не должно это будет огромная сделка, так как ты не бегаешь fdiskкаждый день целый день).

Возможно, больше работы, чем вы искали, но TE - это механизм, который решает общую проблему, с которой вы сталкиваетесь. Лично udevправило, наверное, ты самая безопасная ставка. Я упоминаю о TE только в том случае, если вы заинтересованы в решении более широкого круга задач, подобных этому.


4

Если вы не уверены /dev/sdx, используйте альтернативные имена устройств, которые вы можете найти в /dev/disk/.

Например, у меня есть SD-кардридер /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Конечно, это немного многословно, но, по крайней мере, нельзя перепутать его с жестким диском.

Кроме того, он hdparm -i /dev/sdxможет показать полезную информацию, если это жесткий диск, и поможет избежать несчастных случаев ...


Можно ли создать ссылку на устройство с уникальным именем?
sj755

1
С правилами udev, но он будет работать только на блоках, которые используют эти правила (а не при загрузке Live CD или аналогичных), тогда как /dev/disk/*он доступен в любой системе Linux.
frostschutz

Правила udev достигнут этого, но проще использовать символические ссылки (если ссылка «from» сама по себе не находится в / dev, / proc или / run) ИЛИ просто создать переменную (как в bash / zsh): mysdcard=/dev/sddи тогда вы, конечно, просто используете $mysdcardв качестве аргумента, где вам это нужно.
tgm1024 - Моника подверглась жестокому обращению

3

Есть более длинные, значимые имена в /dev/disk/by-*. Для целого диска /dev/disk/by-idсодержит символьную ссылку на устройство, содержащее модель диска и серийный номер.

Для дополнительной защиты дайте себе разрешение на доступ к устройству (например sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), затем сделайте все остальное под вашим собственным пользователем, а не с правами root.

Убедитесь в том , чтобы перепроверить , что диск , который вы собираетесь действовать от того, имеет ожидаемое содержание, например , чек fdisk -l /dev/whatever, file - </dev/sdz99... В оболочке, Esc .чтобы вспомнить аргумент предыдущей команды, никогда не перепечатывать имя устройства.


1

Я вижу два способа сделать это:

  1. Напишите обертку (функцию оболочки) и проверьте аргументы там, прежде чем передавать их в настоящую программу.
  2. Выполняйте эти операции из оболочки, которая была ограничена SELinux, AppArmor и т.п.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.