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
- gcc -o read ./fread.c
- echo "this is test" > open_file.txt
- sudo chmod 400 open_file.txt # -r--------
- sudo chown root open_file.txt
- cat open_file.txt # 非 root 無法讀取此檔案
cat: open_file.txt: 拒絕不符權限的操作
- ls -l read # -rwxr-xr-x, read 目前權限
- sudo chown root ./read # 將檔案 owner 轉為 root
- ./read
Error: can't open file.
- sudo chmod u+s ./read # 或者 chmod 4*** (-rwsr-xr-x = 4755)
- ls -l read # -rwsr-xr-x
- ./read # 此檔案會用 owner(root) 的權限去執行(上面有將此檔案 owner 轉為 root)
this is test
測試 sgid
- gcc -o read ./fread.c
- echo "this is test" > open_file.txt
- sudo chmod 040 open_file.txt # ----r-----
- sudo chown root:root open_file.txt
- cat open_file.txt # 非 root group 無法讀取此檔案
cat: open_file.txt: 拒絕不符權限的操作
- ls -l read # -rwxr-xr-x, read 目前權限
- sudo chgrp root ./read # 將檔案 owner 轉為 root
- ./read # 使用沒加入 root group 的帳號執行
Error: can't open file.
- sudo chmod g+s ./read # 或者 chmod 2*** (-rwsr-xr-x = 2755)
- ls -l read # -rwxr-sr-x
- ./read # 此檔案會用 group(root) 的權限去執行(上面有將此檔案 group 轉為 root)
this is test
測試 sbit
- echo "this is test" > open_file.txt
- sudo chmod 777 open_file.txt # -rwxrwxrwx
- mv open_file.txt o
- ls o # -rwxrwxrwt
- chmod +t ./o # 加上 sticky, -rwxrwxrwt
- mv o x # 正常修改名稱
- chmod +t ./x # 加上 sticky, -rwxrwxrwt
- sudo su www-data # 切換到另外一個 user
- mv x /tmp/o # /tmp/o 還是會產生出來, 但是 x 是不會被刪除的(mv = cp + rm)
mv: 無法移除 ‘x’: 此項操作並不被允許