ทำไม setuid ถูกเพิกเฉยในไดเรกทอรี?


19

บนระบบ Linux คุณสามารถประสบความสำเร็จchmod u+s $some_directoryแต่แทนที่จะบังคับให้ความเป็นเจ้าของไดเรกทอรีย่อยและไฟล์ใหม่ให้เป็นเจ้าของไดเรกทอรีที่มี (และการตั้งค่าไดเรกทอรีย่อยu+sเช่นกัน) ตามที่คุณคาดหวังระบบจะละเว้นบิต setuid ไดเร็กทอรีย่อยและไฟล์จะยังคงสืบทอด UID ของกระบวนการสร้างของตนต่อไปและไดเรกทอรีย่อยจะไม่ถูกตั้งค่าตามค่าเริ่มต้น

ทำไม setuid ถูกเพิกเฉยในไดเรกทอรีและฉันจะทำให้ระบบรับรู้ได้อย่างไร?


ฉันสงสัยว่าตัวเลือกการเมานต์ "nosuid" จะมีผลกับสิ่งนี้หรือไม่
Heptite

ระบบไฟล์ที่สงสัยไม่ได้ถูกติดตั้งด้วยnosuid- แม้ว่าจะมีอีกระบบหนึ่ง (ramdisk /dev/shm) ซึ่ง / เป็น / เมานnosuidต์และดูเหมือนว่าจะจัดการsetuidบิตในลักษณะเดียวกัน 6_9
แบล็กไลท์ส่องแสง

1
ดูเพิ่มเติมที่: serverfault.com/questions/371541/…
jjlin

2
สำหรับการนำไปใช้นั้นซอร์สโค้ดของ Linux นั้นพร้อมใช้งานอย่าลังเลที่จะใช้คุณลักษณะนี้ เนื่องจากมีอยู่ใน FreeBSD อยู่แล้วคุณจึงสามารถคัดลอกรหัสได้อย่างง่ายดาย แน่นอนบิตเหล่านั้นยังคงไม่มีความหมายในระบบ Linux ของผู้อื่น
mikebabcock

คำตอบ:


16

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

บิตเหล่านี้ไม่มีฟังก์ชั่นในไฟล์ธรรมดาที่ไม่สามารถเรียกใช้งานได้ (และเชลล์สคริปต์ใน distros บางอันเนื่องจากปัญหาด้านความปลอดภัย) แต่เดิมพวกเขาไม่มีฟังก์ชั่นสำหรับไดเรกทอรี เห็นได้ชัดว่ามีใครบางคนตัดสินใจว่าจะเจ๋งที่จะใช้ setgid ที่ไม่ได้ใช้ในไดเรกทอรีและใช้มันเพื่อบังคับใช้ความมั่นคงในการเป็นเจ้าของกลุ่ม ท้ายที่สุดถ้าคุณเล่นด้วยความเป็นเจ้าของกลุ่มก็เป็นเพราะมีมากกว่าหนึ่งคนทำงานกับไฟล์และมันอาจสมเหตุสมผลสำหรับไฟล์ทั้งหมดในไดเรกทอรีที่กำหนดให้เป็นของกลุ่มเดียวกันไม่ว่าใครจะสร้างพวกเขา ความยุ่งยากเนื่องจากมีคนลืมที่จะเรียกใช้ newgrp จะถูกกำจัด

ดังนั้นทำไมไม่ใช้คุณสมบัติเดียวกันสำหรับ setuid และไฟล์ uid เอ่อมันเป็นพื้นฐานมากกว่า gid หากคุณใช้สิ่งนี้บ่อยครั้งไฟล์จะไม่เป็นของผู้ใช้ที่สร้างมันขึ้นมา! ผู้ใช้ยังคงสามารถแก้ไขไฟล์ได้ (สมมติว่า umask เป็นสิ่งที่มีเหตุผล) แต่พวกเขาไม่สามารถเปลี่ยนบิตสิทธิ์ได้ ยากที่จะเห็นประโยชน์ของมัน


