GID, ปัจจุบัน, หลัก, เสริม, มีประสิทธิภาพและ ID กลุ่มจริงหรือไม่


22

ลิงค์ต่อไปนี้จะกล่าวถึงแนวคิดเหล่านี้ในบริบทที่แตกต่างกัน ฉันได้อ่านคำจำกัดความของพวกเขาแล้ว แต่ฉันก็ยังบอกไม่ได้ว่าพวกมันเกี่ยวข้องกันอย่างไรหรือบางคนก็เหมือนกัน

นี่คือตัวอย่างหนึ่งของแหล่งที่มาของความสับสนของฉัน:

ตามที่man idฉันพิมพ์idฉันควรได้รับสิ่งที่พวกเขาเรียกว่ามีประสิทธิภาพและรหัสกลุ่มจริง

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

อย่างไรก็ตามWikipediaหมายถึงผลลัพธ์ของidการแยกแยะระหว่างID หลักและรหัสเสริม นอกจากนี้วิกิพีเดียแตกต่างระหว่างหลัก VS เสริมและมีประสิทธิภาพ VS จริงรหัสกลุ่ม แนวคิดเหล่านี้เกี่ยวข้องกันอย่างไร

นอกจากนี้เป็นจริงหรือไม่ที่กลุ่มหลัก ID = กลุ่ม ID = ID กลุ่มปัจจุบัน ?


คำถามไม่ชัดเจน: ลิงก์ที่คุณให้ข้อมูลมีจำนวนมาก แล้วคุณไม่ได้อะไร
psusi

คำตอบ:


24

คุณผสมความแตกต่างสองอย่างที่นี่:

  1. ระหว่างจริงและมีประสิทธิภาพรหัสกลุ่ม
  2. ระหว่างกลุ่มผู้ใช้หลักและกลุ่มเสริม

ความแตกต่างครั้งแรกหมายถึงวิธีการที่กระบวนการจะถูกเรียกใช้ โดยปกติเมื่อคุณเรียกใช้คำสั่ง / โปรแกรมมันจะทำงานด้วยสิทธิ์ของผู้ใช้ของคุณ มันมีรหัสกลุ่มจริงเช่นเดียวกับกลุ่มหลักของผู้ใช้ของคุณ สิ่งนี้สามารถเปลี่ยนแปลงได้โดยกระบวนการเพื่อดำเนินการบางอย่างในฐานะสมาชิกของกลุ่มพิเศษอื่น ในการทำเช่นนั้นโปรแกรมใช้setgidฟังก์ชันที่เปลี่ยนid กลุ่มที่มีประสิทธิภาพ

ความแตกต่างที่สองหมายถึงผู้ใช้ ผู้ใช้แต่ละคนมีเขา / เธอกลุ่มหลัก มีเพียงหนึ่งต่อผู้ใช้และถูกอ้างถึงเป็นgidในเอาต์พุตของidคำสั่ง นอกเหนือจากนั้นผู้ใช้แต่ละคนสามารถอยู่ในกลุ่มเสริมจำนวนหนึ่ง- และเหล่านี้จะถูกระบุไว้ในตอนท้ายของการidส่งออก

[แก้ไข]:

ฉันยอมรับว่า manpage สำหรับidนั้นค่อนข้างทำให้เข้าใจผิดที่นี่ อาจเป็นเพราะเป็นคำอธิบายเวอร์ชั่นที่จัดทำโดยเอกสารข้อมูล หากต้องการดูอย่างชัดเจนยิ่งขึ้นให้เรียกใช้info coreutils "id invocation"(ตามที่แนะนำในตอนท้ายของidคู่มือ)


ขอบคุณ @rozcietrzewiacz นั่นเป็นประโยชน์มาก ฉันสามารถสันนิษฐานได้ว่ากลุ่ม ID ปัจจุบัน = กลุ่มหลัก ?
Amelio Vazquez-Reina

