Bảo vệ thiết bị khỏi các lệnh dd và fdisk


8

Tôi tự hỏi liệu có cách nào để ngăn một số thiết bị nhất định trở thành tệp đầu ra của ddlệnh và mục tiêu của fdisklệnh. Tôi hiện đang sử dụng hai thao tác để thiết lập ghi bộ tải khởi động, kernel và hệ thống tập tin gốc trên thẻ SD, xuất hiện dưới dạng /dev/sdd. Tôi luôn có một chút lo lắng rằng tôi sẽ trộn lẫn sddvới sdb, hoặc sdavì các chữ cái ADđóng trên bàn phím, và tôi muốn tìm cách ngăn chặn các lệnh với định dạng này:

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

hoặc là

fdisk /dev/sd[ab]

1
Một giải pháp khả thi là thiết lập quyền để bạn chỉ có quyền truy cập ghi trực tiếp vào thẻ SD chứ không phải trên bất kỳ thiết bị lưu trữ nào khác.
Sampo Sarrala - codidact.org

Câu trả lời:


5

Bạn có thể thử viết một quy tắc udev để cung cấp cho (các) ổ cứng bổ sung đủ tên duy nhất.

Một ý tưởng khác: Bất cứ khi nào bạn có thể diễn đạt một yêu cầu bảo mật là "Không phải ai đang thực hiện nó, thì đó là cách họ thực hiện", bạn đang nói về việc thực thi kiểu và trong hầu hết các bản phân phối Linux được thực hiện ở cấp MAC. Hầu hết trải nghiệm MAC của tôi là với "SELinux"

Bạn không thể khóa nó ở cấp độ DAC nếu không bạn sẽ không thể thực hiện I / O trên thiết bị (không nhất thiết là lỗi của DAC như một mô hình bảo mật, chính sách hiện tại của DAC chỉ là nhận dạng dựa trên tất cả các chương trình chạy theo một danh tính cụ thể có được các quyền giống hệt nhau mà không có biểu thức quản trị bổ sung nào có thể). Việc khóa nó ở cấp MAC có thể được thực hiện để các thành phần không gian người dùng thông thường không thể làm bất cứ điều gì với tệp khối nhưng các tiện ích gốc của bạn và các phần nhất định của nền tảng có thể. Trên Fedora, đây là trường hợp đã xảy ra với các thiết bị khối hiển thị với loại fixed_disk_device_tvà grub của Selinux khi bootloader_exec_txem ví dụ sau:

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

Trong khi đó ddcó nhãn bin_t thông thường:

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

bin_t(rõ ràng) vẫn có thể viết thư cho các thiết bị khối nhưng việc tạo ra một loại bối cảnh tập tin mới cho fdiskddvà viết một quy tắc selinux để không cho phép loại mới truy cập vào fixed_disk_device_tkhông nên quá khó khăn. Bạn chỉ cần làm cho nó trở thành vai trò người dùng thông thường không thể làm điều đó nhưng người dùng có sysadm_tthể làm điều đó, sau đó hãy nhớ làm điều newrole -r root:sysadm_rđó trước khi bạn cố gắng phân vùng lại đĩa hoặc thực hiện ddtrên thiết bị chặn (không nên ' T là một vấn đề lớn vì nó không giống như bạn chạy fdiskmỗi ngày suốt cả ngày).

Có thể nhiều công việc hơn bạn đang tìm kiếm, nhưng TE là cơ chế giải quyết vấn đề chung mà bạn đang gặp phải. Cá nhân, udevquy tắc có lẽ là bạn đặt cược an toàn nhất. Tôi chỉ đề cập đến công cụ TE trong trường hợp bạn muốn giải quyết một loạt vấn đề lớn hơn tương tự như vấn đề này.


4

Nếu bạn không chắc chắn /dev/sdx, hãy sử dụng tên thiết bị thay thế bạn có thể tìm thấy /dev/disk/.

Ví dụ, đầu đọc thẻ SD của tôi là /dev/disk/by-id/usb-TS-RDF5_SD_Transcend_000000000011-0:0. Đó là một chút dài dòng, chắc chắn, nhưng ít nhất không có cách nào để nhầm lẫn nó với một ổ cứng.

Ngoài ra, hdparm -i /dev/sdxcó thể hiển thị thông tin hữu ích nếu đó là đĩa cứng và giúp tránh các tai nạn đáng tiếc ...


Có thể tạo một liên kết được đặt tên duy nhất đến một thiết bị?
sj755

1
Với các quy tắc udev, nhưng nó sẽ chỉ hoạt động trên các hộp sử dụng các quy tắc đó (chứ không phải khi khởi động Live CD hoặc tương tự), trong khi /dev/disk/*có sẵn trên bất kỳ hệ thống Linux nào.
frostschutz

Các quy tắc udev sẽ thực hiện điều này, nhưng việc sử dụng các liên kết tượng trưng sẽ dễ dàng hơn (miễn là liên kết "từ" không nằm trong / dev, / Proc hoặc / run) HOẶC chỉ cần tạo một biến (như trong bash / zsh): mysdcard=/dev/sddvà sau đó bạn tất nhiên chỉ sử dụng $mysdcardlàm đối số bất cứ nơi nào bạn cần.
tgm1024 - Monica bị ngược đãi

3

Có tên dài hơn, có ý nghĩa trong /dev/disk/by-*. Đối với toàn bộ đĩa, /dev/disk/by-idchứa một liên kết tượng trưng đến thiết bị đĩa chứa mô hình đĩa và số sê-ri.

Để bảo vệ thêm, hãy cho phép bạn truy cập vào thiết bị (ví dụ sudo chown sj755 /dev/disk/by-id/ata-Yoyodine-50RDF15H), sau đó thực hiện phần còn lại dưới quyền người dùng của bạn thay vì root.

Đảm bảo kiểm tra kỹ xem đĩa bạn sẽ hành động có nội dung dự kiến ​​hay không, ví dụ: kiểm tra fdisk -l /dev/whatever, file - </dev/sdz99vỏ Trong vỏ, Esc .để gọi lại đối số của lệnh trước đó, không bao giờ nhập lại tên thiết bị.


1

Tôi thấy hai cách để thực hiện điều đó:

  1. Viết một trình bao bọc (hàm shell) và kiểm tra các đối số ở đó trước khi chuyển chúng đến chương trình thực.
  2. Thực hiện các thao tác này từ một trình bao bị giới hạn bởi SELinux, AppArmor hoặc tương tự.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.