binding contract, contract, secure

Linux – Chmod 工具管理檔案/目錄權限

多人多工環境下工作,檔案或是目錄存取權限是一件很重要的事情,有些目錄為大家共用的,有些檔案限定某一部份的人只能看不能修改,其它人沒有任何權限,可以透過 chmod 這個工具可以方便的設定所要的權限並進行管理。

1. chmod 基本用法

chmod 工具可以針對目錄或是檔案進行設定,其設定權限方式有兩種:

  1. 透過參數組合設定所需的權限 (簡易直覺,參數比較多)
  2. 將所需的權限使用數字表示設定 (進階,熟悉使用後快速)

1.1 方式一 (參數組合)

第一組參數 第二組參數 第三組參數
u (User) + (Append) x (執行)
g (Group) – (Delete) r (讀取)
o (Other) = (Equal) w (寫入)
a (ALL)

例如: test 檔案要讓 User 及 Group 擁有 x (執行)權限:

[test@servera playgroud]$ chmod u+x,g+x test
total 4
-rwxrwxr--. 1 test test  0 Feb 10 12:12 test

透過上述的排列組合,可以自由搭配來設定檔案或是目錄權限

1.2 方式二 (數字表示設定)

r 代表4 , w 代表 2 , x 代表 1 ,每三個數字為一組相加 
-rwxrwxrwx 
 421421421
 
將上述權限轉成數字就變成 7(4+2+1)7(4+2+1)7(4+2+1) -> 777

-rw-r--r--
 420400400
 
將上述權限轉成數字就變成 6(4+2+0)4(4+0+0)4(4+0+0) -> 644

例如: test2 檔案所有人都可以執行跟讀取,另限定只有 user 才有寫入權限

[test@servera playgroud]$ chmod 755 test2
total 4
-rwxr-xr-x. 1 test test  0 Feb 10 12:15 test2

2. chmod 進階參數

  • v: 顯示詳細執行訊息
  • R: 遞迴處理

有個 main 主目錄,底下有多個子目錄及檔案,要統一進行權限修改,可以透過 chmod 指令一個一個重複執行,不過該作法非常沒有效率,藉由 Recursive(遞迴) 方式快速能夠完成。

[test@servera playgroud]$ tree main/
main/
├── aa
│   ├── inside
│   │   └── exec.sh
│   └── other.sh
└── bb
    ├── inside
    │   └── exec.sh
    └── other.sh

4 directories, 4 files

將上述所有的目錄及檔案都改成 755 權限

[test@servera playgroud]$ chmod -Rv 755 main/
mode of 'main/' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of 'main/aa' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of 'main/aa/inside' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of 'main/aa/inside/exec.sh' changed from 0664 (rw-rw-r--) to 0755 (rwxr-xr-x)
mode of 'main/aa/other.sh' changed from 0664 (rw-rw-r--) to 0755 (rwxr-xr-x)
mode of 'main/bb' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of 'main/bb/inside' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of 'main/bb/inside/exec.sh' changed from 0664 (rw-rw-r--) to 0755 (rwxr-xr-x)
mode of 'main/bb/other.sh' changed from 0664 (rw-rw-r--) to 0755 (rwxr-xr-x)

3. chmod 特殊權限

passwd 變更密碼這指令只有 root 管理員才能操作,為什麼一般使用者也能透過該指令變更自己的密碼呢?

這就要提到所謂的特殊權限功能,其權限列表如下:

特殊權限 檔案效果 目錄效果
u+s (suid) 該檔案在執行時,執行程式擁有檔案擁有者的權限。
g+s (sgid) 該檔案在執行時,執行程式擁有檔案群組的權限。 所有在此目錄下新創建的目錄會自動繼承主目錄的 group 權限,並且檔案會自動等於主目錄群組的擁有者。
t+s (sticky) 在此目錄下只有該檔案的擁有者,才有權限刪除檔案。

3.1 特殊權限 – suid

