ฉันรับรู้รหัสผู้ใช้จริงแล้ว เป็นหมายเลขเฉพาะสำหรับผู้ใช้ในระบบ
ในระบบของฉัน My uid
is
$ echo $UID
1014
$
อีกสอง ID ย่อมาจากอะไร?
และการใช้ID ผู้ใช้ที่มีประสิทธิภาพและID ผู้ใช้ที่บันทึกไว้คืออะไรและเราใช้ที่ใดในระบบ?
ฉันรับรู้รหัสผู้ใช้จริงแล้ว เป็นหมายเลขเฉพาะสำหรับผู้ใช้ในระบบ
ในระบบของฉัน My uid
is
$ echo $UID
1014
$
อีกสอง ID ย่อมาจากอะไร?
และการใช้ID ผู้ใช้ที่มีประสิทธิภาพและID ผู้ใช้ที่บันทึกไว้คืออะไรและเราใช้ที่ใดในระบบ?
คำตอบ:
ความแตกต่างระหว่างรหัสผู้ใช้จริงและรหัสผู้ใช้ที่มีประสิทธิภาพเกิดขึ้นเนื่องจากคุณอาจจำเป็นต้องใช้ข้อมูลประจำตัวของผู้ใช้รายอื่นชั่วคราว (โดยส่วนใหญ่จะเป็นroot
เช่นนั้น แต่อาจเป็นผู้ใช้คนใดก็ได้) หากคุณมี ID ผู้ใช้เพียงตัวเดียวจะไม่มีทางเปลี่ยนกลับไปเป็น ID ผู้ใช้เดิมของคุณได้ในภายหลัง (นอกเหนือจากการยอมรับคำของคุณและในกรณีที่คุณroot
ใช้root
สิทธิ์เพื่อเปลี่ยนเป็นผู้ใช้รายใดก็ได้)
ดังนั้นรหัสผู้ใช้จริงคือตัวคุณเอง (ผู้ที่เป็นเจ้าของกระบวนการ) และรหัสผู้ใช้ที่มีประสิทธิผลคือสิ่งที่ระบบปฏิบัติการพิจารณาเพื่อตัดสินใจว่าคุณได้รับอนุญาตให้ทำบางสิ่งหรือไม่ (โดยส่วนใหญ่ มีข้อยกเว้นบางประการ)
เมื่อคุณเข้าสู่ระบบเชลล์ล็อกอินจะตั้งค่า ID ผู้ใช้จริงและที่มีประสิทธิภาพเป็นค่าเดียวกัน (ID ผู้ใช้จริงของคุณ) ตามที่ไฟล์รหัสผ่านให้
ตอนนี้มันเกิดขึ้นเช่นกันที่คุณรันโปรแกรม setuid และนอกเหนือจากการรันในฐานะผู้ใช้อื่น (เช่นroot
) โปรแกรม setuid ก็ควรจะทำอะไรบางอย่างในนามของคุณด้วย วิธีนี้ทำงานอย่างไร?
หลังจากรันโปรแกรม setuid โปรแกรมจะมี ID จริงของคุณ (เนื่องจากคุณเป็นเจ้าของกระบวนการ) และ ID ผู้ใช้ที่มีประสิทธิภาพของเจ้าของไฟล์ (เช่นroot
) เนื่องจากเป็น setuid
โปรแกรมทำทุกอย่างที่ต้องใช้เวทย์มนตร์ด้วยสิทธิพิเศษของผู้ใช้ขั้นสูงจากนั้นจึงต้องการทำบางสิ่งในนามของคุณ ซึ่งหมายความว่าความพยายามที่จะทำสิ่งที่คุณไม่ควรจะสามารถที่จะทำควรจะล้มเหลว มันทำได้อย่างไร? เห็นได้ชัดว่าการเปลี่ยนรหัสผู้ใช้ที่มีประสิทธิภาพเป็นรหัสผู้ใช้จริง!
ตอนนี้โปรแกรม setuid มีวิธีการเปลี่ยนกลับเนื่องจากทุกเมล็ดไม่มีใครรู้ว่าเป็น ID ของคุณและ ... ID ของคุณ ปังคุณตายแล้ว
นี่คือรหัสผู้ใช้ชุดที่บันทึกไว้สำหรับ
access
โพสต์ที่แท้จริงคือ นั่นคือ 99.9% ของมัน นอกจากนี้setfsuid
(แต่ไม่ค่อยจำเป็น) และ funcs ระดับต่ำมากและคุณต้อง (แต่ไม่ได้ตรวจสอบ) ID ผู้ใช้จริงสำหรับการรับ / ตั้งค่าลำดับความสำคัญหรือตัวกำหนดตารางเวลาและ IDs จะถูกส่งไปยังตัวจัดการสัญญาณหรือส่งคืนโดยwait
et al เป็นรหัสจริง execve
ไม่ตรวจสอบ แต่อาจล้มเหลวหากคุณเปลี่ยน ID ผู้ใช้จริง ยังfork
ไม่ตรวจสอบ แต่อาจล้มเหลวหากคุณใช้โควต้ากระบวนการสูงสุดใน UID จริง Google กับsite:man7.org
เป็นเพื่อนของคุณที่นี่
ping
ต้องการซ็อกเก็ตดิบ ผู้ใช้ทุกคนสามารถ (โดยปกติ) เปิดซ็อกเก็ตและสำหรับการฟังสูงกว่า 1024
ฉันจะพยายามอธิบายทีละขั้นตอนพร้อมกับตัวอย่าง
พื้นหลังสั้น ๆ
แต่ละขั้นตอนมีของตัวเอง 'ข้อมูลประจำตัวของกระบวนการ' ซึ่งมีคุณลักษณะเช่นPID
นี้PPID
, PGID
, session ID
และยังเป็นจริงและมีประสิทธิภาพของผู้ใช้และรหัสกลุ่ม:
RUID
, EUID
, ,RGID
EGID
เราจะเน้นที่สิ่งเหล่านั้น
ส่วนที่ 1: ทำความเข้าใจ UID และ GID
ตอนนี้ฉันจะเข้าสู่เชลล์ด้วยข้อมูลประจำตัวของฉันและเรียกใช้:
$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash
คุณสามารถดูชื่อบันทึกของฉัน (rotem), UIDและGIDซึ่งมีทั้ง 1,000 รายการและรายละเอียดอื่น ๆ เช่นเชลล์ที่ฉันลงชื่อเข้าใช้
ส่วนที่ 2: ทำความเข้าใจ RUID และ RGID
ทุกขั้นตอนมีเจ้าของและเป็นกลุ่ม
ในเชลล์ของเราทุกกระบวนการที่เราเรียกใช้ตอนนี้จะสืบทอดสิทธิ์ของบัญชีผู้ใช้ของฉันและจะทำงานด้วย UID และ GID เดียวกัน
ให้รันคำสั่งง่ายๆเพื่อตรวจสอบ:
$ sleep 10 & ps aux | grep 'sleep'
และตรวจสอบกระบวนการ UID และ GID:
$ stat -c "%u %g" /proc/$pid/
1000 1000
เหล่านี้เป็นจริง ID ผู้ใช้ ( RUID
) จริงและกลุ่ม ID ( RGID
) ของกระบวนการ
(*) ตรวจสอบตัวเลือกอื่น ๆ เพื่อดู UID และ GIDและวิธีการที่จะได้รับในหนึ่งซับใน
สำหรับตอนนี้ยอมรับความจริงที่ว่า แอตทริบิวต์EUID
และEGID
"ซ้ำซ้อน" และเท่ากับRUID
และRGID
อยู่เบื้องหลัง
ส่วนที่ 3: ทำความเข้าใจ EUID และ EGID
ลองใช้ping
คำสั่งเป็นตัวอย่าง
ค้นหาตำแหน่งไบนารีด้วยwhich
คำสั่งจากนั้นเรียกใช้ls -la
:
-rwsr-xr-x 1 root root 64424 Mar 10 2017 ping
root
คุณจะเห็นว่าเจ้าของและกลุ่มของไฟล์ที่มี เนื่องจากping
คำสั่งจำเป็นต้องเปิดซ็อกเก็ตและเคอร์เนล Linux ต้องการroot
สิทธิ์สำหรับสิ่งนั้น
แต่ping
ถ้าไม่มีroot
สิทธิ์จะใช้ได้ยังไง?
สังเกตตัวอักษร"s"แทน "x" ในส่วนของเจ้าของสิทธิ์ของไฟล์
นี้เป็นบิตอนุญาตเป็นพิเศษสำหรับไฟล์ไบนารีเฉพาะ (เช่นping
และsudo
) ซึ่งเป็นที่รู้จักกันsetuid
นี่คือที่มาEUID
และEGID
เข้ามามีบทบาท
อะไรจะเกิดขึ้นคือเมื่อsetuidไบนารีเช่นping
รัน, กระบวนการเปลี่ยนแปลงของมันมีผลบังคับใช้ User ID ( EUID
) จากค่าเริ่มต้นRUID
ให้กับเจ้าของของไฟล์นี้พิเศษไบนารีปฏิบัติการซึ่งในกรณีนี้คือ root
-
ทั้งหมดนี้ทำได้โดยข้อเท็จจริงง่ายๆที่ว่าไฟล์นี้มีsetuid
บิต
เคอร์เนลตัดสินใจว่ากระบวนการนี้มีสิทธิพิเศษหรือไม่โดยดูEUID
จากกระบวนการ เนื่องจากตอนนี้EUID
ชี้ไปroot
ที่การดำเนินการจะไม่ถูกปฏิเสธโดยเคอร์เนล
แจ้งให้ทราบล่วงหน้า : บนลินุกซ์ใหม่ล่าสุดออกการส่งออกของping
คำสั่งจะมีลักษณะที่แตกต่างกันเพราะความจริงที่ว่าพวกเขานำความสามารถของลินุกซ์วิธีนี้แทนการsetuidวิธีการ - สำหรับผู้ที่ไม่คุ้นเคย - อ่านที่นี่
ส่วนที่ 4: SUID และ SGID ล่ะ?
ID ผู้ใช้ที่บันทึกไว้ ( SUID
) ถูกใช้เมื่อกระบวนการที่มีสิทธิพิเศษกำลังทำงานอยู่ ( root
เช่น) และจำเป็นต้องทำงานบางอย่างที่ไม่มีสิทธิพิเศษ
ในกรณีนั้น UID ( EUID
) ที่มีประสิทธิภาพจากก่อนหน้านี้จะถูกบันทึกไว้ภายในSUID
แล้วเปลี่ยนเป็นงานที่ไม่มีสิทธิ เมื่องานที่ไม่มีสิทธิพิเศษเสร็จสิ้นEUID
จะถูกนำออกจากมูลค่าSUID
และเปลี่ยนกลับไปเป็นบัญชีที่มีสิทธิ์