dd
특정 장치가 명령의 출력 파일 이자 명령의 대상이 되는 것을 방지할 수 있는 방법이 있는지 궁금합니다 fdisk
. 나는 현재 이 두 가지 작업을 사용하여 SD 카드에 쓰기 부트로더, 커널 및 루트 파일 시스템을 설정하고 있습니다 . 와 혼동될까봐 항상 /dev/sdd
걱정됩니다 . 키보드에서 서로 가까이 있으면 다음 형식의 명령 사용을 방지하는 방법을 찾고 싶습니다.sdd
sdb
sda
AD
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
이를 달성하는 두 가지 방법이 있습니다.
- 래퍼(셸 함수)를 작성하고 실제 프로그램에 전달하기 전에 그 안에 있는 매개변수를 확인하세요.
- SELinux, AppArmor 등으로 제한된 셸에서 이러한 작업을 수행합니다.