Mục đích của các quyền như 0111 hoặc 0333


17

Mục đích của các quyền Linux như 111 hoặc 333 (tức là người dùng có thể thực thi , nhưng không thể đọc tệp), nếu khả năng thực thi không tự động ngụ ý khả năng đọc?


1
Bạn có một ví dụ cho một thiết lập như vậy? Tôi nghĩ bạn đúng. Bạn không thể thực hiện những gì bạn không thể đọc. Các kết hợp này chỉ là lý thuyết trong không gian của các quyền trong khoảng từ 0000 đến 0777. Lưu ý rằng số 0 đứng đầu cần được thêm vào để hiển thị cơ sở bát phân của số.
ikrabbe

6
Trừ khi đó là tập lệnh (ví dụ: shell-script), bạn thực sự không cần quyền đọc để thực thi lệnh. Một thực thi "bình thường" - ví dụ. su, bash hoặc vi - chỉ cần cài đặt bit thực thi, để cho phép người dùng chạy nó. Một tập tin không thể đọc, không thể được sao chép . Vì vậy, bằng cách không cho phép người dùng sao chép một lệnh quan trọng về bảo mật (như su), anh ta đã ngăn không cho bản sao của chính nó - và cũng không thể tháo rời nó. * BSD có một số lệnh với thực thi nhưng không có quyền đọc.
Baard Kopperud 7/07/2015

Câu trả lời:


25

Tôi đã chơi với nó và rõ ràng, quyền thực thi không bao hàm quyền đọc. Các nhị phân có thể được thực thi mà không thể đọc được:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

Mặc dù vậy, tôi không thể thực thi các tập lệnh, trừ khi chúng có cả các bit cho phép đọc và thực thi:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied

4
Điều này đúng vì ví dụ thứ hai sử dụng #! để bắt đầu vì nó bỏ lỡ tiêu đề ELF và do đó yêu cầu tệp phải có thể đọc được để đoán nó có thể sử dụng được. Đây là một tình huống phổ biến cho nơi bạn muốn bảo vệ nội dung của các tệp khỏi bị sao chép sang các vị trí khác. Một người quản lý giấy phép là ví dụ phổ biến nơi bạn sẽ thấy điều này.
hspaans

1
Lưu ý rằng bạn vẫn có thể đọc tệp nhị phân chỉ thực thi: unix.stackexchange.com/a/34294

6
@hspaans: Shebang được xử lý bởi kernel và kernel không quan tâm đến những thứ kỳ quặc như quyền hạn. Đó là trình bao (hoặc trình thông dịch) cần truy cập đọc. Nhân chạy (nói) /bin/bash hw.sh, và sau đó bash cố mở hw.shđể đọc (và không thành công).
Kevin

2
Tôi rất hy vọng rằng kernel không quan tâm đến quyền. Không có gì khác làm. Câu đáng sợ trong bài đăng của @ Kevin có nghĩa là hạt nhân chỉ yêu cầu quyền thực thi để thực thi các tệp, bất kể họ có sử dụng shebang hay không.
Emil Jeřábek hỗ trợ Monica

2
@ EmilJeřábek Nhân quan tâm đến các quyền khi quyết định những gì một quy trình ứng dụng có thể làm. Nhưng vì nó là thành phần thực thi các quyền, nên nó cũng có thể bỏ qua chúng trong nội bộ. Vì vậy, nó có thể đọc dòng shebang khi xác định cách thực thi tệp được giải thích hoặc đọc nội dung của tệp nhị phân chỉ thực thi vào bộ nhớ.
Barmar

16

nó có ý nghĩa đối với các thư mục, ví dụ nếu bạn giữ (bí mật) các tệp thực thi trong một thư mục cụ thể và sau đó cho phép người dùng gọi các tệp đó mà không thể xem nội dung thư mục (nhưng biết rằng có một tệp cụ thể ở đó sau khi bạn thông báo cho họ!). 333 so với 111 cho phép ghi / xóa các tệp đến / từ các thư mục đó mà không thể xem nội dung của thư mục.


5
Tại Uni của tôi, các quyền đó đã được sử dụng để thả các bài tập vào một thư mục mà không có học sinh thấy người khác làm việc. Các giảng viên đã già.
DarkHeart

@DarkHeart Thú vị. Tôi hy vọng bạn phải thêm một thành phần ngẫu nhiên vào tên tệp, vì nếu không, nếu đó không phải là một động lực để thử và sao chép từ các bạn cùng lớp, tôi không biết đó là gì.
PSkocik 7/07/2015

5

Rõ ràng không phải tất cả các kết hợp đều hữu ích, nhưng để lấy một kết hợp mà bạn đã đề cập cụ thể ... Bạn thực sự không cần sự readcho phép để thực thi một tệp - chỉ có executequyền - trừ khi tệp được đề cập là tập lệnh (ví dụ: tập lệnh shell ( .sh), perl-script ( .pl), v.v.). Các tệp nhị phân bình thường có thể được thực thi chỉ với sự executecho phép. On * BSD-systmes, một số thực thi cho executephép mà không readpermisson, đặc biệt là trên lệnh "bảo mật quan trọng" - ví dụ su.

Vậy tại sao không cung cấp cho người dùng - cho phép read(và chỉ execute-permisson)? Trở thành một tập tin mà người dùng không thể đọc được, người dùng đó cũng không thể sao chép ! Xóa readquyền, ngăn người dùng tạo các bản sao thực thi "cá nhân" của riêng họ - mà sau này họ có thể lạm dụng (ví dụ: get SUID=root on).

Và không có sự cho writephép, ngăn không cho một tập tin bị xóa.

Tâm trí bạn, chứ không phải cho không read-nor write-permission cho chủ sở hữu là một phổ biến chút, nhưng đôi khi nó có thể là một ý tưởng tốt để ngăn chặn ngay cả những ownertừ chỉ xóa một tập tin. Tất nhiên owner- không đề cập đến root- có thể luôn tránh được các biện pháp đó, nếu không phải theo những cách khác, thì đơn giản chỉ bằng chmodsự cho phép trên tệp.


"nó có thể là một ý tưởng tốt để ngăn chặn ngay cả việc ownerchỉ xóa một tập tin." - ngoại trừ việc bạn không cần bất kỳ loại quyền nào trên một tệp (đọc, viết hoặc thực thi) để xóa nó.
Celada

Ví dụ, các tệp thực thi chỉ sẵn sàng có thể được sử dụng nếu tệp thực thi nhúng mật khẩu cơ sở dữ liệu mà nó sử dụng khi chạy để kết nối với cơ sở dữ liệu và thực hiện công việc của nó nhưng nó không nhất thiết muốn tiết lộ mật khẩu.
Celada

@Celada, đó là một câu hỏi cũ, nhưng liệu cách tiếp cận này có dễ bị ảnh hưởng bởi việc bỏ bộ nhớ thông qua việc tìm kiếm các vùng nhớ trong /proc/${PID}/mapsvà sau đó đọc các phần có liên quan của bộ nhớ /proc/${PID}/memkhông? Hay việc hạn chế các quyền trên tệp của tệp thực thi cũng hạn chế quyền đọc trên các phần có liên quan trong bộ nhớ trong khi thực thi? (Cái sau dường như không thể xảy ra, IMO.)
Spencer D
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.