ฉันต้องการให้มีการใช้งานถ้าเพียงเพราะความสอดคล้องของ ... X3 ไม่ว่าในกรณีใดวิธีแก้ปัญหาเช่น cronjob ที่จะผ่านเป็นระยะและเปลี่ยนความเป็นเจ้าของ / เป็น / มีวิธีใดที่จะบังคับให้เจ้าของไฟล์?
Blacklight Shining

4
ฉันอยากจะอ้าง Emerson เกี่ยวกับความโง่เขลา ก่อนที่คุณจะสามารถโน้มน้าวฉันได้ว่ามันเป็นคุณสมบัติที่พึงประสงค์คุณจะต้องแสดงกรณีการใช้งานที่เหมาะสม
Isaac Rabinovitch

1
FreeBSD chmod (2)มีการพูดคุยเกี่ยวกับเรื่องนี้ แต่กล่าวถึงเพียงว่าไม่ควรใช้โดยทั่วไปเนื่องจาก "ช่องโหว่ความปลอดภัย" ที่ไม่ระบุ ฉันสงสัยอื่น ๆ ส่วนใหญ่ Unixes ไม่ได้นำมาใช้คุณลักษณะนี้เพราะในขณะที่มันจะมีกรณีการใช้งานบางอย่างก็ไม่ได้ว่ามีประโยชน์ชะมัด
jjlin

1
"ยากที่จะเห็นยูทิลิตี้ของที่" -> ตั้งค่าไว้ในโฮมไดเร็กตอรี, ดังนั้นสคริปท์สคริปต์ทำงานในฐานะรูทไม่สามารถลืมบางสิ่งโดยบังเอิญ?
ufotds

1
การเรียกใช้สคริปต์ superuser ในไดเรกทอรีบ้านของคุณเป็นแนวคิดที่ไม่ดีจริงๆ
Isaac Rabinovitch

7

ฉันเชื่อว่าคำตอบสำหรับคำถามนี้มีประเด็นเกี่ยวกับความปลอดภัยของ "ไฟล์แจก" ที่ส่งผลให้ระบบปฏิบัติการ Unix ที่มีลักษณะคล้าย Unix ไม่ยอมให้มี "file giveaway" "ไฟล์แจก" คือเมื่อผู้ใช้ที่ไม่ใช่ผู้ใช้ superuser เปลี่ยนความเป็นเจ้าของไฟล์ให้กับบุคคลอื่นที่ไม่ใช่ผู้ใช้นั้น ความสามารถนี้ให้โอกาสมากมายสำหรับความเสียหาย

เนื่องจากไฟล์แจกไม่ได้รับอนุญาต setuid ในไดเรกทอรีซึ่งจะทำหน้าที่เดียวกันในรูปแบบอื่นไม่ได้รับอนุญาตหรือไม่สนใจถ้าตั้งค่า

ในการเปลี่ยนพฤติกรรมคุณจะต้องแก้ไขไลบรารี OS และยูทิลิตี้


2

กรณีการใช้งานที่ดีมากอย่างหนึ่งสำหรับการนำไปใช้งานคือ:

สมมติว่าคุณมีเซิร์ฟเวอร์หลายไซต์พร้อมไซต์ที่ปลอดภัย 3 แห่ง คุณมี 3 กลุ่มที่สร้างขึ้นหนึ่งกลุ่มสำหรับผู้ดูแลไซต์ที่แตกต่างกัน ไฟล์ทั้งหมดในเว็บไซต์ทั้งหมดจะต้องเป็นของผู้ใช้ apache เพื่อให้ apache สามารถอ่านและเขียนไฟล์เหล่านั้นได้ (drupal / wordpress, ฯลฯ )

ถ้า setuid แต่ทำงานเหมือนเซทบิตของสิทธิ์การอนุญาตไดเรกทอรีจะมีลักษณะดังนี้:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

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

