GID, ID nhóm hiện tại, chính, bổ sung, hiệu quả và thực sự?


22

Các liên kết sau đây thảo luận về các khái niệm này trong các bối cảnh khác nhau. Tôi đã đọc định nghĩa của họ, nhưng tôi vẫn không thể biết chúng có liên quan như thế nào, hoặc nếu một vài trong số chúng giống nhau.

Đây là một ví dụ về nguồn gốc của sự nhầm lẫn của tôi:

Theo man id, nếu tôi gõ id, tôi sẽ nhận được những gì họ gọi là ID nhóm hiệu quảthực sự .

id uid=501(joe) gid=501(joe) groups=501(joe), 100(users)

Tuy nhiên, Wikipedia đề cập đến đầu ra của idđể phân biệt ID chính và ID bổ sung . Hơn nữa, Wikipedia phân biệt giữa chính vs bổ sunghiệu quả vs thực id nhóm. Làm thế nào để các khái niệm liên quan với nhau?

Ngoài ra, có đúng là ID nhóm chính = ID nhóm = ID nhóm hiện tại không?


Câu hỏi không rõ ràng: các liên kết bạn cung cấp cung cấp nhiều thông tin. Còn bạn thì sao?
psusi

Câu trả lời:


24

Bạn trộn hai phân biệt khác nhau ở đây:

  1. Giữa id nhóm thựchiệu quả
  2. Giữa các nhóm người dùng chínhbổ sung

Sự khác biệt đầu tiên đề cập đến cách các quy trình đang được chạy . Thông thường, khi bạn chạy một lệnh / chương trình, nó được chạy với các đặc quyền của người dùng của bạn. Nó có id nhóm thực giống như nhóm chính của người dùng của bạn. Điều này có thể được thay đổi bởi một quy trình để thực hiện một số nhiệm vụ với tư cách là thành viên của một nhóm đặc biệt khác. Để làm điều đó, các chương trình sử dụng setgidchức năng thay đổi id nhóm hiệu quả của chúng .

Sự phân biệt thứ hai đề cập đến người dùng . Mỗi người dùng có nhóm chính của mình . Chỉ có một cho mỗi người dùng và được gọi là gid trong đầu ra của idlệnh. Ngoài ra, mỗi người dùng có thể thuộc một số nhóm bổ sung - và những nhóm này được liệt kê ở cuối idđầu ra.

[Chỉnh sửa] :

Tôi đồng ý rằng trang này cho idphần nào sai lệch ở đây. Có lẽ bởi vì đây là phiên bản rút gọn của mô tả được cung cấp bởi tài liệu thông tin. Để nhìn rõ hơn, hãy chạy info coreutils "id invocation"(như được đề xuất ở phần cuối của idhướng dẫn).


Cảm ơn @rozcietrzewiacz. Điều đó rất hữu ích. Sau đó tôi có thể giả sử rằng ID nhóm hiện tại = nhóm chính không?
Amelio Vazquez-Reina

1
Nói chung, không. Nhóm "thực" hiện tại có thể được thay đổi bằng newgrplệnh - xem đoạn thứ hai của hướng dẫn trong liên kết đầu tiên của bạn!
rozcietrzewiacz

18

Chế độ xem kernel

Về mặt khái niệm, có ba nhóm các nhóm mà một quá trình là thành viên. Mỗi bộ là một tập hợp con sau.

  1. Nhóm duy nhất là nhóm mặc định của quy trình, các tệp được tạo bởi quy trình này sẽ thuộc về.
  2. Tập hợp các nhóm được kiểm tra khi nhóm yêu cầu quyền mở tệp.
  3. Tập hợp các nhóm mà một quy trình đang chạy với quy trình đặc quyền bổ sung có thể rút ra.

Vì lý do lịch sử, các bộ này tương ứng:

  1. các ID nhóm hiệu quả (egid);
  2. ID nhóm hiệu quả cộng với ID nhóm bổ sung ;
  3. tất cả các mục trên cộng với ID nhóm thựcID nhóm đã lưu .

Thông thường, một chương trình có một ID người dùng. Nếu tập tin thực thi có tập bit chế độ setuid , thì chương trình có hai ID người dùng: ID người dùng hiệu quả của nó là một vấn đề quan trọng đối với quyền truy cập tệp, giới hạn theo người dùng, xác định xem quy trình có đang chạy bằng root hay không. Quá trình có thể chuyển đổi giữa ID người dùng thực và hiệu quả, nếu nó không cần đặc quyền bổ sung mọi lúc hoặc nếu nó cần chuyển đổi giữa hai người dùng không root.

Cơ chế tương tự tồn tại cho nhóm. Đối với các nhóm, có một tính năng bổ sung không tồn tại khi hệ thống được thiết kế: một quy trình có thể là thành viên của bất kỳ số lượng nhóm nào; đây là các ID nhóm bổ sung.

Chế độ xem cơ sở dữ liệu người dùng

Khi người dùng được xác thực, quy trình đăng nhập sẽ chuyển sang người dùng đó, ngay trước khi khởi chạy trình bao của người dùng (hoặc bất kỳ chương trình nào mà người dùng yêu cầu). Ngay trước khi chuyển sang người dùng mong muốn (và mất quyền root), quá trình đăng nhập sẽ chuyển sang các nhóm mong muốn.

Trong các phiên bản unix đầu tiên, một quá trình chỉ có thể trong một nhóm duy nhất. Nhóm này là ID nhóm chính của người dùng, được lưu trữ trong cơ sở dữ liệu người dùng (thông thường /etc/passwd). Nhóm này trở thành ID nhóm thực sự và hiệu quả của shell hoặc chương trình khác được khởi chạy bởi quá trình đăng nhập.

