วิธีใช้คำสั่ง chattr บน Linux

เผยแพร่แล้ว: 2022-06-28
เทอร์มินัล Linux บนพื้นหลังแล็ปท็อปสีแดง
fatmawati achmad zaenuri/Shutterstock

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

สิทธิ์และคุณสมบัติ

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

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

วิธีใช้คำสั่ง chmod บน Linux
วิธีใช้คำสั่ง chmod บน Linux

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

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

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

ทุกสิ่งที่คุณอยากรู้เกี่ยวกับ inodes บน Linux
ที่เกี่ยวข้อง ทุกสิ่งที่คุณอยากรู้เกี่ยวกับ inodes บน Linux

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

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

การดูคุณสมบัติของไฟล์

คำสั่ง chattr และ lsattr จะแสดงอยู่ในคอมพิวเตอร์ของคุณแล้ว คุณจึงไม่จำเป็นต้องติดตั้งอะไรอีก

ในการตรวจสอบแอ็ตทริบิวต์บนไฟล์ในไดเร็กทอรีปัจจุบัน ให้ใช้ lsattr :

 lsattr 

การแสดงรายการแอ็ตทริบิวต์ไฟล์สำหรับไฟล์ทั้งหมดในไดเร็กทอรี

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

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

นี่คือรายการของแอตทริบิวต์ที่ใช้บ่อยที่สุด

  • a : ต่อท้ายเท่านั้น ไฟล์ที่มีแอตทริบิวต์นี้สามารถต่อท้ายได้เท่านั้น ยังสามารถเขียนได้ แต่เฉพาะที่ส่วนท้ายของไฟล์เท่านั้น ไม่สามารถเขียนทับข้อมูลที่มีอยู่ภายในไฟล์ได้
  • : บีบอัด ไฟล์จะถูกบีบอัดโดยอัตโนมัติบนฮาร์ดไดรฟ์และไม่บีบอัดเมื่ออ่าน ข้อมูลที่เขียนไปยังไฟล์จะถูกบีบอัดก่อนที่จะเขียนไปยังฮาร์ดไดรฟ์
  • A : ไม่มีการอัพเดท atime atime คือค่าใน inode ที่บันทึกครั้งสุดท้ายที่มีการเข้าถึงไฟล์
  • C : ไม่มีการคัดลอกเมื่อเขียน ถ้าสองโปรเซสร้องขอการเข้าถึงไฟล์ พวกเขาจะได้รับพอยน์เตอร์ไปยังไฟล์เดียวกันได้ พวกเขาจะได้รับสำเนาเฉพาะของไฟล์เท่านั้นหากพวกเขาพยายามเขียนไปยังไฟล์ ซึ่งทำให้กระบวนการนั้นไม่ซ้ำกัน
  • d : ไม่มีการถ่ายโอนข้อมูล คำสั่ง Linux dump ใช้เพื่อเขียนสำเนาของระบบไฟล์ทั้งหมดไปยังสื่อสำรอง แอตทริบิวต์นี้ทำให้ dump ไม่สนใจไฟล์ มันถูกแยกออกจากการสำรองข้อมูล
  • D : อัพเดตไดเร็กทอรีซิงโครนัส เมื่อเปิดใช้งานแอตทริบิวต์นี้สำหรับไดเร็กทอรี การเปลี่ยนแปลงทั้งหมดในไดเร็กทอรีนั้นจะถูกเขียนแบบซิงโครนัสซึ่งก็คือทันทีบนฮาร์ดไดรฟ์ การดำเนินการข้อมูลสามารถบัฟเฟอร์ได้
  • e : รูปแบบขอบเขต แอตทริบิวต์ e ระบุว่าระบบไฟล์กำลังใช้ขอบเขตเพื่อแมปตำแหน่งของไฟล์บนฮาร์ดไดรฟ์ คุณไม่สามารถเปลี่ยนแปลงสิ่งนี้ด้วย chattr เป็นหน้าที่ของการทำงานของระบบไฟล์
  • ฉัน : ไม่เปลี่ยนรูป ไฟล์ที่ไม่เปลี่ยนรูปไม่สามารถแก้ไขได้ รวมถึงการเปลี่ยนชื่อและการลบ ผู้ใช้รูทเป็นคนเดียวที่สามารถตั้งค่าหรือยกเลิกการตั้งค่าแอตทริบิวต์นี้ได้
  • s : การลบอย่างปลอดภัย เมื่อไฟล์ที่มีชุดแอตทริบิวต์นี้ถูกลบ บล็อกฮาร์ดไดรฟ์ที่เก็บข้อมูลไฟล์จะถูกเขียนทับด้วยไบต์ที่มีศูนย์ โปรดทราบว่าระบบไฟล์ ext4 ไม่ได้รับเกียรตินี้
  • S : การอัปเดตแบบซิงโครนัส การเปลี่ยนแปลงในไฟล์ที่มีชุดแอ็ตทริบิวต์ S จะถูกเขียนลงในไฟล์แบบซิงโครนัส
  • u : การลบไฟล์ที่มีชุดแอตทริบิวต์ u ทำให้เกิดสำเนาของไฟล์ ซึ่งจะเป็นประโยชน์ต่อการกู้คืนไฟล์หากไฟล์ถูกลบด้วยความผิดพลาด

