使用 chattr 指令設定檔案屬性,在 Linux 中預防檔案被更改或刪除

在 Linux 中有一個 chattr 指令,它可以用來設定檔案的各種屬性,防止檔案被刪除或是更改,即使是有管理者權限的時候也無法更動。


在 Linux 系統中有時候我們會需要保護某些重要的檔案,避免這些檔案不小心被更改或是刪除,像是 /etc 下面的一些系統設定檔案,我們可能會不希望系統的套件管理程式在升級套件時更改掉我們已經設定好的設定檔,當然您也可以使用 chownchmod 將重要的檔案改成 root 管理者才能夠寫入,不過這也很難預防您在使用 root 權限的時候誤刪檔案的問題。

chattr 是一個可以用來設定 Linux 檔案屬性的指令,這些屬性跟一般使用 chmod 所設定的讀取(read)、寫入(write)與執行(execute)不同,chattr 可以設定更多其他的屬性,這些屬性原本只有在 EXT 系列的檔案系統(EXT2/3/4)有支援,而現在大部份 Linux 下面的檔案系統都有支援了,如 XFS、Btrfs 與 ReiserFS 等。

chattr 指令是用來設定檔案屬性用的,而 lsattr 指令則可用來查看檔案的屬性,這兩個指令是包含在 e2fsprogs 套件之中,一般的 Linux 發行版通常都會預先安裝好。以下是使用教學與一些常用的範例。

基本使用方式

chattr 指令的使用方式為:
chattr [-RVf] [operator][attribute(s)] files...
其中 operator 可以是 +-=,後面再加上要設定的 attribute(s),這跟 chmod 指令的用法類似,以下是一些常用的屬性:
  • a:只能以附加的方式寫入(append only)。
  • c:自動壓縮(compressed),Linux 核心會自動把檔案的內容先壓縮後,再寫入硬碟,而在讀取但內容時,Linux 核心也會自動進行解壓縮。
  • d:在使用 dump 時,這種檔案會被排除(no dump)。
  • i:檔案不可以被更動(immutable),不可以寫入、刪除、建立連結檔等。
  • s:安全刪除檔案(secure deletion),當檔案被刪除時,系統會將所有硬碟上的檔案內容用 0 取代,確保檔案資料確實刪除。
  • A:不要更新檔案存取時間(no atime updates)。
  • C:關閉 copy-on-write(no copy on write)。
  • S:當檔案內容更動時,馬上同步寫入硬碟(synchronous updates)。
chattr 還有許多比較不常用的屬性這裡沒有列出來,有興趣的人可以查閱 chattr 的線上手冊。

接著示範如何查看一個檔案的屬性,首先建立一個測試用的檔案:
date > date.txt
接著使用 lsattr 來查看這個檔案的屬性:
lsattr date.txt
輸出會像這樣:
-------------e-- date.txt
這裡的輸出跟 ls -l 的輸出類似,如果是 - 則代表該屬性沒有被設定,如果有被設定的話,就會出現對應的英文字母。

讓檔案不可以被更動

系統中一些重要的檔案可以設定 i 屬性(immutable),防止檔案被刪除會是更改:
sudo chattr +i date.txt
然後用 lsattr 檢查一下:
lsattr date.txt
輸出會像這樣:
----i--------e-- date.txt
我們可以測試一下用 rm 指令刪除這的檔案:
rm date.txt
這時候應該就會出現這樣的訊息:
rm: remove write-protected regular file ‘date.txt’?
就算回答 y,也還是會出現不可以更動的錯誤訊息:
rm: cannot remove ‘date.txt’: Operation not permitted
而且就算用管理者權限執行刪除的指令:
sudo rm date.txt
還是一樣:
rm: cannot remove ‘date.txt’: Operation not permitted
這樣就可以確保檔案不會被誤刪。

如果真的要刪除這個檔案,就先必須把 i 屬性拿掉才行:
sudo chattr -i date.txt
rm date.txt

如果需要將整個目錄底下所有的檔案都加上 i 屬性,可以使用 -R 參數,例如:
sudo chattr -R +i /etc

讓檔案只能增加內容,不能刪除

有些重要的系統記錄檔也是常常會需要保護的對象,但這些紀錄檔會不斷的更新,無法直接使用 i 屬性,如果想要避免誤刪這類的檔案,可以使用 a 屬性,設定這個屬性可以讓檔案只能增加內容,不可以刪除或覆寫,例如:
sudo chattr +a /var/log/syslog

最後提醒一點,如果您將設定有 i 或是 a 屬性的檔案複製成另外一個新的檔案時,這些屬性並不會跟著被複製,所以如果新的檔案也需要被保護,就要重新設定。

參考資料:Xmodulo
本站已經搬家了,欲查看最新的文章,請至 G. T. Wang 新網站