如何在 Linux 上使用 chattr 命令
已發表: 2022-06-28
除了通常的讀、寫和執行文件權限外,Linux 文件還有另一組屬性來控製文件的其他特徵。 以下是如何查看和更改它們。
權限和屬性
在 Linux 中,誰可以訪問一個文件以及他們可以用它做什麼是由一組以用戶為中心的權限控制的。 您是否可以讀取文件的內容、將新數據寫入文件或執行文件(如果它是腳本或程序),都由該組權限控制。 權限應用於文件,但它們定義了不同類別用戶的限制和能力。
文件所有者、文件組和其他人(即不屬於前兩個類別的用戶)都有權限。 您可以使用帶有-l (長列表)選項的ls命令來查看文件或目錄的權限。
要更改權限,請使用chmod命令。 至少,如果您對文件具有寫入權限,或者您是 root 用戶,則可以。
我們可以看到文件權限是以用戶為中心的,因為它們在用戶級別授予或刪除權限。 相比之下,文件的屬性是以文件系統為中心的。 與權限一樣,它們是在文件或目錄上設置的。 但是一旦設置好,它們對所有用戶都是一樣的。
屬性是獨立於權限的設置集合。 屬性控制特性,例如不變性和其他文件系統級別的行為。 要查看文件或目錄的屬性,我們使用lsattr命令。 要設置屬性,我們使用chattr命令。
權限和屬性存儲在inode中。 inode 是一種文件系統結構,它保存有關文件系統對象(例如文件和目錄)的信息。 文件在硬盤驅動器上的位置、創建日期、權限和屬性都存儲在其 inode 中。
由於不同的文件系統具有不同的底層結構和功能,因此某些文件系統可能會表現出不同的屬性或完全忽略屬性。 在本文中,我們使用ext4 ,它是許多 Linux 發行版的默認文件系統。
查看文件的屬性
chattr和lsattr命令已經存在於您的計算機上,因此無需安裝任何東西。
要檢查當前目錄中文件的屬性,請使用lsattr :
lsattr

虛線是未設置屬性的佔位符。 唯一設置的屬性是e (範圍)屬性。 這表明文件系統 inode 正在使用(或將在需要時使用)擴展區來指向硬盤驅動器上文件的所有部分。
如果文件保存在一個連續的硬盤塊序列中,則其 inode 只需記錄用於存儲文件的第一個和最後一個塊。 如果文件是分片的,inode 必須記錄文件每塊的第一個和最後一個塊的編號。 這些成對的硬盤驅動器塊號稱為擴展區。
這是最常用的屬性列表。
- a :僅附加。 只能附加到具有此屬性的文件。 它仍然可以被寫入,但只能在文件末尾。 無法覆蓋文件中的任何現有數據。
- c :壓縮。 該文件在硬盤驅動器上自動壓縮並在讀取時解壓縮。 寫入文件的數據在寫入硬盤驅動器之前會被壓縮。
- 答:沒有
atime更新。atime是 inode 中的一個值,用於記錄最後一次訪問文件的時間。 - C :沒有寫時復制。 如果兩個進程請求訪問一個文件,它們可以被賦予指向同一個文件的指針。 只有當他們嘗試寫入文件時,他們才會獲得自己唯一的文件副本,使其對該進程唯一。
- d :沒有轉儲。 Linux
dump命令用於將整個文件系統的副本寫入備份介質。 此屬性使dump忽略文件。 它從備份中排除。 - D :同步目錄更新。 為目錄打開此屬性後,對該目錄的所有更改都會同步(即立即)寫入硬盤驅動器。 數據操作可以被緩衝。
- e : 盤區格式。
e屬性表示文件系統正在使用擴展區來映射文件在硬盤驅動器上的位置。 你不能用chattr改變它。 它是文件系統操作的函數。 - 我:不可變。 不可變文件不能被修改,包括重命名和刪除。 root 用戶是唯一可以設置或取消設置此屬性的人。
- s :安全刪除。 刪除具有此屬性集的文件時,保存文件數據的硬盤驅動器塊將被包含零的字節覆蓋。 請注意,
ext4文件系統不支持這一點。 - S :同步更新。 對其
S屬性集的文件的更改將同步寫入文件。 - u :刪除設置了
u屬性的文件會生成該文件的副本。 如果文件被錯誤刪除,這可能有利於文件恢復。
更改文件的屬性
chattr命令允許我們更改文件或目錄的屬性。 我們可以使用+ (set) 和- (unset) 運算符來應用或刪除屬性,類似於chmod命令和權限。
chattr命令還有一個= (僅設置)運算符。 這會將文件或目錄的屬性設置為僅在命令中指定的屬性。 也就是說,所有未在命令行中列出的屬性都是unset 。
設置僅附加屬性
讓我們在文本文件上設置 append-only 屬性,看看它如何影響我們可以對文件執行的操作。
sudo chattr +一個文本文件.txt