Ngày nay, một quá trình có thể ở nhiều nhóm, vì vậy người dùng cũng có thể ở nhiều nhóm. Cơ sở dữ liệu nhóm (thường /etc/group) chứa danh sách người dùng cho mỗi nhóm. Các nhóm này trở thành ID nhóm bổ sung cho chương trình được khởi chạy bởi quá trình đăng nhập.


Cảm ơn. Tôi có một số câu hỏi hiểu câu trả lời của bạn. unix.stackexchange.com/questions/466742/ Ấn
Tim

1

Nhiều câu trả lời xuất sắc khác ở đây, nhưng nếu bạn vẫn bối rối như tôi, thì đây là một cách tiếp cận khác. Xin lưu ý rằng tôi chỉ là một sinh viên của công cụ này, không phải là một bậc thầy , vì vậy câu trả lời này là một công việc đang tiến triển, và không được coi là một câu trả lời chắc chắn, ít nhất là chưa. Hãy xem xét câu trả lời này v0.2.

Các nhóm đơn giản và phức tạp cùng một lúc.

Khóa để ID được sử dụng dưới đây:

KEY  Full name --------  Description---------------------------------------------

 u   User                 uID = User  ID (a unique # associated with each user)
 g   Group                gID = Group ID (a unique # associated with each group)
                            While each /etc/passwd entry has one uID and one gID,
                            additional gIDs can be associated with a users via
                            /etc/group.


 L   Login          IDs - uID and gID produced from the Login process.  
                            ('L' is not exactly standard Linux terminology, but
                            useful for explanations below.)

 F   File           IDs - uID and gID retrieved from a file's ownership.
                            ('F' is not exactly standard Linux terminology, but
                            useful for explanations below.)


 R   Real           IDs - Who actually                      runs a process 
 E   Effective      IDs - Who spoofed via setuid or setgid, runs a process
 O   Original Eff.  IDs - Place to save the original Effective ID when changing 
                          it (e.g. temporarily downgrading it) so can later 
                          restore it.  Also called "Saved ID"; (but 'S' was not 
                          used for here to help avoid confusion with the 'S' in  
                          'SetUserID' & SetGroupID.)
 +   Supplimentary gIDs - Optional, additional groups (none or more) running 
                          this process which can be used to test for permissions.

Tên người dùng và nhóm ID:

Category          USER  GROUP  Notes  
----------------- ----  -----  -------------------------------------------  
 From login:      LuID  LgID   From /etc/passwd lookup

 From files:      FuID  FgID   Each file has these. Set by creator process.


 For each running process:

            Real  RuID  RgID   Actual   user starting the program
       Effective  EuID  EgID   Assigned user starting the program*
           Saved  OuID  OgID   Saves original effective ID.
   Supplementary        +gID1  (optional, additional groups)
                        +gID2     
                         ...  

Cách các quy trình có được ID:

1) Đăng nhập xác thực tên người dùng và trả lại LuIDLgIDtừ /etc/passwd.

2) Quá trình đầu tiên thiết lập hiệu quả = real = đăng nhập, tức là

EuID=RuID=LuID 
EgID=RgID=LgID

3) trẻ em Forked kế thừa RuID, EuID, RgID, và EgID, (& có thể lưu & supp), tuy nhiên,

  • Nếu là u id bit (s) được thiết lập trên các tập tin của chương trình mới để thực hiện, sau đó thiết lập có hiệu lực từ file:

    Ê-sai = FuID

  • Nếu s g id bit (s) được đặt trên tệp của chương trình mới để thực thi, thì thiết lập có hiệu lực từ tệp:

    EgID = FgID

Lưu ý: Các tùy chọn gắn kết suidnosuid của hệ thống tập tin cơ bản cũng được áp dụng.

4a) Nếu s u id đã được sử dụng để thiết lập EuID, sau đó EuIDcó thể được tạm thời thay đổi (ví dụ như hạ cấp từ gốc), nhưng trước tiên nó là giá trị ban đầu được lưu trong OuIDđể nó có thể được phục hồi sau này nếu muốn.

4b) Nếu id g g được sử dụng để đặt EgID, thì EgIDcó thể tạm thời thay đổi (ví dụ: hạ cấp từ gốc), nhưng trước tiên, giá trị ban đầu của nó được lưu lại OgIDđể có thể khôi phục lại sau nếu muốn.


Khi một tệp được tạo:

File's new id's are set from effective id's: FuID=EuID and FgID=EgID
(Permissions are set from umask.)

Để mở để đọc:

If FuID = EuID  and  user-read bit is set, or  
If FgID = EgID  and group-read bit is set, or  
If FgID = +gID1 and group-read bit is set, or  
If FgID = +gID2 and group-read bit is set, ...  
then allow reading.

Để mở để viết:

(Same as above but write bit set to allow writing.)

Để mở để thực thi:

(Same as above but execute bit set to allow execution.)

Khi một tin nhắn cần được gửi:

Use RuID and RgID.  (Not EuID or EgID). *(Not sure where I read this.)*

Tài liệu tham khảo: thông tin người đàn ông

Bổ sung: Đây là một tiện ích để in đẹp tập tin / etc / nhóm của bạn:

cat /etc/group | sort -t: -k3n | awk  -F ':' \
  'BEGIN{printf "\n%-20s %-3s %-8s %s", \
           "Group name","pw", "Group ID ", "User list"}\
   BEGIN{printf "\n%-20s %-3s %-8s %s\n", \
           "----------","--", "---------", "---------"} \
        { printf "%-20s %-3s %8d %s\n", $1, $2, $3, $4 }'
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.