2008-10-10 13 views
32

Khi triển khai môi trường mới (Solaris 9) gần đây, một trong các bước là sao chép một tập hợp các tệp và thư mục sang vị trí mới của chúng và sau đó áp dụng bit UID nhóm (sử dụng "chmod -R g + s") cho tất cả các tệp trong cây thư mục đưa ra một chế độ của -rwxr-s --- cho mọi thứ. Kết quả là không có tập lệnh shell nào của chúng tôi sẽ thực thi trừ khi chúng được mở riêng lẻ và được lưu lại. Tôi nên thêm rằng chúng tôi đã thiết lập trước đó g + s trên thư mục mẹ mục tiêu trước khi sao chép các tập tin; điều này đã đặt chế độ ban đầu trên tất cả các thư mục mới thành drwxr-s --- nhưng các tệp có chế độ -rwxr-x ---Khi nào có thể hoặc nên sử dụng chmod g + s trên một tệp hoặc thư mục?

Sau cùng đã phát hiện ra bước nào gây ra sự cố, chúng tôi có thể cắt ra khỏi bước đó và tiếp tục. Tuy nhiên, tôi muốn hiểu ý nghĩa của bit "s" khi áp dụng cho các thư mục và tệp, với hy vọng rằng điều này sẽ giải thích lý do tại sao chúng tôi gặp sự cố ngay từ đầu.

+3

Tôi không đồng ý. Quyền và quyền trong một hệ thống tập tin có thể là nguyên nhân của các vấn đề và biết về chúng là quan trọng đối với một nhà phát triển làm việc trên một hệ thống dựa trên Unix hoặc Linux. –

Trả lời

12

Đối với tệp thi hành, điều này có nghĩa là khi tệp được thực thi, tệp được thực thi dưới dạng nhóm sở hữu tệp chứ không phải nhóm người dùng thực thi tệp.

Điều này rất hữu ích nếu bạn muốn người dùng có thể giả định quyền của một nhóm cụ thể chỉ để chạy một lệnh.

Tuy nhiên, nó cũng là một nguy cơ bảo mật vì nó cho phép người dùng nâng cao quyền của họ. Bạn phải biết rằng các tập lệnh với bộ bit này sẽ không làm bất cứ điều gì khiến người dùng lạm dụng các quyền bổ sung này.

0

Thông tin thêm về setuid và setgid here

70

Thiết thư mục g + s làm cho tất cả các file mới được tạo ra trong thư mục cho biết có nhóm của họ thiết lập để nhóm của thư mục.

Điều này thực sự có thể thực sự tiện dụng cho mục đích cộng tác nếu bạn có bộ umask sao cho các tệp có ghi nhóm theo mặc định.

Lưu ý: Đây là cách nó hoạt động trong Linux, nó có thể hoạt động hoàn toàn khác trong Solaris.

+2

Làm lại 'Ghi chú' của bạn; nó là hành vi POSIX, và Solaris là đủ POSIX tuân thủ cho rằng để làm việc như nhau. –

+3

Điều này thực sự phải được đánh dấu bằng OP là câu trả lời đúng. –

+0

@JohnCrawford - OP dường như đã ngừng sử dụng SO ngay sau khi đăng câu hỏi đó ... xem lần cuối vào tháng 1 năm 2009 –

2

Đối với tệp, điều đó có nghĩa là tệp được thực thi dưới dạng nhóm sở hữu tệp, chứ không phải là người dùng nhóm thực thi tệp đó. Nó có thể sử dụng được khi bạn muốn cho phép người dùng làm điều gì đó mà anh ta không có đặc quyền. Ví dụ, đối với một DBMS tôi sử dụng, nó là phổ biến để cho phép tất cả mọi người để sao lưu cơ sở dữ liệu. Mặc dù chỉ nhóm 'dbms' có quyền truy cập đọc/ghi vào tệp cơ sở dữ liệu, chương trình sao lưu có g + s được đặt để cho phép bất kỳ ai truy cập cơ sở dữ liệu thông qua nó, nhưng không trực tiếp.

Đối với các thư mục, điều đó có nghĩa là các thư mục mới được tạo sẽ thuộc sở hữu của nhóm sở hữu thư mục, chứ không phải người dùng nhóm đã tạo tệp đó. Một ví dụ điển hình cho điều này là không gian web của dự án sourceforge.net. Hãy tưởng tượng 3 nhà phát triển duy trì trang web của dự án. Bây giờ, nếu một trong số họ tạo ra một tập tin, chỉ có anh ta có thể ghi vào nó (theo mặc định). Để giải quyết vấn đề này, tất cả người dùng trên cùng một dự án đều nằm trong cùng một nhóm và thư mục có đặc quyền rws cho nhóm đó, vì vậy bất kỳ ai tạo tệp, nó sẽ được tạo thành có thể đọc và ghi được cho nhóm.

4

Để thực thi, g+s ghi đè id nhóm mà tệp thực thi sẽ chạy dưới dạng (thường được thừa hưởng từ cấp độ gốc).

