Linux chattr 設定檔案隱藏屬性

Linux 有 chattr (設定檔案隱藏屬性) / lsattr (顯示檔案隱藏屬性) 進階的權限設定.

此篇文章實作並練習試試 chattr 的 SUID / SGID / SBIT 效用~ (註: chattr 只在 ext2 / ext3 / ext4 的檔案系統上生效, 其它不一定有效)

chattr - SUID / SGID / SBIT 說明

  • SUID (Set User ID) 設執行檔擁有該 Owner 的存取系統資源權限, chmod [u+s | u-s | 4***]
  • SGID (Set Group ID) 設執行檔擁有該 Group 的存取系統資源權限, chmod [g+s | g-s | 2***]
  • SBIT (Sticky Bit) 讓檔案只有 Owner 或 root 才能 搬動 / 刪除 此檔案, chmod [+t | -t | 1***]
  • 註: 依照鳥哥的說法: Sticky Bit, SBIT 目前只針對目錄有效,對於檔案已經沒有效果了. 有興趣的可以試試看, 我試的結果還是有效~

chattr 指令說明

下述說明取自: 鳥哥的 Linux 私房菜 -- 檔案與目錄管理

chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與參數:
+   :增加某一個特殊參數,其他原本存在參數則不動。
-   :移除某一個特殊參數,其他原本存在參數則不動。
=   :設定一定,且僅有後面接的參數

A  :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,可避免I/O較慢的機器過度的存取磁碟。這對速度較慢的電腦有幫助
S  :一般檔案是非同步寫入磁碟的,如果加上 S 這個屬性時,當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root 才能設定這個屬性。
c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d  :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i  :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只有 root 能設定此屬性
s  :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無法救回來了喔!
u  :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔!
注意:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定

實際測試範例

讀取檔案的程式 fread.c
  • vim fread.c

    int main()
    {
        FILE * pFile;
        char c;
        pFile = fopen ("open_file.txt","r");

        if (pFile == NULL) {
            printf("Error: can't open file.\n");
            return -1;
        }

        while (1) {
            c = fgetc(pFile);

            if (c != EOF)
                printf("%c", c);
            else
                break;
        }

        fclose(pFile);

        return 0;
    }

測試 suid
  1. gcc -o read ./fread.c
  2. echo "this is test" > open_file.txt
  3. sudo chmod 400 open_file.txt # -r--------
  4. sudo chown root open_file.txt
  5. cat open_file.txt # 非 root 無法讀取此檔案

    cat: open_file.txt: 拒絕不符權限的操作

  6. ls -l read # -rwxr-xr-x, read 目前權限
  7. sudo chown root ./read # 將檔案 owner 轉為 root
  8. ./read

     Error: can't open file.

  9. sudo chmod u+s ./read # 或者 chmod 4*** (-rwsr-xr-x = 4755)
  10. ls -l read # -rwsr-xr-x
  11. ./read # 此檔案會用 owner(root) 的權限去執行(上面有將此檔案 owner 轉為 root)

    this is test

測試 sgid
  1. gcc -o read ./fread.c
  2. echo "this is test" > open_file.txt
  3. sudo chmod 040 open_file.txt # ----r-----
  4. sudo chown root:root open_file.txt
  5. cat open_file.txt # 非 root group 無法讀取此檔案

    cat: open_file.txt: 拒絕不符權限的操作

  6. ls -l read # -rwxr-xr-x, read 目前權限
  7. sudo chgrp root ./read # 將檔案 owner 轉為 root
  8. ./read # 使用沒加入 root group 的帳號執行

    Error: can't open file.

  9. sudo chmod g+s ./read # 或者 chmod 2*** (-rwsr-xr-x = 2755)
  10. ls -l read # -rwxr-sr-x
  11. ./read # 此檔案會用 group(root) 的權限去執行(上面有將此檔案 group 轉為 root)

    this is test

測試 sbit
  1. echo "this is test" > open_file.txt
  2. sudo chmod 777 open_file.txt # -rwxrwxrwx
  3. mv open_file.txt o
  4. ls o # -rwxrwxrwt
  5. chmod +t ./o # 加上 sticky, -rwxrwxrwt
  6. mv o x # 正常修改名稱
  7. chmod +t ./x # 加上 sticky, -rwxrwxrwt
  8. sudo su www-data # 切換到另外一個 user
  9. mv x /tmp/o # /tmp/o 還是會產生出來, 但是 x 是不會被刪除的(mv = cp + rm)

    mv: 無法移除 ‘x’: 此項操作並不被允許


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 My_Note-Unix。將永久鏈結加入書籤。

發表迴響