วิธีใช้คำสั่ง chattr บน Linux
เผยแพร่แล้ว: 2022-06-28นอกจากสิทธิ์ในการอ่าน เขียน และเรียกใช้ไฟล์ตามปกติแล้ว ไฟล์ Linux ยังมีแอตทริบิวต์อีกชุดหนึ่งที่ควบคุมคุณสมบัติอื่นๆ ของไฟล์ วิธีดูและเปลี่ยนแปลงมีดังนี้
สิทธิ์และคุณสมบัติ
ใน Linux ผู้ที่สามารถเข้าถึงไฟล์และสิ่งที่พวกเขาสามารถทำได้จะถูกควบคุมโดยชุดการ อนุญาต ที่เน้นผู้ใช้เป็นศูนย์กลาง ไม่ว่าคุณจะสามารถอ่านเนื้อหาของไฟล์ เขียนข้อมูลใหม่ลงในไฟล์ หรือเรียกใช้งานไฟล์ได้หากเป็นสคริปต์หรือโปรแกรม ทั้งหมดนี้อยู่ภายใต้การอนุญาตชุดนั้น สิทธิ์ถูกนำไปใช้กับไฟล์ แต่จะกำหนดข้อจำกัดและความสามารถสำหรับผู้ใช้ประเภทต่างๆ
มีสิทธิ์สำหรับ เจ้าของ ไฟล์ สำหรับ กลุ่ม ของไฟล์ และสำหรับ ผู้อื่น นั่นคือผู้ใช้ที่ไม่ได้อยู่ในสองประเภทแรก คุณสามารถใช้คำสั่ง ls
พร้อมตัวเลือก -l
(รายการแบบยาว) เพื่อดูการอนุญาตบนไฟล์หรือไดเร็กทอรี
หากต้องการเปลี่ยนการอนุญาต ให้ใช้คำสั่ง chmod
อย่างน้อย คุณสามารถทำได้ถ้าคุณมีสิทธิ์ในการเขียนสำหรับไฟล์ หรือถ้าคุณเป็นผู้ใช้รูท
เราจะเห็นว่าการอนุญาตของไฟล์นั้นเน้นที่ผู้ใช้เป็นหลัก เพราะมันให้รางวัลหรือลบการอนุญาตในระดับผู้ใช้ ในทางตรงกันข้าม คุณลักษณะ ของไฟล์คือระบบไฟล์ที่เน้นระบบ เช่นเดียวกับการอนุญาต พวกมันถูกตั้งค่าในไฟล์หรือไดเร็กทอรี แต่เมื่อตั้งค่าแล้ว ผู้ใช้ทุกคนจะเหมือนกัน
แอตทริบิวต์เป็นชุดการตั้งค่าแยกต่างหากจากการอนุญาต แอตทริบิวต์ควบคุมลักษณะต่างๆ เช่น ความไม่เปลี่ยนรูปและลักษณะการทำงานระดับระบบไฟล์อื่นๆ หากต้องการดูคุณสมบัติของไฟล์หรือไดเร็กทอรี เราใช้คำสั่ง lsattr
ในการตั้งค่าแอตทริบิวต์เราใช้คำสั่ง chattr
สิทธิ์และแอตทริบิวต์จะถูกเก็บไว้ใน 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
เราสามารถตรวจสอบเพื่อดูว่ามีการตั้งค่าบิตต่อท้ายเท่านั้นโดยใช้ 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