กลไก set-user-ID ทำงานอย่างไรใน Unix


12

ใครช่วยอธิบายกลไก set-user-ID ใน Unix ได้ไหม? เหตุผลเบื้องหลังการตัดสินใจออกแบบนี้คืออะไร มันแตกต่างจากกลไก ID ผู้ใช้ที่มีประสิทธิภาพอย่างไร

คำตอบ:


10

คุณอาจรู้จักการอ่านเขียนและเรียกใช้งานไฟล์ปกติในยูนิกซ์

อย่างไรก็ตามในหลาย ๆ แอปพลิเคชันโครงสร้างการอนุญาตประเภทนี้ - เช่นการอนุญาตให้ผู้ใช้ที่ได้รับอนุญาตอย่างเต็มรูปแบบในการอ่านไฟล์ที่กำหนดหรือไม่ได้รับอนุญาตให้อ่านไฟล์ - นั้นหยาบเกินไป ด้วยเหตุนี้ระบบปฏิบัติการ Unix จึงมีบิตสิทธิ์อื่นอีกset-user-IDบิต หากบิตนี้ถูกตั้งค่าสำหรับไฟล์เรียกทำงานดังนั้นเมื่อใดก็ตามที่ผู้ใช้อื่นที่ไม่ใช่เจ้าของดำเนินการกับไฟล์ผู้ใช้นั้นจะได้รับสิทธิ์ในการอ่าน / เขียน / เรียกใช้ไฟล์ทั้งหมดของเจ้าของในการเข้าถึงไฟล์อื่น ๆ ของเจ้าของ!

หากต้องการตั้งค่าบิต set-user-ID สำหรับไฟล์ให้พิมพ์

 chmod u+s filename

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าการอนุญาตให้ดำเนินการกลุ่มอื่นด้วย มันจะดีถ้ามีสิทธิ์การอ่านอื่น ๆ ของกลุ่มเช่นกัน ทั้งหมดนี้สามารถทำได้ด้วยคำสั่งเดียว

 chmod 4755 filename

มันจะเรียกว่าเป็น UID ที่บันทึกไว้ ไฟล์ที่เปิดตัวที่มี Set-UID บิตบน 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

ลิงค์อ้างอิง 1
ลิงค์อ้างอิง 2


5

man credentialsเป็นแหล่งข้อมูลที่ดีในกรณีนี้ ดูเพิ่มเติม questiin นี้ดังนั้น สำหรับคำอธิบายที่ผ่านมาดูโพสต์ที่เก็บถาวรนี้

แทนที่จะเรียกว่า "set UID" และ "effective UID" เป็นกลไกแนวคิดทั้งหมดของ UID ควรถูกเรียกว่า เหตุผลในการดำรงอยู่ของ UID ต่างๆเป็นปัญหาต่าง ๆ กับการแยกสิทธิพิเศษ แม้บางครั้งผู้ใช้ทั่วไป (ไม่ได้รับสิทธิพิเศษ) ก็จำเป็นต้องทำสิ่งต่าง ๆ (เข้าถึงทรัพยากร) ที่ผู้ใช้ที่มีสิทธิพิเศษเท่านั้นที่สามารถทำได้ เพื่อให้บรรลุเป้าหมายนี้ได้อย่างง่ายดายโปรแกรมสามารถเปลี่ยน UID ได้ มี 3 ประเภทเหล่านี้:

  • real UID - UID ที่เป็นเจ้าของกระบวนการ

  • UID ที่มีประสิทธิภาพ - UID ที่กระบวนการทำงานในขณะนี้ - เป็นตัวกำหนดความสามารถที่แท้จริงของกระบวนการในช่วงเวลาใดเวลาหนึ่ง นี่คือสิ่งที่psแสดงให้คุณเห็นในฟิลด์ USER

  • UID ชุดที่บันทึกไว้ - ตัวยึดตำแหน่งที่ใช้สำหรับสลับไปมาระหว่าง UID ที่แท้จริงและมีประสิทธิภาพ

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


1

การเผยแผ่ของ mtk นั้นดีมาก

passwdตัวอย่างเป็นหนึ่งในการเพิ่มสิทธิ์ - passwd เสมอทำงานเป็นรากเพราะมันจะต้องแก้ไขไฟล์ว่ารากเท่านั้นที่ได้รับอนุญาตในการปรับเปลี่ยน สิ่งนี้ทำให้มีความสำคัญที่ไฟล์รหัสผ่านที่เรียกใช้งานได้นั้นไม่น่าจะมีแนวโน้มที่จะบัฟเฟอร์มากเกินไปเป็นต้นซึ่งผู้ใช้ทั่วไปที่ฉลาดอาจจะสามารถใช้งานได้ซึ่งไม่ได้ตั้งใจ

เหตุผลอีกประการหนึ่งคือการปกป้องผู้ใช้ในลักษณะเดียวกับที่คุณอาจใช้suหากคุณเข้าสู่ระบบในฐานะ root - เพื่อลดหรือ จำกัดสิทธิ์ของคุณสำหรับงานที่เฉพาะเจาะจงไม่เลื่อนระดับพวกเขา ตัวอย่างเช่นหากฉันได้รับอนุญาตให้เริ่มบริการ daemon ที่ไม่ต้องการเข้าถึงข้อมูลของฉันและมีเนื้อหาของตัวเองซึ่งเป็นสิ่งที่ต้องการ (เช่นตัวบันทึก) การรันมัน suid จะหมายความว่ามีเพียงการเข้าถึงเนื้อหานั้นเท่านั้น ไม่ใช่ของฉันหรือใครก็ตาม

โปรดทราบว่ามันเป็นไปได้ที่จะตั้ง uid โดยทางโปรแกรมแม้ว่า suid bit จะไม่ถูกตั้งค่าบน executableอย่างไรก็ตามมันจะไม่ทำงานสำหรับการเลื่อนระดับ นั่นคือถ้าคุณเป็นผู้ใช้ปกติและเขียนโปรแกรมที่ตั้งค่า uid ณ จุดหนึ่งโปรแกรมนั้นจะไม่สามารถเปลี่ยนเป็นรูทได้ Apache เชื่อในวิธีนี้ มันมักจะเริ่มต้นโดยรูทและมีกระบวนการหนึ่งที่จะให้เด็ก ๆ ซึ่งเปลี่ยน uid ให้กับผู้ใช้ที่ไม่ใช่ผู้มีสิทธิพิเศษ (เช่น "httpd") กระบวนการย่อยเหล่านั้นเป็นสิ่งที่เว็บเซิร์ฟเวอร์ทำงานจริง

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