ฉันจะทำให้ไฟล์ไม่สามารถแก้ไขได้อย่างไร


35

ในขณะที่เข้าสู่ระบบฉันสามารถทำสิ่งต่อไปนี้:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

จากนั้นฉันสามารถเปิดเป็นกลุ่ม (ไม่เป็นroot) แก้ไขbarบังคับให้เขียนด้วยw!และไฟล์จะถูกแก้ไข

ฉันจะทำให้ระบบปฏิบัติการไม่อนุญาตให้แก้ไขไฟล์ได้อย่างไร?

อัพเดท 02 มี.ค. 2560

  1. chmod 500 foo เป็นปลาเฮอริ่งแดง: สิทธิ์ในการเขียนในไดเรกทอรีไม่มีส่วนเกี่ยวข้องกับความสามารถในการปรับเปลี่ยนเนื้อหาของไฟล์ - เฉพาะความสามารถในการสร้างและลบไฟล์

  2. chmod 400 foo/barในความเป็นจริงจะป้องกันเนื้อหาของไฟล์จากการเปลี่ยนแปลง แต่ไม่ได้ป้องกันการอนุญาตของไฟล์จากการเปลี่ยนแปลง - เจ้าของไฟล์สามารถเปลี่ยนแปลงการอนุญาตของไฟล์ได้ตลอดเวลา (สมมติว่าพวกเขาสามารถเข้าถึงไฟล์ได้เช่นเรียกใช้งานการอนุญาตในไดเรกทอรีบรรพบุรุษทั้งหมด) ในความเป็นจริง strace (1) แสดงให้เห็นว่านี่คือสิ่งที่กลุ่ม (7.4.576 Debian Jessie) กำลังทำอยู่ - vim เรียก chmod (2) เพื่อเพิ่มสิทธิ์การเขียนสำหรับเจ้าของไฟล์ชั่วคราวแก้ไขไฟล์แล้วเรียก chmod ( 2) อีกครั้งเพื่อลบสิทธิ์การเขียน นั่นคือเหตุผลที่ใช้chattr +iงาน - เฉพาะ root เท่านั้นที่สามารถโทรchattr -iได้ ในทางทฤษฎีเป็นกลุ่ม (หรือโปรแกรมใด ๆ ) สามารถทำสิ่งเดียวกันกับ chattr เช่นเดียวกับ chmod ในไฟล์ที่ไม่เปลี่ยนรูปถ้าเรียกใช้เป็นราก


3
ฉันเชื่อภายใต้ประทุนvimคือการเปลี่ยนการอนุญาตจากนั้นนำกลับคืนมา
jordanm

คุณไม่ได้ทำงานในฐานะroot?
Alvin Wong

อัลวินฉันทำสิ่งนี้ในฐานะผู้ใช้ที่ไม่ใช่รูท ฉันได้แก้ไขโพสต์เพื่อชี้แจง
user2141130

คำตอบ:


49

คุณสามารถตั้งค่าแอตทริบิวต์ "ไม่เปลี่ยนรูป" กับระบบไฟล์ส่วนใหญ่ใน Linux

chattr +i foo/bar

หากต้องการลบแอตทริบิวต์ที่ไม่เปลี่ยนรูปแบบคุณใช้-แทน+:

chattr -i foo/bar

หากต้องการดูแอตทริบิวต์ปัจจุบันของไฟล์คุณสามารถใช้ lsattr:

lsattr foo/bar

chattr (1) manpage ให้รายละเอียดของคุณลักษณะทั้งหมดที่มีอยู่ นี่คือคำอธิบายสำหรับi:

   A  file with the `i' attribute cannot be modified: it cannot be deleted
   or renamed, no link can be created to this file  and  no  data  can  be
   written  to  the  file.  Only the superuser or a process possessing the
   CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

3
บน Linux ธงว่าไม่เปลี่ยนรูปที่มีอยู่ในระบบไฟล์จำนวนมากไม่เพียง ext2 / 3/4 (ที่ btrfs น้อย hfsplus, jfs, nilfs2, XFS, ocfs2, ubifs, gfs2, ReiserFS AFAICT จากดูอย่างรวดเร็วผ่านรหัส)
Stéphane Chazelas

@StephaneChazelas ฉันเห็นchattrคำสั่งเป็นส่วนหนึ่งของe2fsprogsแพ็คเกจในระบบของฉัน นั่นคือเหตุผลที่ฉันทำคำแถลงนั้น ฉันได้อัปเดตคำตอบตามความคิดเห็นของคุณแล้ว
จอร์แดน

มันไม่ทำงานสำหรับ symlinks :-( การแก้ปัญหานี้จะดีเพราะผมต้องการที่จะหลีกเลี่ยงที่ symlink สามารถ. ตั้งใจแก้ไขโดยผู้ใช้ใด ๆ รวมทั้งราก.
natenho

ไม่เปลี่ยนรูปเป็น inode flag ถูกต้องไม่ใช่ xattr? ioctl flag จะแม่นยำไหม?
ytpillai

1

คุณสามารถ:

  1. เปลี่ยนเจ้าของไฟล์เป็นrootหรือผู้ใช้ที่สร้างขึ้นใหม่
  2. เก็บกลุ่มที่ถูกต้อง
  3. ใช้chmod 440เพื่ออนุญาตให้อ่านเป็นกลุ่ม (ซึ่งก็คือคุณ)

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


3
หากคุณสามารถเขียนไปยังไดเรกทอรีหลักจากนั้นกลุ่มสามารถลบไฟล์และสร้างใหม่ (และมันเป็นสิ่งที่มันทำเมื่อคุณ:w!) เป็นกลุ่มไม่ได้ไปไกลเท่าที่การเปลี่ยนแปลงการอนุญาตของไดเรกทอรีชั่วคราวว่า ดังนั้นการรักษาไดเรกทอรีที่ไม่สามารถเขียนได้ควรมีความปลอดภัย
Stéphane Chazelas

0

วิธีสร้างแผนผังไดเรกทอรีทั้งแบบอ่านอย่างเดียว:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

เพื่อให้อ่านอีกครั้งการเปลี่ยนแปลงไป+i-i

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