Đặt quyền mặc định cho các tệp và thư mục con mới được tạo trong một thư mục trong Linux?


99

Tôi có một loạt các tập lệnh và ứng dụng chạy dài đang lưu trữ kết quả đầu ra trong một thư mục được chia sẻ giữa một vài người dùng. Tôi muốn có một cách để đảm bảo rằng mọi tệp và thư mục được tạo trong thư mục chia sẻ này đều tự động có u=rwxg=rwxo=rquyền.

Tôi biết rằng tôi có thể sử dụng umask 006ngay từ đầu các tập lệnh khác nhau của mình, nhưng tôi không thích cách tiếp cận đó vì nhiều người dùng viết tập lệnh của riêng họ và có thể quên tự đặt umask.

Tôi thực sự chỉ muốn hệ thống tệp đặt các tệp và thư mục mới được tạo với một quyền nhất định nếu nó nằm trong một thư mục nhất định. Đây có phải là ở tất cả có thể?

Cập nhật : Tôi nghĩ rằng nó có thể được thực hiện với POSIX ACL , bằng cách sử dụng chức năng ACL mặc định, nhưng tất cả đều hơi quá đầu của tôi vào lúc này. Nếu ai đó có thể giải thích cách sử dụng ACL mặc định, nó có thể sẽ trả lời câu hỏi này một cách độc đáo.


1
POSIX ACL rất hay, tuy nhiên, 60% máy mà bạn gặp phải sẽ không bật chúng cho một số hệ thống tệp nhất định, tùy thuộc vào bản phân phối. Đây là phần giới thiệu và ví dụ rất hay: suse.de/~agruen/acl/linux-acls/online
Tim Post

1
Ý bạn là cùng một tài liệu tôi đã liên kết :) Tôi chưa có thay đổi để đọc nó nhưng cảm ơn vì đã quan tâm đến vấn đề còn hàng.
David Dean,

1
Liên kết trong bình luận của Tim Post dường như đã chết, nhưng nhờ có Internet Archive, tôi có thể xem nó và xác minh rằng vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html chứa cùng một tài liệu. Tôi sẽ chỉnh sửa câu hỏi để cập nhật liên kết.
rmunn

Câu trả lời:


78

Để có quyền sở hữu phù hợp, bạn có thể đặt bit setuid nhóm trên thư mục với

chmod g+rwxs dirname

Điều này sẽ đảm bảo rằng các tệp được tạo trong thư mục thuộc sở hữu của nhóm. Sau đó, bạn nên đảm bảo rằng mọi người đều chạy với umask 002 hoặc 007 hoặc thứ gì đó tương tự --- đây là lý do tại sao Debian và nhiều hệ thống linux khác được định cấu hình với các nhóm mỗi người dùng theo mặc định.

Tôi không biết cách nào để buộc các quyền bạn muốn nếu umask của người dùng quá mạnh.


23
Điều này không thực sự cung cấp một solution- anh ta hỏi về quyền không sở hữu, và cách duy nhất để làm điều đó là với ACL
Yarin

3
"... đảm bảo rằng mọi người đều chạy với umask 002 hoặc 007 hoặc thứ gì đó có tính chất như vậy" - điều đó hơi phức tạp .... Làm thế nào để bạn làm cho Postfix, Dovecot, Clam và Spam Assassin làm được điều này?
jww

2
Bộ +sphận làm gì? Cảm ơn.
tommy.carstensen

1
Trong trường hợp này, nó có nghĩa là đặt ID nhóm. Điều đó có nghĩa là chúng tôi sử dụng g + s để đặt bit SGID. Tôi nói "trong trường hợp này" vì + s được kết hợp với g cho nhóm. + s cũng có thể được sử dụng để thiết lập bit SUID (setuid).
Bastion

57

Đây là cách thực hiện bằng cách sử dụng ACL mặc định, ít nhất là trong Linux.

Trước tiên, bạn có thể cần bật hỗ trợ ACL trên hệ thống tệp của mình. Nếu bạn đang sử dụng ext4 thì nó đã được kích hoạt. Các hệ thống tệp khác (ví dụ, ext3) cần được gắn với acltùy chọn này. Trong trường hợp đó, hãy thêm tùy chọn vào của bạn /etc/fstab. Ví dụ: nếu thư mục nằm trên hệ thống tệp gốc của bạn:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Sau đó đếm lại nó:

mount -oremount /

