Thực thi vs Đọc bit. Làm thế nào để quyền thư mục trong Linux hoạt động?


380

Trong CMS của tôi, tôi nhận thấy rằng các thư mục cần bit thực thi ( +x) được đặt cho người dùng để mở chúng. Tại sao phải có quyền thực thi để đọc một thư mục và làm thế nào để cấp phép thư mục trong Linux hoạt động?


17
... uh, bởi vì đó là những gì cờ "+ x" dành cho :)
badp


16
Hãy nghĩ như thế này: mục nhập thư mục chứa tên tệp , vì vậy "đọc" một thư mục đang liệt kê các tệp, "sử dụng" thư mục đang truy cập các tệp.
tylerl

7
Với tập lệnh thực thi bit được đặt , bạn được phép duyệt qua chữ tượng hình của nó . Cho rằng bạn thuộc về "người khác" và chỉ thực hiện tập bit ( chmod 771 dirOne), bạn không thể liệt kê nội dung dirOne. NHƯNG nếu nó chứa một thư mục con "dirTwo" với các quyền được đặt như ( chmod 774 dirTwo) bạn thực sự có thể liệt kê nội dung của nó!
Stphane

1
Khách truy cập trong tương lai cũng sẽ thấy câu hỏi liên quan trên AskUbfox: Askubfox.com/q/1106822/295286
Sergiy Kolodyazhnyy

Câu trả lời:


352

Khi áp dụng quyền cho các thư mục trên Linux, các bit quyền có ý nghĩa khác với các tệp thông thường.

  • Các chút đọc ( r) cho phép người dùng bị ảnh hưởng đến danh sách các tập tin trong thư mục
  • Các chút write ( w) cho phép người dùng bị ảnh hưởng để tạo, đổi tên hoặc xóa các file trong thư mục, và sửa đổi các thuộc tính của thư mục
  • Các chút thực ( x) cho phép người dùng bị ảnh hưởng để vào thư mục, và các tập tin truy cập và thư mục bên trong
  • Các bit dính ( Thoặc tnếu các bit thực được thiết lập cho những người khác) khẳng định rằng tập tin và thư mục trong thư mục đó chỉ có thể bị xóa hoặc đổi tên của chủ sở hữu của họ (hoặc root)

25
Câu trả lời tuyệt vời, nhưng tôi nghĩ câu cuối cùng là sai lệch. Không có quyền nào trong số các quyền này có thể bị ghi đè trên mỗi tệp. Ở đây, truy cập của Google có một chút mơ hồ: +xtrên thư mục cấp quyền truy cập vào các tập tin inodes thông qua thư mục cụ thể này (không có gì hơn, không có gì nữa, cũng có thể cũng chdircần +xmột số thứ khác). Để đọc hoặc ghi nội dung của một tệp, người dùng cũng cần +r/ +wtrên tệp này, nhưng đó là các quyền riêng biệt (chúng không ghi đè lên bất cứ điều gì).
Stéphane Gimenez

2
Cờ bất biến là hệ thống tập tin cụ thể và nó sẽ không ghi đè chính xác các quyền đó, đó là lý do tại sao tôi nghĩ câu cuối cùng là sai lệch :-)
Stéphane Gimenez

1
Tôi nghĩ rằng có thể hữu ích khi đề cập đến ACL trong câu trả lời này và các câu trả lời khác, vì ứng dụng của họ cho một số thư mục có thể gây hiểu lầm nếu người ta chỉ xem xét thông tin được cung cấp bởi Chris Down
user907860

4
Có vẻ như câu trả lời này không đề cập đến hiệu ứng kết hợp giữa ghi bit và thực thi bit, như câu trả lời của Baldrick có đề cập dưới đây? tức là nếu bạn chỉ có quyền viết mà không có quyền thực thi thì sẽ khá vô dụng.
xji

1
@ StéphaneGimenez " +xtrên thư mục cấp quyền truy cập vào các tập tin inodes" - Điều này có vẻ như là một nghi thức tốt, nhưng có lẽ không nói lên toàn bộ câu chuyện? Nếu không có bit thực thi được đặt trên một thư mục, bạn không thể thay đổi tên tệp của tệp trong thư mục đó. Tôi tự hỏi tại sao điều này là bởi vì tên tệp được lưu trữ trong một mục nhập thư mục, không phải là một nút.
Kevin Wheeler

259

Đầu tiên, hãy nghĩ: một thư mục là gì? Nó chỉ là một danh sách các mục (tệp và thư mục khác) sống trong đó. Vì vậy: thư mục = danh sách tên.

Đọc bit = Nếu được đặt, bạn có thể đọc danh sách này. Vì vậy, ví dụ, nếu bạn có một thư mục có tên poems:

  • Bạn có thể ls poemsvà bạn sẽ nhận được một danh sách các vật phẩm sống trong đó ( -lsẽ không tiết lộ bất kỳ chi tiết nào!).
  • Bạn có thể sử dụng hoàn thành dòng lệnh tức là touch poems/so <TAB> poems/somefile.
  • Bạn không thể tạo poemsthư mục làm việc của bạn (tức là cdvào nó).