[test@servera ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 Mar 15  2021 /usr/bin/passwd

上方權限 user 原本是 x 執行權限變成 s ,表示該檔案為 suid ,在執行時候會自動提升權力使程式可以擁有 root 權力,所以才能變更自己的密碼。

在所有特殊權限規則,因為 x (執行) 被遮蔽,只要是小寫的 s 表示背後擁有 x (執行) 權限 , 大寫的 s 則沒有(執行) 權限,需注意。

3.1 特殊權限 – sgid

什麼是檔案繼承主目錄群組的擁有者呢 ? 下方有一個目錄名稱 sgid (user: test , group: tests ) 其 group 原本是 x 執行權限變成 s。

[test@servera playgroud]$ ls -ld sgid/
drwxr-sr-x. 2 test tests 6 Feb 10 13:45 sgid/

在 sgid 底下新增一個檔案 example, 檔案的 group 會從原本的 test 自動改寫成 tests

[test@servera playgroud]$ ls -l sgid/example 
-rw-rw-r--. 1 test tests 0 Feb 10 13:49 sgid/example

3.1 特殊權限 – sticky

這個用法主要在 /tmp 目錄下,任何人都可以訪問 /tmp 目錄並且創建刪除檔案,假設今天 John 的某支程式在 /tmp 底下輸出一個執行暫存檔 joho_helper.json , 他的仇人 Amy 剛好也在/tmp目錄下看到一氣之下就把檔案給刪除了;如果沒有特殊權限保護機制,一旦把檔案刪除的話,那 John 的程式可能就會失敗中斷 … 所以 sticky 就發揮出功能了

[test@servera ~]$ ls -ld /tmp
drwxrwxrwt. 10 root root 275 Feb 10 13:49 /tmp

上方權限 other 原本是 x 執行權限變成 t ,表示該檔案為 sticky ,雖然任何能都自由進出創建檔案在該目錄下,不過只有該檔案的擁有者才有權限刪除。

例如: test 使用者 程式建立的檔案 , test4 使用者就沒有權限執行刪除

[test4@servera ~]$ ls -l /tmp/test-owner.log 
-rwxrwxrwx. 1 test test 0 Feb 10 13:59 /tmp/test-owner.log
[test4@servera ~]$ rm -f /tmp/test-owner.log 
rm: cannot remove '/tmp/test-owner.log': Operation not permitted

上述例子就算檔案權限是 777 也沒辦法刪除,主是是能否刪除及創建檔案的權限規範並不在檔案上,是規範在目錄的 w (寫入) 權限上, 檔案的 w (寫入) 權限只針對裡面內容增刪而已,這一點要特別注意 !!


4. chmod -R + X ?

有時候會看到 chmod 遞迴時搭配 大寫的 X 執行,這是什麼意思?

在 man 文件裡面的解說: execute/search only if the file is a directory or already has execute permission for some user (X)

其實簡單講法就是避免執行遞迴時讓全部目錄及檔案在授權 x (執行) 權限時,把一些重要的或是本來就不該變成可以執行權限的檔案通通改成可以執行。

例如: 在 file 資料夾內,有兩個檔案 a 及 exec ,原本只有 exec 才有執行權限, a 就只是一般檔案, 使用一般的小寫 x 執行 chmod -R +x file , a 就莫名的變成有執行權限。

[test4@servera ~]$ ls -l file/
total 0
-rw-rw-r--. 1 test4 test4 0 Feb 10 14:13 a
-rwxrw-r--. 1 test4 test4 0 Feb 10 14:13 exec
[test4@servera ~]$ chmod -R a+x file/
[test4@servera ~]$ ls -l file/
total 0
-rwxrwxr-x. 1 test4 test4 0 Feb 10 14:13 a
-rwxrwxr-x. 1 test4 test4 0 Feb 10 14:13 exec

改成使用大寫 X 情況就會不一樣了

[test4@servera ~]$ ls -l file/
total 0
-rw-rw-r--. 1 test4 test4 0 Feb 10 14:13 a
-rwxrw-r--. 1 test4 test4 0 Feb 10 14:13 exec
[test4@servera ~]$ chmod -R a+X file/
[test4@servera ~]$ ls -l file/
total 0
-rw-rw-r--. 1 test4 test4 0 Feb 10 14:13 a
-rwxrwxr-x. 1 test4 test4 0 Feb 10 14:13 exec

上述就可以看到原本 exec 檔案的 user 就有 x (執行) 權限,所以執行 a + X ,擁有人都可以擁有執行權限,不過 a 檔案預設就是沒有任何執行權限,就算執行 a + X 也不會自動取得執行權限。


5. umask 權限遮罩

5.1 umask 作用及原理

有沒有想過,為什麼創建檔案後權限會自動產生 644 權限呢? 目錄會自動產生 755 權限呢? 其實這與 umask 有很大關係 ~

在 Linux 系統檔案及目錄預設權限為:

檔案 目錄
rw_rw_rw_ rwxrwxrwx

預設權限再扣掉使用者的當下 umask 後就會是自動產生的權限

[root@servera test]# umask 
0022

上述就可以看到 umask 遮罩會自動扣除 group 及 other 的 w (寫入權限),所以檔案就自動從原本的 666 ( 扣除 022 ) -> 644 ,目錄從原本的 777 (扣除 022 ) -> 755。

5.2 永久配置 umask

不過直接執行 umask 只能臨時性變更,登出或是重新開機後又會變回原本的數值,那要如何永久寫入呢?

對於 root 而言可以配置在 /etc/profile.d/umask.sh 內,並讓所有使用者套用該設定

# 限制只要是 other 都沒有權限執行
umask 007

如果一般User不希望使用 root 定好的 umask 值的話,也可以將 umask 寫入自己的 ~/.bashrc 或是 ~/.bash_profile 內,會覆蓋 root 的 umask,並載入自行設定的。


6. 小結

權限控管是 Linux 系統中非常重要的一環,好的權限管理才能使系統、資料更安全可用性更高。


如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!

Similar Posts