ใครช่วยอธิบายกลไก set-user-ID ใน Unix ได้ไหม? เหตุผลเบื้องหลังการตัดสินใจออกแบบนี้คืออะไร มันแตกต่างจากกลไก ID ผู้ใช้ที่มีประสิทธิภาพอย่างไร
ใครช่วยอธิบายกลไก set-user-ID ใน Unix ได้ไหม? เหตุผลเบื้องหลังการตัดสินใจออกแบบนี้คืออะไร มันแตกต่างจากกลไก ID ผู้ใช้ที่มีประสิทธิภาพอย่างไร
คำตอบ:
คุณอาจรู้จักการอ่านเขียนและเรียกใช้งานไฟล์ปกติในยูนิกซ์
อย่างไรก็ตามในหลาย ๆ แอปพลิเคชันโครงสร้างการอนุญาตประเภทนี้ - เช่นการอนุญาตให้ผู้ใช้ที่ได้รับอนุญาตอย่างเต็มรูปแบบในการอ่านไฟล์ที่กำหนดหรือไม่ได้รับอนุญาตให้อ่านไฟล์ - นั้นหยาบเกินไป ด้วยเหตุนี้ระบบปฏิบัติการ Unix จึงมีบิตสิทธิ์อื่นอีกset-user-ID
บิต หากบิตนี้ถูกตั้งค่าสำหรับไฟล์เรียกทำงานดังนั้นเมื่อใดก็ตามที่ผู้ใช้อื่นที่ไม่ใช่เจ้าของดำเนินการกับไฟล์ผู้ใช้นั้นจะได้รับสิทธิ์ในการอ่าน / เขียน / เรียกใช้ไฟล์ทั้งหมดของเจ้าของในการเข้าถึงไฟล์อื่น ๆ ของเจ้าของ!
หากต้องการตั้งค่าบิต set-user-ID สำหรับไฟล์ให้พิมพ์
chmod u+s filename
ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าการอนุญาตให้ดำเนินการกลุ่มอื่นด้วย มันจะดีถ้ามีสิทธิ์การอ่านอื่น ๆ ของกลุ่มเช่นกัน ทั้งหมดนี้สามารถทำได้ด้วยคำสั่งเดียว
chmod 4755 filename
มันจะเรียกว่าเป็น UID ที่บันทึกไว้ ไฟล์ที่เปิดตัวที่มี Set-UID บิตบน UID ที่บันทึกไว้จะเป็น UID ของเจ้าของไฟล์ มิฉะนั้น UID ที่บันทึกไว้จะเป็น UID จริง
โพสต์นี้ใช้ในการประเมินสิทธิ์ของกระบวนการเพื่อดำเนินการบางอย่าง EUID สามารถเปลี่ยนเป็น UID จริงหรือ Superuser UID ถ้า EUID! = 0 ถ้า EUID = 0 มันสามารถเปลี่ยนเป็นอะไรก็ได้
passwd
ตัวอย่างของโปรแกรมดังกล่าวเป็น หากคุณแสดงรายการไว้เต็มคุณจะเห็นว่ามีบิต Set-UID และเจ้าของคือ "root" เมื่อผู้ใช้ปกติพูดว่า "mtk" passwd
มันจะเริ่มทำงานด้วย:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
เป็นแหล่งข้อมูลที่ดีในกรณีนี้ ดูเพิ่มเติม questiin นี้ดังนั้น สำหรับคำอธิบายที่ผ่านมาดูโพสต์ที่เก็บถาวรนี้
แทนที่จะเรียกว่า "set UID" และ "effective UID" เป็นกลไกแนวคิดทั้งหมดของ UID ควรถูกเรียกว่า เหตุผลในการดำรงอยู่ของ UID ต่างๆเป็นปัญหาต่าง ๆ กับการแยกสิทธิพิเศษ แม้บางครั้งผู้ใช้ทั่วไป (ไม่ได้รับสิทธิพิเศษ) ก็จำเป็นต้องทำสิ่งต่าง ๆ (เข้าถึงทรัพยากร) ที่ผู้ใช้ที่มีสิทธิพิเศษเท่านั้นที่สามารถทำได้ เพื่อให้บรรลุเป้าหมายนี้ได้อย่างง่ายดายโปรแกรมสามารถเปลี่ยน UID ได้ มี 3 ประเภทเหล่านี้:
real UID - UID ที่เป็นเจ้าของกระบวนการ
UID ที่มีประสิทธิภาพ - UID ที่กระบวนการทำงานในขณะนี้ - เป็นตัวกำหนดความสามารถที่แท้จริงของกระบวนการในช่วงเวลาใดเวลาหนึ่ง นี่คือสิ่งที่ps
แสดงให้คุณเห็นในฟิลด์ USER
UID ชุดที่บันทึกไว้ - ตัวยึดตำแหน่งที่ใช้สำหรับสลับไปมาระหว่าง UID ที่แท้จริงและมีประสิทธิภาพ
จำเป็นที่จะต้องเป็นคนสุดท้ายที่เกิดขึ้นจากความจริงที่ว่าผู้ใช้ปกติสามารถเพียงสลับไปมาระหว่างทั้งสามและไม่มีอะไรอื่นและโปรแกรม setuid มักจะต้องการที่จะรู้อย่างใดซึ่งเป็นผู้ใช้ที่โหลดมัน (บวก UID จริงไม่ควรจะมีการเปลี่ยนแปลงตั้งแต่ ซึ่งจะสร้างความยุ่งเหยิงที่ยิ่งใหญ่กว่าเดิม)
การเผยแผ่ของ mtk นั้นดีมาก
passwd
ตัวอย่างเป็นหนึ่งในการเพิ่มสิทธิ์ - passwd เสมอทำงานเป็นรากเพราะมันจะต้องแก้ไขไฟล์ว่ารากเท่านั้นที่ได้รับอนุญาตในการปรับเปลี่ยน สิ่งนี้ทำให้มีความสำคัญที่ไฟล์รหัสผ่านที่เรียกใช้งานได้นั้นไม่น่าจะมีแนวโน้มที่จะบัฟเฟอร์มากเกินไปเป็นต้นซึ่งผู้ใช้ทั่วไปที่ฉลาดอาจจะสามารถใช้งานได้ซึ่งไม่ได้ตั้งใจ
เหตุผลอีกประการหนึ่งคือการปกป้องผู้ใช้ในลักษณะเดียวกับที่คุณอาจใช้su
หากคุณเข้าสู่ระบบในฐานะ root - เพื่อลดหรือ จำกัดสิทธิ์ของคุณสำหรับงานที่เฉพาะเจาะจงไม่เลื่อนระดับพวกเขา ตัวอย่างเช่นหากฉันได้รับอนุญาตให้เริ่มบริการ daemon ที่ไม่ต้องการเข้าถึงข้อมูลของฉันและมีเนื้อหาของตัวเองซึ่งเป็นสิ่งที่ต้องการ (เช่นตัวบันทึก) การรันมัน suid จะหมายความว่ามีเพียงการเข้าถึงเนื้อหานั้นเท่านั้น ไม่ใช่ของฉันหรือใครก็ตาม
โปรดทราบว่ามันเป็นไปได้ที่จะตั้ง uid โดยทางโปรแกรมแม้ว่า suid bit จะไม่ถูกตั้งค่าบน executableอย่างไรก็ตามมันจะไม่ทำงานสำหรับการเลื่อนระดับ นั่นคือถ้าคุณเป็นผู้ใช้ปกติและเขียนโปรแกรมที่ตั้งค่า uid ณ จุดหนึ่งโปรแกรมนั้นจะไม่สามารถเปลี่ยนเป็นรูทได้ Apache เชื่อในวิธีนี้ มันมักจะเริ่มต้นโดยรูทและมีกระบวนการหนึ่งที่จะให้เด็ก ๆ ซึ่งเปลี่ยน uid ให้กับผู้ใช้ที่ไม่ใช่ผู้มีสิทธิพิเศษ (เช่น "httpd") กระบวนการย่อยเหล่านั้นเป็นสิ่งที่เว็บเซิร์ฟเวอร์ทำงานจริง