1
โดยทั่วไปไม่มี กลุ่ม "ของจริง" ในปัจจุบันสามารถเปลี่ยนแปลงได้โดยใช้newgrpคำสั่ง - ดูวรรคสองของคู่มือในลิงค์แรกของคุณ!
rozcietrzewiacz

18

มุมมองเคอร์เนล

ในความคิดมีสามกลุ่มกลุ่มที่กระบวนการเป็นสมาชิกอยู่ แต่ละชุดเป็นชุดย่อยของชุดต่อไปนี้

  1. กลุ่มเดียวที่เป็นกลุ่มเริ่มต้นของกระบวนการซึ่งเป็นไฟล์ที่สร้างโดยกระบวนการนี้จะเป็นของ
  2. ชุดของกลุ่มที่ถูกตรวจสอบเมื่อกลุ่มต้องการสิทธิ์ในการเปิดไฟล์
  3. ชุดของกลุ่มที่กระบวนการที่รันด้วยกระบวนการสิทธิ์พิเศษสามารถวาดขึ้นมาได้

สำหรับเหตุผลทางประวัติศาสตร์ชุดเหล่านี้ตามลำดับ:

  1. ID กลุ่มที่มีประสิทธิภาพ (egid);
  2. รหัสกลุ่มที่มีประสิทธิภาพรวมทั้งรหัสกลุ่มเสริม ;
  3. ทั้งหมดข้างต้นบวกกลุ่ม ID จริงและบันทึกการตั้งกลุ่ม-ID

โดยปกติโปรแกรมจะมี ID ผู้ใช้เดียว หากไฟล์เรียกทำงานมีการตั้งค่าบิตโหมดsetuidดังนั้นโปรแกรมจะมี ID ผู้ใช้สองรายการ: ID ผู้ใช้ที่มีประสิทธิภาพคือรหัสที่มีผลต่อสิทธิ์การใช้ไฟล์ข้อ จำกัด ต่อผู้ใช้ กระบวนการสามารถสลับระหว่าง ID ผู้ใช้ที่แท้จริงและมีประสิทธิภาพหากไม่ต้องการสิทธิ์พิเศษตลอดเวลาหรือหากจำเป็นต้องสลับระหว่างผู้ใช้ที่ไม่ใช่รูทสองคน

มีกลไกเดียวกันสำหรับกลุ่ม สำหรับกลุ่มมีคุณสมบัติเพิ่มเติมที่ไม่ได้มีอยู่เมื่อระบบถูกออกแบบ: กระบวนการสามารถเป็นสมาชิกของกลุ่มจำนวนเท่าใดก็ได้ นี่คือรหัสกลุ่มเสริม

มุมมองฐานข้อมูลผู้ใช้

เมื่อผู้ใช้ได้รับการรับรองความถูกต้องแล้วกระบวนการล็อกอินจะสลับไปยังผู้ใช้นั้นก่อนที่จะเปิดตัวเชลล์ของผู้ใช้ (หรือโปรแกรมใดก็ตามที่ผู้ใช้ร้องขอ) ก่อนที่จะเปลี่ยนเป็นผู้ใช้ที่ต้องการ (และสูญเสียสิทธิ์ของรูท) กระบวนการล็อกอินจะเปลี่ยนไปยังกลุ่มที่ต้องการ

ในเวอร์ชัน unix ก่อนหน้ากระบวนการสามารถอยู่ในกลุ่มเดียวเท่านั้น กลุ่มนี้เป็น ID กลุ่มหลักของผู้ใช้ซึ่งจัดเก็บในฐานข้อมูลผู้ใช้ (โดยทั่วไป/etc/passwd) กลุ่มนี้กลายเป็น ID กลุ่มจริงและมีประสิทธิภาพของเชลล์หรือโปรแกรมอื่นที่เปิดตัวโดยกระบวนการเข้าสู่ระบบ

