ทำไม rm อนุญาตให้ลบไฟล์ภายใต้ความเป็นเจ้าของของผู้ใช้คนอื่น?


52

จากการโพสต์ทำไม rm สามารถลบไฟล์แบบอ่านอย่างเดียวได้? ฉันเข้าใจว่าrmต้องมีสิทธิ์เขียนในไดเรกทอรีเพื่อลบไฟล์ แต่ฉันพบว่ามันยากที่จะแยกแยะพฤติกรรมที่เราสามารถลบไฟล์ที่เจ้าของและกลุ่มต่าง ๆ ได้อย่างง่ายดาย

ฉันพยายามต่อไปนี้

mtk: ชื่อผู้ใช้ของฉัน
abc: สร้างผู้ใช้ใหม่

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

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

คำตอบ:


100

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

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


สถานการณ์ต่อไปนี้อาจทำให้รู้สึกสะดวกสบายมากขึ้น? สมมติว่ามีไดเรกทอรี:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

และมีไฟล์ที่ฉันเป็นเจ้าของและมีลิงก์สองฮาร์ด:

/home/me/myfile
/home/you/myfile

ไม่เป็นไรว่าฮาร์ดลิงก์/home/you/myfileนั้นมาถึงที่นั่นตั้งแต่แรกแล้ว อาจจะrootใส่ไว้ที่นั่น

/home/you/myfileความคิดของตัวอย่างนี้คือการที่คุณควรจะได้รับอนุญาตให้ลบการเชื่อมโยงอย่างหนัก ท้ายที่สุดมันทำให้ไดเรกทอรีของคุณรก คุณ/home/youควรจะสามารถควบคุมสิ่งที่ทำและไม่ได้อยู่ภายใน และเมื่อคุณลบ/home/you/myfileโปรดสังเกตว่าคุณยังไม่ได้ลบไฟล์จริงๆ คุณได้ลบลิงก์หนึ่งลิงก์ออกไปเท่านั้น


โปรดทราบว่าหากมีการตั้งค่าบิตเหนียวในไดเรกทอรีที่มีไฟล์ (แสดงtในls) คุณจะต้องเป็นเจ้าของไฟล์เพื่อให้สามารถลบได้ (เว้นแต่คุณเป็นเจ้าของไดเรกทอรี) bit /tmpเหนียวมักจะตั้งอยู่บน


6
ด้วยหมุดเล็ก ๆ น้อย ๆ ในไดเรกทอรีคุณจะต้องสามารถแก้ไขไฟล์เพื่อให้สามารถลบออกได้ กล่าวคือถ้าไฟล์นั้นเป็นของคนอื่นในกลุ่มเดียวกันกับคุณและกลุ่มนั้นอาจเขียนลงไฟล์คุณสามารถลบไฟล์นั้นออกได้ ข้อสรุป: ทุกคนสามารถลบไฟล์ที่มีสิทธิ์การเขียนแบบสาธารณะ (ทุกวิชาสามารถปรับเปลี่ยนไดเรกทอรีได้)
Jonathan Leffler

1
ฉันอาจตีความคุณผิด แต่คุณไม่ได้พูดแล้วหรือว่าฉันสามารถลบออก-rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/fooในฐานะผู้ใช้ทั่วไปของฉัน ( /tmpเหนียว) เพราะฉันได้รับอนุญาตให้เขียนมัน? แต่ฉันไม่สามารถ
Celada

4
ฉันเชื่อว่าสถานการณ์me/ youมาเน้นชัดเจนถ้าคุณตั้งสมมติฐานว่าผู้ใช้ (คนที่ไม่ได้เป็นเจ้าของไฟล์) สร้างลิงค์ คำสรรพนามใช้งานยาก สมมติว่าอัลสร้าง/home/al/file1และบ๊อบที่มีการดำเนินการ (และอาจจะอ่าน) การเข้าถึงฮาร์ดลิงค์ไฟล์ไปยัง/home/al /home/bob/als_fileบ๊อบควรป้องกันไม่ให้ลบลิงก์ที่เขาสร้างขึ้นหรือ   และควรได้รับอนุญาตให้ลบ (ยกเลิกการเชื่อมโยง) /home/bob/als_fileเมื่อเขาไม่มีสิทธิ์เข้าถึงเพื่อเขียน/home/bob? ถนนสายนี้นำไปสู่ความวุ่นวาย
สกอตต์

2
@JonathanLeffler: ตัวอย่างของ Scott แสดงให้เห็นว่าไม่มีการยกเลิกการเชื่อมโยงและการตัดทอนไม่ได้มีผลประกอบการที่เหมือนกันเมื่อมีการเชื่อมโยงอย่างหนักในการเล่น
Kevin

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

9

ในการลบไฟล์คุณเพียงแค่ต้องสามารถเขียนไปยังไดเรกทอรีที่ไฟล์นั้นมีอยู่

หากคุณไม่ชอบสิ่งนี้คุณสามารถตั้งค่าบิต "เหนียว" chmod +t dirหากคุณใช้ระบบปฏิบัติการล่าสุดเมื่อไม่นานมานี้ (ฟีเจอร์นี้ได้รับการแนะนำในปี 1986 ใน SunOS)

ถ้าคุณชอบที่จะละเอียดยิ่งขึ้นคุณต้องมีระบบไฟล์ที่มี ACL implementaion ที่ทันสมัยเช่น ZFS NFSv4 ACLs มาตรฐานที่ใช้ NTFS รวมถึงการสนับสนุนการอนุญาตการลบเฉพาะไฟล์ต่อผู้ใช้และการอนุญาต "delete_child" สำหรับไดเรกทอรี


9
โปรดทราบว่าในการเพิ่มtบิตคุณจะต้องเป็นเจ้าของไดเรกทอรี และถ้าคุณเป็นเจ้าของไดเรกทอรีคุณสามารถลบไฟล์ได้ทุกเมื่อไม่ว่าtบิตจะถูกตั้งค่าหรือไม่ก็ตาม หากคุณลิงก์ไฟล์ไปยังไดเรกทอรีของบุคคลอื่นคุณควรเตรียมพร้อมให้บุคคลอื่นสามารถลบไฟล์ได้ อีกทางเลือกหนึ่งคือสร้าง sub-dir ของคุณและเพิ่มไฟล์ของคุณที่นั่นแทนเนื่องจากเจ้าของจะไม่สามารถลบ subdir นั้นได้ถ้ามันว่างเปล่า
Stéphane Chazelas

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

0

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

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