กรณีการใช้งานอื่นนั้นใช้สำหรับการอัพโหลดแบบไม่ระบุชื่อ ftp / http หรือแม้กระทั่ง sftp / ssh กลุ่มและ GID ในไดเรกทอรีอัปโหลดจะเป็นรูทดังนั้นเจ้าของและ UID จะเป็นเช่นนั้น สิทธิ์อื่น ๆ -wxจะเป็น สิ่งนี้จะช่วยให้ทุกคนเข้าถึง WRITE ได้ในไดเรกทอรีการอัปโหลด แต่พวกเขาไม่สามารถอ่านอะไรเลยเมื่อถูกอัพโหลดและรูทจะเป็นเจ้าของไฟล์ทั้งหมดที่สร้างขึ้นใหม่

ดังนั้นจึงมีสองกรณีการใช้งานที่ดีและถูกต้องสำหรับการเปิดใช้งานฟังก์ชั่น UID ในไดเรกทอรีเพื่อให้ตรงกับบิต GID

สตีเวน Mercurio


1
ดูเหมือนว่าไม่ได้ตอบคำถามที่ถูกถาม
Kevin Panko

2
@KevinPanko ไม่ไม่ตอบคำถามของฉัน อาจเป็นเรื่องนอกไซต์ (“ กรณีการใช้งาน<nonexistent feature X>คืออะไร?”) อย่างไรก็ตามมันเกี่ยวข้องกับคำถามของฉันและฉันในฐานะผู้ถามพบว่ามีประโยชน์
แบล็กไลท์ส่องแสง

0

สายไปงานเลี้ยงเล็กน้อย แต่ในกรณีที่ผู้อ่านในอนาคตสะดุดกับเรื่องนี้;) ตามที่ผู้อื่นกล่าวไว้ในระบบไฟล์ OS-X มาตรฐาน setUID สำหรับไดเรกทอรีจะถูกเพิกเฉย - และดูเหมือนจะไม่มีวิธีง่ายๆในเรื่องนี้ ( mount -o.... หรืออะไรไม่) บ่อยครั้งที่ man page จริง ๆ แล้วไม่สอดคล้องกับพฤติกรรม OS-X ที่ระบุ:

4000 (บิต set-user-ID-on-execution) [... ] ไดเรกทอรีที่มีชุด set-user-id bit จะบังคับให้ไฟล์และไดเรกทอรีย่อยทั้งหมดที่สร้างขึ้นในนั้นเป็นเจ้าของโดยเจ้าของไดเรกทอรีไม่ใช่ uid ของกระบวนการสร้าง [... ]

แต่ยังแสดงถึงความเป็นไปได้ที่จะได้รับผลกระทบแบบเดียวกันโดยไม่ต้องให้กรรมสิทธิ์ดั้งเดิม Linux ใช้ '[g /] setfacls' เพื่อเอฟเฟกต์ที่คล้ายกัน (พวกมันไม่ได้รับอนุญาตให้มองเห็นได้อย่างรวดเร็วในบางครั้งดังนั้นบางครั้งอาจสร้างความรำคาญ)

ในส่วนของ 'ฉันจะบรรลุเอฟเฟ็กต์ที่คล้ายกันได้อย่างไร' ให้อ่าน man page และซอกับ:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

คุณสามารถตรวจสอบผ่าน

ls -le

ถ้าทุกอย่างดูดี ตัวเลือกเพิ่มเติมรวมถึงการแทรกกฎที่ตำแหน่งเฉพาะการลบหรือแทนที่กฎเฉพาะ ตัวเลือกสำคัญสองอย่างที่นี่คือ " file_inheritและdirectory_inherit" อนุญาตให้แนบกฎกับไดเรกทอรี / ไฟล์ใหม่

ฉันไม่ชอบการใช้ setUID แต่ setGID มีประโยชน์มากใน fileservers เพียงตั้งกลุ่ม 'main' ไม่ทำงานหรือไคลเอนต์มี filemasks ไม่อนุญาตให้เขียนกลุ่ม ที่จะแก้ไขได้โดย:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup

ยินดีต้อนรับสู่ Stack Exchange! นี่เป็นคำตอบที่ดีแม้ว่าจะเกี่ยวข้องกับ OS X มากกว่า Linux distros (ซึ่งตามที่คุณกล่าวไว้ให้ใช้ระบบ ACL ที่แตกต่างกัน) แต่ดูเหมือนว่ามันจะไม่เกี่ยวข้องกันเท่านี้ แน่นอนว่าจะเป็นคำถามที่ดีเกี่ยวกับวิธีสร้างไดเรกทอรีOS X honor setuid บางทีคุณอาจจะโพสต์หนึ่ง ?
แบล็กไลท์ส่องแสง

อย่างไรก็ตามบิตที่คุณออกจากหน้าคู่มือของ OS X บนchownนั้นจริง ๆ แล้วค่อนข้างสำคัญ! “ […] ถ้าระบบไฟล์ที่รองรับรองรับคุณสมบัตินี้: ดู chmod (2) และตัวเลือกsuiddirเพื่อทำการเมานต์ (8)” จริง ๆ แล้วฉันไม่เคยสังเกตเห็นมาก่อนเลย หาก HFS ใช้งานsuiddirคุณสามารถทำให้สิ่งนี้เกิดขึ้นได้ในระบบ OS X ทั่วไป
แบล็กไลท์ส่องแสง

(และ OS X ACL เป็นเพียง“ ไม่สามารถมองเห็นได้อย่างชัดเจนในตอนแรก” เหมือนกับ Linux ACLs)
Blacklight Shining

0

มันควรจะเคารพมาตรฐาน ฉันสามารถคิดเกี่ยวกับ Scenaries บางอย่างด้วย sftp-only ซึ่งมันจะช่วยให้ฉันมีปัญหาได้มากมายทั้งกับ acl's และ acl-mask-set ที่ sshd ทำและการรีเซ็ตที่ฉันต้องทำกับหน้ากากนั้น

การรักษาความปลอดภัยโดยค่าเริ่มต้นนั้นค่อนข้างมีประโยชน์ แต่ถ้าคุณไม่เลือกเป็นตัวเลือกคุณแค่สร้าง winghtmare

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

ไม่ว่าจะด้วยวิธีใดก็ตามมันเป็นไปตามที่ลินุกซ์ใช้ดังนั้นเพียงแค่ใช้ acl เพื่อแก้ไขสิ่งเหล่านั้น


-1

อ้างอิงจากhttp://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directoriesบิต setuid จะถูกข้ามสำหรับไดเรกทอรีในระบบ UNIX และ Linux เป็นไปได้ที่จะทำให้มันทำตามที่คุณคาดหวังบน FreeBSD


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

ดูเหมือนว่าชัดเจนว่ามันถูกละเว้นบน Linux เพราะมันถูกละเว้นบน Unix ซึ่งทำให้พฤติกรรมที่ถูกต้องสำหรับ Linux เพื่อให้สอดคล้องกับ * nix จริง อย่าลังเลที่จะอ่านบทความที่เป็นปัญหา คำตอบเดียวกันที่greenend.org.uk/rjk/tech/perms.htmlจากปี 2004 และซ้ำซ้อนกับserverfault.com/questions/371541/…
mikebabcock

ดังนั้นทำไมมันถึงไม่สนใจระบบปฏิบัติการยูนิกซ์?
Isaac Rabinovitch

@IsaacRabinovitch เนื่องจาก Blacklight ทำให้คำถามชัดเจนเกี่ยวกับ Linux นั่นไม่เกี่ยวข้องกับ [ลิ้นในแก้ม] แต่ฉันสงสัยว่ามันเป็นพฤติกรรมที่ไม่ได้กำหนดไว้อย่างชัดเจนซึ่ง Unixes หลายตัวทำสิ่งที่แตกต่างกับมันและไม่ทำอะไรเลย
mikebabcock

คำถาม / เป็น / ติดแท็กlinuxใช่ แต่นั่นไม่ได้หมายความว่าฉันจะชอบคลุมเครือ“ มันทำแบบนี้เพราะระบบอื่นทำแบบนี้” ตอบคำถามที่อธิบายว่าทำไมมันถึงทำแบบนั้นกับระบบอื่น (อาจlinuxจะลบแท็กได้ง่าย ๆ ?)
Blacklight Shining
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.