Viết bit = Nếu được đặt, bạn có thể sửa đổi danh sách này tức là bạn có thể {thêm, đổi tên, xóa} tên trên đó. Nhưng! Bạn thực sự có thể làm điều đó chỉ khi bit thực thi được đặt quá.

Thực thi bit = Làm cho thư mục này thư mục làm việc của bạn tức là cdvào nó. Bạn cần sự cho phép này nếu bạn muốn:

  • truy cập (đọc, viết, thực thi) các mục sống trong.
  • tự sửa đổi danh sách tức là thêm, đổi tên, xóa tên trên đó (tất nhiên bit ghi phải được đặt trên thư mục).

Trường hợp thú vị 1 : Nếu bạn có quyền ghi + thực thi trên một thư mục, bạn có thể {xóa, đổi tên} các mục sống ngay cả khi bạn không viết ghi chú vào các mục đó. (sử dụng bit dính để ngăn chặn điều này)

Trường hợp thú vị 2 : Nếu bạn đã thực thi quyền (nhưng không ghi) trên thư mục VÀ bạn có quyền ghi trên tệp sống trong đó, bạn không thể xóa tệp (vì liên quan đến việc xóa tệp khỏi danh sách). Tuy nhiên, bạn có thể xóa nội dung của nó, ví dụ nếu đó là tệp văn bản, bạn có thể sử dụng vi để mở và xóa mọi thứ. Các tập tin sẽ vẫn ở đó, nhưng nó sẽ trống.

Tóm lược:

Đọc bit = Bạn có thể đọc tên trong danh sách.
Viết bit = Bạn có thể {thêm, đổi tên, xóa} tên trong danh sách NẾU bit thực thi cũng được đặt.
Thực thi bit = Bạn có thể làm cho thư mục này trở thành thư mục làm việc của bạn.

PS: Bài báo được đề cập bởi Kusalananda là một bài đọc tốt.


17
Suy nghĩ về thư mục như một danh sách làm cho mọi thứ rõ ràng và hợp lý hơn.
Trismegistos

20
Câu trả lời tuyệt vời, nhưng quá tập trung vào thuật ngữ "thư mục làm việc". Tôi cần xbit cho mọi quyền truy cập vào tệp này: vì cat a/b/c/d, tôi cần xbit trên tất cả a, bc, ngay cả khi tôi không sử dụng chúng như cwd.
glglgl

1
Đây là nơi tôi phát hiện ra bạn không thể viết trừ khi nó cũng có thể thực thi được! Trường hợp 2 cũng thú vị, câu trả lời tuyệt vời!
Mirko

1
Một lưu ý khác là ngay cả khi bạn có xquyền trên thư mục, nếu bạn không có xquyền đối với tệp trong đó, bạn không thể thực sự "thực thi" tệp. Bạn chỉ có thể catlàm ví dụ, nhưng bạn không thể tự chạy tệp.
xji

2
Nếu bạn muốn ls -llàm việc cho một thư mục, cần cả hai rvà sự xcho phép.
Eric Wang

44

Tôi đã chuẩn bị bảng này với tất cả các quyền có thể và hiệu ứng thực tế của chúng.

quyền thư mục linux

(*) Chỉ tên tệp : các thuộc tính khác như kích thước hoặc ngày không thể truy cập được. Ví dụ: bạn có thể sử dụng phím tab để tự động hoàn thành nhưng không phải lệnh ls.

Một số suy nghĩ :

  • Với X unset , R và W chủ yếu là vô dụng.
  • X một mình vô hiệu hóa RW mang lại cho bạn cảm giác an toàn sai lầm vì bạn có thể đọc và ghi một cách mù quáng nội dung tệp và truy cập các thư mục con. Bạn nên chắc chắn rằng mọi trẻ em trực tiếp của thư mục đều có quyền rõ ràng.
  • Hiếm khi bạn sẽ sử dụng các giá trị khác ngoài:
    • 0 : Không có quyền truy cập.
    • 1 : Truy cập tối thiểu cho phép đi qua.
    • 5 : Cho phép đọc / ghi, nhưng không làm thay đổi cấu trúc của cây thư mục.
    • 7 : Truy cập đầy đủ.

1
Tôi sẽ coi 5 là một giá trị hữu ích, khi bạn muốn cho phép đọc / ghi, nhưng không làm thay đổi cấu trúc của cây thư mục.
hg Diesel

Bạn đúng rồi. Đã cập nhật!
David

4
Biểu đồ tóm tắt tuyệt vời. Làm cho tôi tự hỏi những gì ai đó đã nghĩ -W-là có chức năng tương đương với ---các thư mục. Không trực quan lắm. Tất nhiên những loại bit cấp thấp này thường không có.
CivilFan

2
Tôi đã thử nghiệm điều này trên máy mac của mình, nhưng với -W-, tôi có thể đổi tên thư mục (trong một thư mục có bit dính) nhưng không phải với ---. Đó dường như là một sự khác biệt
warmconemotel

3
@David, Bạn đang thiếu bit dính.
Pacerier

42

Đây là một bài viết tốt về điều này.

Tóm lược:

