Tại sao rm được phép xóa một tập tin thuộc quyền sở hữu của một người dùng khác?


52

Từ bài viết Tại sao rm có thể xóa các tệp chỉ đọc? Tôi hiểu rằng rmchỉ cần quyền cho phép ghi vào thư mục để loại bỏ các tập tin. Nhưng tôi thấy khó tiêu hóa hành vi nơi chúng ta có thể dễ dàng xóa một tệp người sở hữu và nhóm khác nhau.

Tôi đã thử như sau

mtk: tên người dùng của tôi
abc: đã tạo một người dùng mới

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

Tôi đã nghĩ rằng điều này không nên được cho phép. Người dùng chỉ có thể xóa các tệp thuộc quyền sở hữu của mình? Ai đó có thể làm sáng tỏ tại sao điều này được cho phép? và cách để tránh điều này là gì? Tôi có thể nghĩ rằng chỉ giới hạn quyền ghi của thư mục cha để không cho phép xóa các tập tin bất ngờ.

Câu trả lời:


100

Lý do tại sao điều này được cho phép có liên quan đến việc xóa một tập tin thực sự làm gì. Về mặt khái niệm, rmcông việc của bạn là xóa một mục nhập tên khỏi một thư mục. Do đó, tệp có thể trở nên không thể truy cập được nếu đó là tên duy nhất của tệp và do đó, inode và không gian bị chiếm giữ bởi tệp có thể được phục hồi tại thời điểm đó là gần như ngẫu nhiên. Tên của hệ thống gọi rằng rmlệnh gọi, unlinkthậm chí, còn gợi ý cho thực tế này.

Và, loại bỏ một mục nhập tên từ một thư mục về cơ bản là một hoạt động trên thư mục đó , vì vậy thư mục đó là điều mà bạn cần phải có quyền để viết.


Kịch bản sau đây có thể làm cho nó cảm thấy thoải mái hơn? Giả sử có thư mục:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

Và có một tập tin thuộc sở hữu của tôi và có hai liên kết cứng:

/home/me/myfile
/home/you/myfile

Đừng bận tâm làm thế nào mà liên kết cứng /home/you/myfileđã đến đó ngay từ đầu. Có lẽ rootđặt nó ở đó.

Ý tưởng của ví dụ này là bạn nên được phép xóa liên kết cứng /home/you/myfile. Rốt cuộc, nó làm lộn xộn thư mục của bạn . Bạn sẽ có thể kiểm soát những gì không và không tồn tại bên trong /home/you. Và khi bạn xóa /home/you/myfile, hãy lưu ý rằng bạn chưa thực sự xóa tệp. Bạn chỉ xóa một liên kết đến nó.


Lưu ý rằng nếu các bit dính được thiết lập trên thư mục chứa một tập tin (chương trình như ttrong ls), sau đó bạn làm cần phải là chủ sở hữu của tập tin để có thể được cho phép để xóa nó (trừ khi bạn sở hữu thư mục). Các bit dính thường được đặt trên /tmp.


6
Với bit dính trên thư mục, bạn cần có thể sửa đổi tệp để được phép xóa nó. Nghĩa là, nếu tệp thuộc về người khác trong cùng nhóm với bạn và nhóm có thể ghi vào tệp, bạn có thể xóa tệp. Hệ quả: bất kỳ ai cũng có thể xóa một tập tin với sự cho phép ghi công khai. (Tất cả chủ đề để có thể sửa đổi thư mục, tất nhiên.)
Jonathan Leffler

1
Tôi có thể hiểu sai về bạn nhưng không phải bạn đang nói rằng tôi có thể xóa -rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foonhư người dùng thông thường của mình ( /tmpcó dính không) vì tôi được phép viết nó? Nhưng tôi không thể.
Celada

4
Tôi tin rằng kịch bản me/ youđi vào trọng tâm rõ ràng hơn nếu bạn đưa ra giả thuyết rằng người dùng (người không sở hữu tệp) đã tạo liên kết. Đại từ khó sử dụng; giả sử Al tạo ra /home/al/file1và Bob, người đã thực thi (và có thể đọc) quyền truy cập /home/al, liên kết cứng tệp đến /home/bob/als_file. Bob có nên được ngăn chặn để xóa một liên kết anh ta tạo ra?   Và Al có được phép xóa (hủy liên kết) /home/bob/als_filekhi anh ta không có quyền ghi vào /home/bobkhông? Con đường này dẫn đến sự hỗn loạn.
Scott

2
@JonathanLeffler: Như ví dụ của Scott cho thấy, không, việc hủy liên kết và cắt xén không có kết quả thực giống nhau khi có các liên kết cứng khi chơi.
Kevin

6
@Kevin Tôi nghĩ vấn đề là nếu ai đó có quyền ghi vào tệp, vì vậy anh ta có thể hủy nội dung, thì anh ta cũng có thể được phép hủy liên kết nó (giả sử anh ta cũng có quyền ghi vào thư mục). Converse không áp dụng - có thể xóa tệp khỏi một thư mục không có nghĩa là anh ta sẽ có thể hủy nội dung, vì chúng có thể được truy cập từ thư mục khác. Đây là logic đằng sau cách thức hoạt động của bit dính.
Barmar

9

Để xóa một tập tin, bạn chỉ cần có thể ghi vào thư mục của tập tin.

Nếu bạn không thích điều này, bạn có thể thiết lập bit "dính" chmod +t dirnếu bạn đang sử dụng một nửa hệ điều hành gần đây (tính năng này được giới thiệu vào khoảng năm 1986 trong SunOS).

Nếu bạn muốn được chi tiết hơn, bạn cần một hệ thống tập tin với triển khai ACL hiện đại như ZFS. Các ACL NFSv4 tiêu chuẩn dựa trên NTFS bao gồm hỗ trợ quyền xóa cụ thể tệp cho mỗi người dùng và quyền "xóa_child" cho các thư mục.


9
Lưu ý rằng để thêm tbit, bạn cần sở hữu thư mục. Và nếu bạn sở hữu thư mục, bạn luôn có thể xóa các tệp bất kể tbit có được đặt hay không. Nếu bạn liên kết một tệp với thư mục của người khác, bạn nên chuẩn bị cho người khác để có thể xóa tệp đó. Một cách khác là trước tiên hãy tạo một thư mục con của bạn và thêm tệp của bạn vào đó, vì chủ sở hữu sẽ không thể xóa thư mục con đó nếu nó không trống.
Stéphane Chazelas

6
Bạn mô tả tình huống một cách sai lệch. Về mặt kỹ thuật, một tập tin không nằm trong một thư mục; đúng hơn, tên của một tệp nằm trong thư mục và rmlà một thao tác trên thư mục, không phải trên tệp. Một tập tin sẽ bị xóa khi tham chiếu cuối cùng đến nó bị xóa, nhưng về mặt kỹ thuật, đó là một tác dụng phụ.
Revierpost

0

Logic tương tự như của một ngôi nhà: Chủ sở hữu hoặc người thuê quyết định loại bỏ khách nào, bất kể ai sở hữu khách. Ngoài ra, vị khách bị đuổi đi được chào đón ở một ngôi nhà khác (có một liên kết cứng khác trong thư mục của người khác) sẽ không bị đóng băng đến chết bên ngoài.

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.