Bây giờ, hãy sử dụng lệnh sau để đặt ACL mặc định:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Tất cả các tệp mới trong /shared/directorybây giờ sẽ nhận được các quyền mong muốn. Tất nhiên, nó cũng phụ thuộc vào ứng dụng tạo tệp. Ví dụ: hầu hết các tệp sẽ không được thực thi bởi bất kỳ ai ngay từ đầu (tùy thuộc vào đối số chế độ cho lệnh gọi open (2) hoặc create (2)), giống như khi sử dụng umask. Một số tiện ích thích cp, tarrsyncsẽ cố gắng để bảo vệ quyền của tập tin nguồn (s) mà sẽ mặt nạ ra mặc định của bạn ACL nếu các tập tin nguồn không nhóm ghi.

Hi vọng điêu nay co ich!


Có vẻ như điều này vẫn yêu cầu thích hợp umaskcho tất cả người dùng. = / unix.stackexchange.com/questions/71743/…
anatoly techtonik

1
@techtonik Như tôi đã viết, nó phụ thuộc vào ứng dụng tạo tệp. Ví dụ: nếu bạn sử dụng cpthì nó sẽ cố gắng sao chép các quyền của tệp nguồn. Thậm chí không umaskgiúp ích khi sử dụng cp. Tôi đã gặp vấn đề tương tự với tar. Xem câu hỏi này .
pelle

@techtonik Tôi đã thêm một câu về điều này trong câu trả lời của mình.
pelle

1
vâng, có vẻ như sự cố xảy ra trong ứng dụng đặt quyền một cách mạnh mẽ cho 644 khi thiết lập quyền ACL và POSIX của tôi đều dành cho 664. Sẽ rất tốt nếu làm rõ cơ chế dự phòng này cho những người khắc phục sự cố. Nhiều người thậm chí không biết về umask.
anatoly techtonik

Ý tôi là tôi đã lãng phí thời gian để thử xem liệu tôi có đặt đúng các cờ gắn kết hay không (và trên ext4, chúng không thể được đặt, vì có vẻ như chúng hoạt động tự động). Không có thông tin làm thế nào để kiểm tra xem setfacl works correctly- Tôi cho rằng nó sẽ thất bại, nhưng tôi không chắc chắn, vì câu trả lời thiếu điểm đó.
anatoly techtonik

4

Nó xấu xí, nhưng bạn có thể sử dụng lệnh setfacl để đạt được chính xác những gì bạn muốn.

Trên máy Solaris, tôi có một tệp chứa thông tin về người dùng và nhóm. Thật không may, bạn phải liệt kê tất cả người dùng (ít nhất là tôi không thể tìm ra cách làm cho điều này hoạt động khác):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Đặt tên tệp là acl.lst và điền tên người dùng thực của bạn thay vì user_X.

Bây giờ bạn có thể đặt các acls đó trên thư mục của mình bằng cách ra lệnh sau:

setfacl -f acl.lst /your/dir/here

bạn có thể loại bỏ danh sách người dùng nếu tất cả họ đều là thành viên của cùng một nhóm và chỉ sử dụng các quyền của nhóm?
David Dean,

Tôi đã tự hỏi mình câu hỏi tương tự. Đã một thời gian kể từ khi tôi thiết lập điều này. Nhưng mỗi khi tôi có một người dùng mới (cùng nhóm với những người khác), tôi lại quên cập nhật danh sách và tôi sẽ nhận được khiếu nại về việc người dùng mới không thể ghi / xóa tệp. Vì vậy, câu trả lời là: Không, bạn không thể.
innaM

4

trong tập lệnh shell của bạn (hoặc .bashrc), bạn có thể sử dụng những thứ như:

umask 022

umask là lệnh xác định cài đặt của mặt nạ kiểm soát cách thiết lập quyền tệp cho các tệp mới được tạo.


1
Điều này không chính xác vì umask giới hạn quyền mà nó không thể thêm quyền
ACV

@ACV bạn có thể nói rõ hơn được không? Điều này phù hợp với tôi, các tệp mới được tạo hiện cho phép các thành viên nhóm có quyền rw khi tôi thực hiện umask 002trong .bashrc của mình.
Arthur Dent

3
@ArthurDent umask 002giới hạn quyền truy cập của những người khác, giữ nguyên nhóm. Hãy nhớ ugorằng - đó là nhóm người dùng khác. Cũng nên nhớ rằng umask về cơ bản có nghĩa là trừ các giá trị mặc định. Đối với tệp: 666 - 002có nghĩa là 664 có nghĩa là nhóm không bị ảnh hưởng.
ACV
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.