dd 및 fdisk 명령으로부터 장치 보호

dd 및 fdisk 명령으로부터 장치 보호

dd특정 장치가 명령의 출력 파일 이자 명령의 대상이 되는 것을 방지할 수 있는 방법이 있는지 궁금합니다 fdisk. 나는 현재 이 두 가지 작업을 사용하여 SD 카드에 쓰기 부트로더, 커널 및 루트 파일 시스템을 설정하고 있습니다 . 와 혼동될까봐 항상 /dev/sdd걱정됩니다 . 키보드에서 서로 가까이 있으면 다음 형식의 명령 사용을 방지하는 방법을 찾고 싶습니다.sddsdbsdaAD

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

또는

fdisk /dev/sd[ab]

답변1

보조 HDD에 충분히 고유한 이름을 제공하기 위해 udev 규칙을 작성해 볼 수 있습니다.

또 다른 생각: 보안 요구 사항을 "누가 수행하는지가 아니라 어떻게 수행하는지"로 설명할 수 있을 때마다 유형 강제에 대해 이야기하고 있으며 대부분의 Linux 배포판에서는 TE MAC 수준에서 수행됩니다. 내 MAC 경험의 대부분은 "SELinux"에서 이루어졌습니다.

DAC 수준에서 이를 잠글 수 없거나 장치에서 I/O를 수행할 수 없습니다(보안 모델로서의 DAC가 반드시 실패하는 것은 아니며 현재 DAC 정책이 전적으로 ID 기반이므로 특정 ID로 실행되는 모든 프로그램은 추가 관리 표현 없이도 동일한 권한을 얻을 수 있습니다. 일반 사용자 공간 구성 요소는 블록 파일로 아무 작업도 수행할 수 없지만 루트 유틸리티와 플랫폼의 특정 부분은 수행할 수 있도록 MAC 수준에서 잠글 수 있습니다. Fedora에서는 이미 이런 일이 발생하고 있으며 블록 장치 fixed_disk_device_t는 SELinux 유형 및 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블록 장치에서 작업을 수행하기 전에 작업을 수행해야 한다는 것을 기억하십시오. be) 매일 하루종일 달리는 것이 아니기 때문에 별 문제는 아닙니다 fdisk.

원하는 것보다 더 많은 작업이 필요할 수 있지만 TE는 직면하는 일반적인 문제를 해결하기 위한 메커니즘입니다. 개인적으로 이 udev규칙이 아마도 가장 안전한 선택일 것입니다. 이와 같은 많은 문제를 해결하는 데 관심이 있는 경우에만 TE에 대해 언급합니다.

답변2

확실하지 않은 경우에는 /dev/sdx에서 찾을 수 있는 대체 장치 이름을 사용하십시오 /dev/disk/.

예를 들어 내 SD 카드 리더는 입니다 /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. 약간 장황하지만 적어도 HDD와 혼동할 방법은 없습니다.

또는 hdparm -i /dev/sdx하드 드라이브인 경우 유용한 정보를 표시하고 불행한 사고를 피하는 데 도움이 될 수 있습니다.

답변3

에는 더 길고 더 의미 있는 이름도 있습니다 /dev/disk/by-*. 전체 디스크에 대해 /dev/disk/by-id디스크 모델 및 일련 번호가 포함된 디스크 장치에 대한 심볼릭 링크가 포함되어 있습니다.

추가 보호를 위해 자신에게 장치에 대한 액세스 권한을 부여한 sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H다음(예: 루트가 아닌) 자신의 사용자로 나머지 작업을 수행합니다.

작동 중인 디스크가 예상한 것과 같은지 다시 확인하십시오(예: check fdisk -l /dev/whatever, file - </dev/sdz99...). 셸에서 Esc .호출하려는 이전 명령의 매개변수와 함께 장치 이름을 다시 입력하지 마십시오.

답변4

이를 달성하는 두 가지 방법이 있습니다.

  1. 래퍼(셸 함수)를 작성하고 실제 프로그램에 전달하기 전에 그 안에 있는 매개변수를 확인하세요.
  2. SELinux, AppArmor 등으로 제한된 셸에서 이러한 작업을 수행합니다.

관련 정보