การเปลี่ยนคุณสมบัติของไฟล์

คำสั่ง chattr ช่วยให้เราเปลี่ยนแอตทริบิวต์ของไฟล์หรือไดเร็กทอรี เราสามารถใช้ตัวดำเนินการ + (set) และ - (unset) เพื่อใช้หรือลบแอตทริบิวต์ ซึ่งคล้ายกับคำสั่ง chmod และการอนุญาต

คำสั่ง chattr ยังมีตัวดำเนินการ = (set only) ซึ่งจะตั้งค่าแอตทริบิวต์ของไฟล์หรือไดเร็กทอรีเป็นแอตทริบิวต์ที่ระบุไว้ในคำสั่งเท่านั้น นั่นคือ แอตทริบิวต์ทั้งหมดที่ ไม่ อยู่ในบรรทัดคำสั่งจะไม่ ตั้งค่า

การตั้งค่าแอตทริบิวต์ต่อท้ายเท่านั้น

มาตั้งค่าแอตทริบิวต์ append-only ในไฟล์ข้อความกัน และดูว่ามันส่งผลต่อสิ่งที่เราสามารถทำได้กับไฟล์อย่างไร

 sudo chattr +a text-file.txt 

การตั้งค่าแอ็ตทริบิวต์ append only ในไฟล์ข้อความ

เราสามารถตรวจสอบเพื่อดูว่ามีการตั้งค่าบิตต่อท้ายเท่านั้นโดยใช้ lsattr :

 lsattr text-file.txt 

การแสดงรายการแอตทริบิวต์สำหรับไฟล์ข้อความ

ตัวอักษร “ a ” หมายถึงมีการตั้งค่าแอตทริบิวต์แล้ว เรามาลองเขียนทับไฟล์กัน การเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ที่มีวงเล็บมุมเดียว “ > ” จะแทนที่เนื้อหาทั้งหมดในไฟล์ด้วยเอาต์พุตที่เปลี่ยนเส้นทาง

เราได้โหลดไฟล์ข้อความไว้ล่วงหน้าด้วยข้อความตัวยึดตำแหน่ง lorem ipsum

 cat text-file.txt 

ข้อความตัวยึดตำแหน่งในไฟล์ข้อความ

เราจะเปลี่ยนเส้นทางผลลัพธ์จาก ls ไปยังไฟล์:

 ls -l > text-file.txt
 sudo ls -l > text-file.txt 

กำลังพยายามเขียนทับไฟล์ข้อความต่อท้ายเท่านั้น

ไม่อนุญาตให้ดำเนินการ แม้ว่าเราจะใช้คำสั่ง sudo

หากเราใช้วงเล็บมุมสองอัน “ >> ” เพื่อเปลี่ยนเส้นทางเอาต์พุต จะถูกผนวกเข้ากับข้อมูลที่มีอยู่ในไฟล์ ซึ่งควรเป็นที่ยอมรับในไฟล์ข้อความต่อท้ายเท่านั้นของเรา

 sudo ls -l >> text-file.txt 

การเปลี่ยนเส้นทางเอาต์พุตไปยังจุดสิ้นสุดของไฟล์ข้อความ

เรากลับไปที่พรอมต์คำสั่งโดยไม่มีข้อความแสดงข้อผิดพลาด เรามาดูภายในไฟล์เพื่อดูว่าเกิดอะไรขึ้น

 cat text-file.txt 

การตรวจสอบเนื้อหาของไฟล์ข้อความ

เพิ่มเอาต์พุตที่เปลี่ยนเส้นทางจาก ls ที่ส่วนท้ายของไฟล์

ข้อมูลใหม่ที่ผนวกเข้ากับไฟล์ข้อความต่อท้ายเท่านั้น

แม้ว่าเราสามารถผนวกข้อมูลเข้ากับไฟล์ได้ นั่นเป็นสิ่งเดียวที่เราทำได้ เราไม่สามารถลบมันและไม่สามารถรูทได้

 rm text-file.txt
 sudo rm text-file.txt 

ไม่สามารถลบไฟล์ข้อความต่อท้ายเท่านั้น

การตั้งค่าแอตทริบิวต์ที่ไม่เปลี่ยนรูป

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

 sudo chattr +i second-file.txt
 lsattr second-file.txt 

การตั้งค่าแอตทริบิวต์ที่ไม่เปลี่ยนรูปในไฟล์ข้อความ

