Làm cho tất cả các tệp mới trong một thư mục có thể truy cập vào một nhóm


131

Giả sử tôi có hai người dùng Alice và Bob và một nhóm GROUPNAME và một thư mục foo, cả hai người dùng đều là thành viên của GROUPNAME (sử dụng Linux và ext3).

Nếu tôi lưu dưới dạng người dùng Alice một tệp bên dưới foo, các quyền là : -rw-r--r-- Alice Alice. Tuy nhiên, có thể đạt được rằng mọi tệp được lưu trong một số thư mục con foocó quyền -rwxrwx--- Alice GROUPNAME(ví dụ: chủ sở hữu Alice, nhóm GROUPNAME) không?


Câu trả lời:


91

Bạn có thể kiểm soát các bit quyền được gán với umaskvà nhóm bằng cách đặt thư mục setgid thành GROUPNAME.

$ umask 002            # allow group write; everyone must do this
$ chgrp GROUPNAME .    # set directory group to GROUPNAME
$ chmod g+s .          # files created in directory will be in group GROUPNAME

Lưu ý rằng bạn phải thực hiện chgrp/ chmodcho mọi thư mục con; nó không tự động lan truyền (nghĩa là các thư mục không được tạo hoặc không được tạo sau đó trong thư mục setgid sẽ được setgid , mặc dù thư mục sau sẽ nằm trong nhóm GROUPNAME).

Cũng lưu ý rằng đó umasklà một thuộc tính quy trình và áp dụng cho tất cả các tệp được tạo bởi quy trình đó và các phần tử con của nó (kế thừa umaskhiệu ứng trong cha mẹ của chúng tại fork()thời điểm đó). Người dùng có thể cần phải thiết lập điều này ~/.profilevà có thể cần phải coi chừng những thứ không liên quan đến thư mục của bạn cần các quyền khác nhau. mô-đun có thể hữu ích nếu bạn cần các cài đặt khác nhau khi làm những việc khác nhau.

Bạn có thể kiểm soát mọi thứ tốt hơn một chút nếu bạn có thể sử dụng POSIX ACL; có thể chỉ định cả mặt nạ quyền và nhóm và để chúng lan truyền hợp lý. Tuy nhiên, hỗ trợ cho POSIX ACL có phần thay đổi.


6
Các thư mục con được tạo sau khi đặt setgid trên thư mục cha sẽ có setgid được đặt tự động.
Arrowmaster

2
@Arrowmaster: Trên một số hệ thống, có lẽ, nhưng không phải tất cả; Tôi đã thử nghiệm trên OSX và nó không lan truyền, ít nhất là không root.
geekizard

2
Vâng trên Debian (và tôi giả sử hầu hết các bản phân phối Linux khác) tên setgid và nhóm đều được truyền bá.
Arrowmaster

3
Trên OS X, bit setgid trên một thư mục chỉ bị bỏ qua; các tệp và thư mục mới luôn được cung cấp cho nhóm thư mục chứa của chúng.
John Flatness

Có phải các tập tin được sao chép hoặc chuyển sang foo (sử dụng cp resp. Mv) sẽ tự động đạt được các quyền mong muốn ( -rwxrwx--- A G) không?
sinh viên

106

Nếu có thể, sử dụng danh sách kiểm soát truy cập (ACL) .

Trong Linux, đảm bảo rằng hệ thống tệp bạn đang sử dụng hỗ trợ ACL (hầu hết các hệ thống tệp unix đều làm). Bạn có thể cần thay đổi tùy chọn gắn kết để bật ACL: với ext2 / ext3 / ext4, bạn cần chỉ định aclrõ ràng tùy chọn gắn kết, vì vậy mục nhập /etc/fstabsẽ như thế nào /dev/sda1 / ext4 errors=remount-ro,acl 0 1. Chạy mount -o remount,acl /để kích hoạt ACL mà không cần khởi động lại. Đồng thời cài đặt các công cụ dòng lệnh ACL getfaclsetfacl, thường được cung cấp trong một gói được gọi acl.

Bây giờ, quá trình thiết lập một lần đã kết thúc, hãy thay đổi ACL của thư mục để cấp cho quyền ghi nhóm và để các quyền này được kế thừa bởi các tệp mới được tạo. Trong Linux:

setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory

Nếu ACL không phải là một tùy chọn, hãy tạo thư mục thuộc sở hữu của nhóm GROUPNAMEvà đặt quyền của nó thành 2775 hoặc 2770 : chmod g+rwxs /path/to/directory. Ở sđây có nghĩa là bit setgid; đối với một thư mục, điều đó có nghĩa là các tệp được tạo trong thư mục này sẽ thuộc về nhóm sở hữu thư mục đó.

Bạn cũng sẽ cần phải thiết lập Alice và Bob umask để làm cho tất cả các file của họ nhóm ghi theo mặc định. Ô mặc định trên hầu hết các hệ thống là 022, có nghĩa là các tệp có thể có tất cả các quyền ngoại trừ ghi theo nhóm và khác. Thay đổi điều đó thành 002, nghĩa là chỉ cấm quyền viết khác. Bạn thường đặt cài đặt đó trong ~/.profile:

umask 002    # or 007 to have files not readable by others

6
+1 - Câu trả lời rất kỹ lưỡng. Tôi không bao giờ biết một người có thể vượt qua / trên đường bay. Tốt để biết.
boehj

1
Lệnh Thie setfacl -d không hoạt động đối với tôi vì các tệp trong thư mục đó có r-- mask phủ nhận mọi quyền ghi. Rất thích sự giúp đỡ. Xem unix.stackexchange.com/questions/71743/ Kẻ
Ben McCann

2
@its_me Q1: Tôi hiển thị một mountlệnh với remounttùy chọn, vì vậy nó không sử dụng fstab. Có aclhai lần có nghĩa là hệ thống tập tin đã được gắn với acltùy chọn này và nó vô hại. acl Nhân tiện, đây là mặc định cho ext4 trong các nhân gần đây (bản vá vẫn hoàn toàn mới khi tôi viết câu trả lời này). Q2: Bạn có thể chạy các lệnh theo một trong hai thứ tự.
Gilles

1
@its_me Vâng, sự hiểu biết của bạn là chính xác, chỉ là nó không quan trọng theo thứ tự bạn thêm các mục
Gilles

8
bạn nên cải thiện câu trả lời sau đó để sử dụng GROUPNAMEthay vì G, để làm cho nó rõ ràng hơn
knocte

24

Câu hỏi này là một phù hợp tốt cho linux acl. Vì bạn không nêu hệ điều hành của mình, tôi sẽ giả sử Linux trong phần tiếp theo. Đây là một phiên ví dụ.

Tôi không biết về một aclhướng dẫn thực sự tốt , nhưng bạn có thể làm tồi tệ hơn http://www.vanemery.com/Linux/ACL/linux-acl.html

Lưu ý rằng mặc định aclhoạt động giống như một ô địa phương. Vì ít nhất là trong Linux, các nhiệm vụ được áp dụng trên toàn cầu, đây là cách duy nhất tôi biết để có được hiệu ứng của một địa phương. Đối với một số lý do này một tính năng ít được biết đến. Mạng lưới tràn ngập những người hỏi về một ghi đè ô địa phương, nhưng hầu như không ai nghĩ đến việc sử dụng acl.

Cũng lưu ý rằng bạn cần phải gắn kết phân vùng bạn đang làm việc với aclsự hỗ trợ, ví dụ.

/dev/mapper/debian-acl /mnt/acl        ext3    defaults,acl        0       2

Phiên sau:

/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x

Đặt nhóm foothành staffvà đặt acl của nhóm và người dùng foothành rwx.

/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x

Đặt acls mặc định của người dùng và nhóm rwxlà tốt. Điều này xác định các quyền mà các tập tin và thư mục kế thừa từ foo. Vì vậy, tất cả các tệp và thư mục được tạo trong foo sẽ có quyền của nhóm rw.

/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---

Bây giờ tạo một số tệp trong foonhư người dùng faheemjohn.

/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar

# switch to user john for this next command.

/mnt/acl/foo$ touch baz

Liệt kê các tập tin. Lưu ý rằng cả hai tệp thuộc sở hữu faheemvà các tệp thuộc sở hữu johnđược tạo với quyền của nhóm rw.

/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff  1024 May  9 01:22 .
drwxr-xr-x  4 faheem faheem 1024 May  9 01:20 ..
-rw-rw----  1 faheem faheem    0 May  9 01:20 bar
-rw-rw----  1 john   john      0 May  9 01:22 baz
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.