$ cp `which id` id-test 
$ ./id-test 
uid=1001(user1) gid=1001(group1) groups=1001(group1),2001(project1) 
$ chgrp project1 id-test 
$ chmod g+s id-test 
$ ./id-test 
uid=1001(user1) gid=1001(group1) egid=2001(project1) groups=1001(group1),2001(project1)

(egid là "id nhóm hiệu quả" - thường giống như gid, "id nhóm", nhưng ở đây khác nhau.)

Đối với một thư mục, g+s ghi đè id nhóm mà tệp và thư mục mới sẽ có (nó thường được thừa kế từ người sáng tạo).

$ mkdir project 
$ chgrp project1 file1 
$ umask 
0022 
$ touch project/file1 
$ ls -l project/file1 
-rw-r--r-- 1 user1 group1 0 file1 
$ chmod g+s project 
$ touch project/file2 
$ ls -l project/file2 
-rw-r--r-- 1 user1 project1 0 file2

Bạn vẫn có thể cần phải fiddle với umask để có kết quả tốt nhất; ít nhất phải có điều gì đó được cho phép là 0007 đối với văn bản được chia sẻ và ít nhất phải cho phép một số nội dung ít nhất là được phép là 0027 để đọc được chia sẻ.

$ umask 0077 
$ touch project/file3 
$ ls -l project/file3 
-rw------- 1 user1 project1 0 file3 
$ umask 0027 
$ touch project/file4 
$ ls -l project/file4 
-rw-r----- 1 user1 project1 0 file4 
$ umask 0007 
$ touch project1/file5 
$ ls -l project1/file5 
-rw-rw---- 1 user1 project1 0 file5
0

Để mở rộng vấn đề cụ thể của bạn một chút, nó đã được lưu ý rằng thực thi sgid có thể gây ra sự cố bằng cách cấp cho người dùng quyền mà họ thường không có. Mặc dù đây là vấn đề đối với bất kỳ tệp thực thi nào, nó tạo ra một điều kiện có khả năng khai thác tiềm năng trong trường hợp các tập lệnh (đặc biệt có nghĩa là "các tệp thực thi bằng phương tiện của trình thông dịch bên ngoài được xác định bằng #! Ở đầu tệp"). được sử dụng để thực thi bất kỳ mã tùy ý nào với quyền của tập lệnh.

Nhân tố Unix đã triển khai một số đề án trong những năm nhằm giảm nhẹ hoặc loại bỏ lỗ hổng này, hầu hết trong số đó đã bao gồm một số hình thức cấm thực thi kịch bản suid hoặc sgid hoàn toàn hoặc yêu cầu bạn nhảy qua một vài hoops để kích hoạt nó (thường là trên cơ sở từng kịch bản). Một chương trình như vậy sẽ là nguyên nhân khiến bạn không thể chạy các tập lệnh sau khi bật cờ sgid của mình.

0

Khi bạn cần sử dụng: Khắc phục sự cố quyền sở hữu tệp SVN khi bạn sử dụng svn + ssh. Ai đó nói với tôi nó chỉ xảy ra trên BDB, nhưng tôi cũng có vấn đề như vậy trong kho lưu trữ FSFS. Về cơ bản khi bạn muốn giữ quyền sở hữu các tệp con bên trong một thư mục nhất quán khi có những người dùng khác viết nội dung trên đó, bạn sẽ phải sử dụng u + s/g + s.

6

Dưới đây là lời giải thích rất tiện dụng của SGID (chmod g + s): http://www.linuxnix.com/sgid-set-sgid-linuxunix/

SGID (Set Group ID trên thực hiện) là một loại đặc biệt của tập tin quyền trao cho một tập tin/thư mục. Thông thường trong Linux/Unix khi chương trình chạy, chương trình sẽ kế thừa quyền truy cập từ người dùng đã đăng nhập. SGID được định nghĩa là cấp quyền tạm thời cho người dùng để chạy chương trình/tệp với quyền của quyền đối với nhóm tệp thành trở thành thành viên của nhóm đó để thực thi tệp. Nói một cách đơn giản, người dùng sẽ nhận được quyền của Nhóm của Tập đoàn khi thực hiện lệnh Thư mục/tệp/chương trình/lệnh.

+0

Giải thích tuyệt vời! –

+2

vui nhộn, tính đến hôm nay trang này cho biết: Bạn không được phép truy cập /~lso/workstation/docs/permissions/sgid.htm trên máy chủ này. – SHernandez

+2

liên kết đã chết, nhưng điều này hoạt động: http://www.linuxnix.com/sgid-set-sgid-linuxunix/ "SGID (Đặt Group ID lên trên thực thi) là một loại đặc biệt của quyền truy cập tệp được cung cấp cho tệp/Thông thường trong Linux/Unix khi một chương trình chạy, nó kế thừa quyền truy cập từ người dùng đã đăng nhập. " – rubo77

Các vấn đề liên quan