ปัจจุบันกระบวนการสามารถอยู่ในหลาย ๆ กลุ่มดังนั้นผู้ใช้สามารถอยู่ในหลายกลุ่มได้เช่นกัน ฐานข้อมูลกลุ่ม (โดยทั่วไป/etc/group) มีรายชื่อผู้ใช้สำหรับแต่ละกลุ่ม กลุ่มเหล่านี้กลายเป็นรหัสกลุ่มเสริมสำหรับโปรแกรมที่เปิดใช้โดยกระบวนการเข้าสู่ระบบ


ขอบคุณ ฉันมีคำถามบางอย่างที่เข้าใจคำตอบของคุณ unix.stackexchange.com/questions/466742/…
ทิม

1

คำตอบที่ยอดเยี่ยมอื่น ๆ อีกมากมายที่นี่ แต่ถ้าคุณยังสับสนเหมือนเดิมนี่เป็นอีกแนวทางหนึ่ง โปรดทราบว่าฉันเป็นนักเรียนของสิ่งนี้เท่านั้นไม่ใช่เจ้านายดังนั้นคำตอบนี้กำลังดำเนินการอยู่และไม่ได้รับการพิจารณาคำตอบที่มั่นคง ลองพิจารณาคำตอบนี้ v0.2

กลุ่มนั้นง่ายและซับซ้อนในเวลาเดียวกัน

รหัสสำคัญที่ใช้ด้านล่าง:

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.

ชื่อผู้ใช้และ 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     
                         ...  

วิธีการรับรหัส:

1) เข้าสู่ระบบรับรองความถูกต้องชื่อผู้ใช้และผลตอบแทนLuIDและLgIDจาก/etc/passwdจาก

2) กระบวนการแรกตั้งค่าประสิทธิผล = จริง = เข้าสู่ระบบเช่น

EuID=RuID=LuID 
EgID=RgID=LgID

3) เด็กง่ามสืบทอดRuID, EuID, RgIDและEgID(และอาจจะถูกบันทึกไว้และ supp) อย่างไร

  • หาก s U id bit (s) ตั้งอยู่บนไฟล์ของโปรแกรมใหม่ที่จะดำเนินการให้ตั้งค่าที่มีประสิทธิภาพจากไฟล์:

    EUID = FuID

  • ถ้า s กรัม id bit ถูกตั้งค่าบนไฟล์ของโปรแกรมใหม่ที่จะดำเนินการให้ตั้งค่าที่มีประสิทธิภาพจากไฟล์:

    EgID = FgID

หมายเหตุ: suidและnosuidของระบบไฟล์พื้นฐานอ็อพชัน mountก็มีผลเช่นกัน

4a) หาก s U ID ที่ใช้ชุดEuIDนั้นEuIDสามารถเปลี่ยนแปลงได้ชั่วคราว (เช่นปรับลดลงจากราก) แต่แรกเป็นค่าเดิมจะถูกบันทึกไว้ในOuIDเพื่อที่จะสามารถเรียกคืนในภายหลังได้ถ้าต้องการ

4b) หาก sกรัมID ที่ใช้ชุดEgIDนั้นEgIDสามารถเปลี่ยนแปลงได้ชั่วคราว (เช่นปรับลดลงจากราก) แต่แรกเป็นค่าเดิมจะถูกบันทึกไว้ในOgIDเพื่อที่จะสามารถเรียกคืนในภายหลังได้ถ้าต้องการ


เมื่อสร้างไฟล์:

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

วิธีเปิดอ่าน

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.

วิธีเปิดสำหรับการเขียน:

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

วิธีเปิดเพื่อดำเนินการ:

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

เมื่อต้องการส่งข้อความ:

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

อ้างอิง: ข้อมูลประจำตัวของมนุษย์

พิเศษ:นี่คือยูทิลิตี้สำหรับพิมพ์ไฟล์ / etc / group ของคุณ:

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 }'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.