我們可以檢查是否已使用lsattr設置了僅附加位:
lsattr 文本文件.txt

字母“ a ”表示該屬性已設置。 讓我們嘗試覆蓋文件。 將輸出重定向到帶有單個尖括號“ > ”的文件會將文件中的所有內容替換為重定向的輸出。
我們已經用一些lorem ipsum佔位符文本預加載了文本文件。

貓文本文件.txt

我們將ls的輸出重定向到文件中:
ls -l > 文本文件.txt
sudo ls -l > 文本文件.txt

即使我們使用sudo命令,也不允許該操作。
如果我們使用兩個尖括號“ >> ”來重定向輸出,它會附加到文件中的現有數據中。 這對於我們的僅附加文本文件應該是可以接受的。
sudo ls -l >> 文本文件.txt

我們返回到命令提示符,沒有任何錯誤消息。 讓我們看看文件內部發生了什麼。
貓文本文件.txt

來自ls的重定向輸出已添加到文件末尾。

儘管我們可以將數據附加到文件中,但這是我們可以對其進行的唯一更改。 我們不能刪除它,也不能root。
rm 文本文件.txt
sudo rm 文本文件.txt

設置不可變屬性
如果你想保護一個永遠不會添加新數據的文件,你可以設置 immutable 屬性。 這可以防止對文件的所有更改,包括附加數據。
sudo chattr +i second-file.txt
lsattr 第二個文件.txt

我們可以看到“ i ”表示已設置不可變屬性。 使我們的文件不可變後,即使是 root 用戶也無法重命名( mv )、刪除( rm )或向其添加數據。
sudo mv second-file.txt new-name.txt
sudo rm 第二文件.txt
sudo ls -l >> second-file.txt

不要依賴 ext4 上的安全刪除
正如我們所指出的,某些操作系統並不支持所有屬性。 ext系列文件系統(包括ext4 )不支持安全刪除屬性。 不要依賴它來安全刪除文件。
很容易看出這在ext4中不起作用。 我們將在文本文件上設置s (安全刪除)屬性。
sudo chattr +s 第三文件.txt

我們要做的是找出保存有關此文件的元數據的 inode。 inode 保存文件佔用的第一個硬盤塊。 該文件包含一些lorem ipsum佔位符文本。
我們將直接從硬盤驅動器讀取該塊,以驗證我們正在讀取正確的硬盤驅動器位置。 我們將刪除該文件,然後再次讀取相同的硬潛水塊。 如果遵守安全刪除屬性,我們應該讀取零字節。
我們可以使用帶有--fibmap (文件塊映射)選項的hdparm命令找到文件的 inode。
sudo hdparm --fibmap 第三文件.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 第三文件.txt

如果我們讀取同一個硬盤塊,我們仍然可以看到數據。
sudo dd if=/dev/sda bs=512 跳過=18100656 計數=1

同樣,不要依賴這個來安全刪除ext4 。有更好的方法可以刪除文件,這樣它們就無法恢復。
相關:如何在 Linux 上安全地刪除文件
有用,但謹慎使用
設置文件的屬性可以使它們不受意外災難的影響。 如果您無法刪除或覆蓋文件,那是非常安全的。
您可能認為您想將它們應用到系統文件並讓您的 Linux 安裝更加安全。 但係統文件需要在發布更新或應用升級時定期更換。 因此,僅在您自己創建的文件上使用這些屬性是最安全的。
相關:如何使用 fail2ban 保護您的 Linux 服務器


