ผู้ใช้ขั้นสูงสามารถเขียนลงในไฟล์แบบอ่านอย่างเดียวได้หรือไม่


11

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

$ touch f
$ chmod 400 f
$ ls -l f
-r--------  1 user  wheel  f
$ echo a >> t
t: Permission denied.

จนถึงตอนนี้ดีมาก ตอนนี้ฉันทำเช่นเดียวกับรูทและมันเขียนลงในไฟล์:

# ls -l f2
-r--------  1 root  wheel  f2
# echo a >> f2
# echo $?
0

มันเป็นข้อบกพร่องหรือพฤติกรรมที่ตั้งใจ? ฉันสามารถสันนิษฐานได้อย่างปลอดภัยว่าสิ่งนี้จะทำงานบน Unix & Linux หรือไม่


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

1
เหตุผลที่รูทต้องการให้สามารถเขียนไปยังไฟล์ได้เสมอคือเนื่องจากระบบไฟล์ยูนิกซ์แบบดั้งเดิม (ext4, zfs เป็นต้น) การอนุญาตไฟล์เป็นส่วนหนึ่งของไฟล์ ดังนั้นหากรูทไม่สามารถเขียนไปยังไฟล์ได้ NOBODY สามารถเขียนไฟล์แบบอ่านได้อย่างเดียวอีกครั้งเพราะchmodไม่สามารถเขียนลงไฟล์ได้
slebetman

1
@slebetman คุณไม่จำเป็นต้องมีสิทธิ์ในการเขียนไฟล์เพื่ออัปเดตการอนุญาต ลองtouch somefile; chmod 0000 somefile; chmod 0644 somefileเป็นผู้ใช้ปกติ
253751

@immibis: คุณเป็นเจ้าของ รูตจะต้องสามารถเปลี่ยนการอนุญาตไฟล์ที่ไม่ได้เป็นเจ้าของได้
2559

@slebetman ใช่ ... แต่คุณกำลังพูดถึงการเปลี่ยนการอนุญาตไฟล์ที่คุณไม่สามารถเขียนได้ไม่ใช่เกี่ยวกับการเปลี่ยนการอนุญาตไฟล์ที่คุณไม่ได้เป็นเจ้าของ
user253751

คำตอบ:


13

เป็นเรื่องปกติrootที่จะสามารถแทนที่สิทธิ์ในลักษณะนี้

อีกตัวอย่างหนึ่งคือrootความสามารถในการอ่านไฟล์ที่ไม่มีสิทธิ์การอ่าน:

$ echo hello > tst
$ chmod 0 tst
$ ls -l tst
---------- 1 sweh sweh 6 Aug 16 15:46 tst
$ cat tst
cat: tst: Permission denied
$ sudo cat tst
hello

บางระบบมีแนวคิดของไฟล์ที่ไม่เปลี่ยนรูป เช่นใน FreeBSD:

# ls -l tst
-rw-r--r--  1 sweh  sweh  6 Aug 16 15:50 tst
# chflags simmutable tst
# echo there >> tst
tst: Operation not permitted.

แม้ตอนนี้rootไม่สามารถเขียนไปยังไฟล์ แต่แน่นอนrootสามารถลบธง:

# chflags nosimmutable tst
# echo there >> tst
# cat tst
hello
there

ด้วย FreeBSD คุณสามารถไปอีกขั้นและตั้งค่าสถานะเคอร์เนลเพื่อป้องกันrootการลบค่าสถานะ:

# chflags simmutable tst
# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1
# chflags nosimmutable tst
chflags: tst: Operation not permitted

ตอนนี้ไม่มีใครไม่rootสามารถเปลี่ยนไฟล์นี้ได้

(ระบบต้องการการรีบูตเครื่องเพื่อลด securelevel)


ต้องรีบูตมาตรการรักษาความปลอดภัยที่มีประสิทธิภาพอย่างไร นอกจากนี้หากรูทเป็นรูทและสามารถทำอะไรได้ทำไมถึงต้องพยายามที่จะป้องกันไม่ให้รูททำในสิ่งที่รูตต้องการ
แมว

1
ในระบบที่ปลอดภัยรูตไม่เหมือนพระเจ้า FreeBSD securelevel เป็นความพยายามเพียงเล็กน้อยที่จะหยั่งรากพระเจ้าได้น้อยลง Securelevel สามารถตั้งค่าเริ่มต้นเป็น 1 ในการกำหนดค่าระบบเพื่อให้มันยังคงใช้งานได้แม้หลังจากรีบูต ดังนั้นมันต้องมีการเข้าถึงคอนโซลและโหมดผู้ใช้คนเดียวและเห็นได้ชัดว่ายุ่งมาก มีบทความทั้งหมดเกี่ยวกับการรักษาความปลอดภัยของ Unix ที่มากเกินไปสำหรับเขตข้อมูลความคิดเห็น SE แต่เรากำลังพยายามที่จะดำเนินการต่อจากโมเดล 'รูทมีการเข้าถึงทั้งหมด' เป็นสิ่งที่เหมาะสมยิ่งขึ้น เราพยายามบังคับใช้หากเป็นไปได้ (เช่น securelevel) และตรวจสอบในกรณีที่ไม่ (รีบูตหลักฐานเส้นทางการตรวจสอบ)
สตีเฟ่นแฮร์ริส

4
FWIW ใน Linux chattr +i tstตั้งค่าแอตทริบิวต์ที่ไม่เปลี่ยนรูป
Ruslan

3

ใช่มันเป็นเรื่องปกติมาก รูทไม่มีข้อ จำกัด ในการอ่าน / เขียน (ยกเว้นน้อยมาก) เพราะเขาเป็นรูต

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