เราจะเห็น “ i ” แสดงว่ามีการตั้งค่าแอตทริบิวต์ที่ไม่เปลี่ยนรูปแล้ว เนื่องจากทำให้ไฟล์ของเราไม่เปลี่ยนรูปแบบ แม้แต่ผู้ใช้รูทก็ไม่สามารถเปลี่ยนชื่อไฟล์ได้ ( mv ) ลบไฟล์ ( rm ) หรือเพิ่มข้อมูลเข้าไป

 sudo mv second-file.txt new-name.txt
 sudo rm second-file.txt
 sudo ls -l >> second-file.txt 

ไฟล์ที่ไม่เปลี่ยนรูปที่ต่อต้านการเปลี่ยนแปลง

อย่าพึ่งการลบอย่างปลอดภัยใน ext4

ดังที่เราได้กล่าวไปแล้ว ระบบปฏิบัติการบางระบบไม่สนับสนุนคุณลักษณะทั้งหมด แอ็ตทริบิวต์การลบที่ปลอดภัยไม่ได้รับการรองรับโดยตระกูล ext ของระบบไฟล์ ซึ่งรวมถึง ext4 อย่าพึ่งพาสิ่งนี้สำหรับการลบไฟล์อย่างปลอดภัย

ง่ายที่จะเห็นว่าสิ่งนี้ใช้ไม่ได้ใน ext4 เราจะตั้งค่าแอตทริบิวต์ s (การลบอย่างปลอดภัย) ในไฟล์ข้อความ

 sudo chattr +s third-file.txt 

การตั้งค่าแอตทริบิวต์การลบที่ปลอดภัยในไฟล์ข้อความ

สิ่งที่เราจะทำคือค้นหาไอโหนดที่เก็บข้อมูลเมตาเกี่ยวกับไฟล์นี้ ไอโหนดถือบล็อกฮาร์ดไดรฟ์แรกที่ครอบครองโดยไฟล์ ไฟล์นี้มีข้อความตัวยึดตำแหน่ง lorem ipsum

เราจะอ่านบล็อกนั้นโดยตรงจากฮาร์ดไดรฟ์เพื่อยืนยันว่าเรากำลังอ่านตำแหน่งฮาร์ดไดรฟ์ที่ถูกต้อง เราจะลบไฟล์แล้วอ่านบล็อกการดำน้ำแบบเดียวกันนั้นอีกครั้ง หากใช้แอตทริบิวต์การลบที่ปลอดภัย เราควรอ่านไบต์ที่เป็นศูนย์

เราหาไอโหนดของไฟล์ได้โดยใช้คำสั่ง hdparm พร้อมตัวเลือก --fibmap (file block map)

 sudo hdparm --fibmap third-file.txt 

การหาไอโหนดของไฟล์

บล็อกฮาร์ดไดรฟ์แรกคือ 18100656 เราจะใช้คำสั่ง dd เพื่ออ่าน

ตัวเลือกคือ:

  • if=/dev/sda : อ่านจากฮาร์ดไดรฟ์ตัวแรกในคอมพิวเตอร์เครื่องนี้
  • bs=512 : ใช้ขนาดบล็อกฮาร์ดไดรฟ์ 512 ไบต์
  • skip=18100656 : ข้ามบล็อกทั้งหมดก่อนบล็อก 18100656 กล่าวอีกนัยหนึ่ง เริ่มอ่านที่บล็อก 18100656
  • count=1 : อ่านหนึ่งบล็อกของข้อมูล
 sudo dd if=/dev/sda bs=512 ข้าม=18100656 จำนวน=1 

การอ่านบล็อกฮาร์ดไดรฟ์แรกของไฟล์

อย่างที่คาดไว้ เราจะเห็นข้อความตัวยึดตำแหน่ง lorem ipsum เรากำลังอ่านบล็อกที่ถูกต้องบนฮาร์ดไดรฟ์

ตอนนี้เราจะลบไฟล์

 rm third-file.txt 

หากเราอ่านบล็อกฮาร์ดไดรฟ์เดียวกันนั้น เราจะยังคงเห็นข้อมูลได้

 sudo dd if=/dev/sda bs=512 ข้าม=18100656 จำนวน=1 

การอ่านข้อมูลจากบล็อกฮาร์ดไดรฟ์ที่ใช้โดยไฟล์ที่ถูกลบ

อีกครั้ง อย่าพึ่งพาสิ่งนี้สำหรับการลบอย่างปลอดภัยใน ext4 มีวิธีที่ดีกว่าในการลบไฟล์เพื่อไม่ให้กู้คืนได้

ที่เกี่ยวข้อง: วิธีลบไฟล์อย่างปลอดภัยบน Linux

มีประโยชน์ แต่ใช้ด้วยความระมัดระวัง

การตั้งค่าแอตทริบิวต์ของไฟล์สามารถป้องกันไม่ให้เกิดภัยพิบัติโดยไม่ได้ตั้งใจ หากคุณไม่สามารถลบหรือเขียนทับไฟล์ได้ จะค่อนข้างปลอดภัย

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

ที่เกี่ยวข้อง: วิธีรักษาความปลอดภัยเซิร์ฟเวอร์ Linux ของคุณด้วย fail2ban