Một thư mục với xtập bit của nó cho phép người dùng cd(thay đổi thư mục) vào thư mục này và truy cập các tệp trong đó.

Chi tiết:

  • Đọc ( r)

    Khả năng đọc tên của các tệp được lưu trữ trong thư mục này.

  • Viết ( w)

    Khả năng đổi tên các tệp trong thư mục, tạo tệp mới hoặc xóa các tệp hiện có, nếu bạn cũng có quyền Thực thi. Nếu bạn không thực hiện perm, thì viết perm là vô nghĩa.

  • Thực thi ( x)

    Khả năng cdvào thư mục này và truy cập các tệp trong thư mục này.

Dưới đây là một vài ví dụ giúp bạn dễ hiểu hơn:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Thậm chí còn có nhiều thông tin hơn trong bài viết Hacking Linux Exposed .



2

Đối với mọi thao tác truy cập tệp hoặc thư mục, trước tiên, nó phải giải quyết đường dẫn đến tệp hoặc thư mục. Độ phân giải yêu cầu người dùng phải thực thi quyền trên tất cả các thư mục dọc theo đường dẫn, ngoại trừ thành phần đường dẫn cuối cùng. Vì vậy, đối với các thư mục, bạn có thể nghĩ về bit thực thi có nghĩa là "có thể phân giải".

Lấy đường dẫn /a/b/c.txtlàm ví dụ, giả sử người dùng có 1) thực thi quyền //a; 2) đã cho phép đọc trên /a/b; 3) đọc và viết cho phép trên /a/b/c.txt.

  • Người dùng sẽ không đọc được (danh sách) /a, vì nó không có quyền đọc. Nhưng độ phân giải đường dẫn không thất bại.

  • Người dùng sẽ có thể đọc (danh sách) /a/b, bởi vì người dùng có quyền thực thi trên /, /avà quyền đọc trên /a/b. Lưu ý rằng, khi đọc /a/b, tên tệp c.txtsẽ hiển thị, nhưng siêu dữ liệu (ví dụ: kích thước tệp) và nội dung thì không, vì tên tệp được lưu trữ cùng với thư mục, không phải với tệp, nhưng siêu dữ liệu được lưu trữ trong nút của tệp.

  • Người dùng sẽ không đọc /a/b/c.txt, bởi vì khi giải quyết các đường đi từ /để /ađến /a/b, nó không thành công tại /a/bkể từ khi người dùng không có quyền thực thi.

Xem thêm cách tên đường dẫn được phân giải thành tệp .


0

Một sự tương tự hữu ích là nghĩ mỗi tệp là một cuốn sách và mỗi thư mục là một phòng lưu giữ các cuốn sách.

Có các quy tắc để có thể liệt kê tất cả các tên trong một phòng: bit đọc cho các thư mục. Quy tắc để loại bỏ một cuốn sách từ phòng: bit ghi cho các thư mục. Và quy tắc để vào một phòng và khám phá: thư mục kết quả thực hiện bit.

Các quy tắc đó là riêng biệt và khác nhau so với các quy tắc cho mỗi cuốn sách. Có các quy tắc cho phép ai đó mở sách và đọc nội dung của nó: bit đọc cho mỗi tệp. Có các quy tắc để sửa đổi nội dung của một cuốn sách: bit ghi (s) cho mỗi tệp. Và để thực thi một tệp: bit thực thi cho mỗi tệp.

Tôi viết bit (s) vì có ba bit cho mỗi hành động. Có một bit đọc cho chủ sở hữu, một bit đọc cho (các) nhóm và một bit đọc cho mọi người khác (những người khác). Nếu bất kỳ một trong ba bit đó được đặt cho một người dùng cụ thể, thì người dùng đó có bit đọc hoạt động. Không quan trọng là bit đó được phát hiện hoạt động như thế nào bởi u ser hay g roup hoặc o có, nó có kết quả hiệu quả như nhau.

Do đó, người dùng có thể được phép vào phòng và xóa sách khỏi thư viện nhưng không được phép đọc nội dung của cùng một cuốn sách.

Đó là lý do tại sao một bit đọc cho các thư mục là bắt buộc: để kiểm soát ai được phép liệt kê nội dung phòng (tên sách).

Và bit thực thi được sử dụng để kiểm soát ai có thể vào phòng sách.


-1

Ý nghĩa của Execute cho các thư mục khá rõ ràng. Vì không có quyền Traverse, không giống như Windows, bạn phải quá tải một cái gì đó. Các nhà thiết kế đã chọn Execute, Điều đó gây ra sự nhầm lẫn vô tận. Là một anh chàng bảo mật máy tính, giao quyền Thực thi cho thứ gì đó mà bạn không có ý định Thực sự trông có vẻ tinh ranh.


1
Việc phát minh ra bit quyền thực thi trước ngày phát minh ra khái niệm về sự cho phép đi qua khác biệt trong khoảng hai thập kỷ. Logic của câu trả lời này phụ thuộc vào dòng thời gian lịch sử không giống với thế giới thực và cũng không nhận thấy sự tồn tại của GENERIC_EXECUTEnó và nó là gì.
JdeBP
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.