27.2. 使用者和存取許可權

因為它早在 1990 年代便開始,Linux 已經開發成多重使用者系統。任何數目的使用者可以同時在上面工作。使用者需要登入系統,才能在他們的工作站開始工作階段。每一個使用者都有一個使用者名稱以及相應的密碼。這種使用者區隔,可以確保未授權的使用者,無法看到他們沒有存取許可權的檔案。對系統的較大變更,例如安裝新程式,一般使用者通常也無法執行或被限制。只有 root 使用者或超級使用者,可以不受限制對系統進行變更以及自由存取所有檔案。在需要時才以完整 root 存取權登入,只要是遵循此概念的人就可以免除意外損失資料的風險。因為在正常情況下,只有 root 才可以刪除檔案或格式化硬碟,因此特洛伊木馬效應或意外輸入破壞性指令的情形,都可以大大降低。

27.2.1. 檔案系統許可權

基本上,Linux 檔案系統的每一個檔案都屬於一個使用者和一個群組。可以授權這些私有群組和所有其他人寫入、讀取或執行這些檔案。

在本案例中,群組可以定義成一組連線的使用者,具備特定的結合權限。例如,定義可以在特定專案 project3 工作的群組。Linux 系統的每一位使用者,至少屬於一個私有群組的成員,一般是 users。需要時可以在系統新增很多群組,但只有 root 才可以新增群組。每一個使用者都可以使用指令 groups,知道成員的所屬群組。

檔案存取

檔案系統中的許可權組織,會因檔案和目錄而不同。檔案許可權資訊可以使用指令 ls -l 顯示。輸出如 範例 27.1, "顯示檔案許可權的範例輸出" 所示。

範例 27.1. 顯示檔案許可權的範例輸出

-rw-r----- 1 tux project3 14197 Jun 21  15:03 Roadmap

如第三欄顯示,此檔案屬於使用者 tux。它被指定至群組 project3。要探索 Roadmap 檔案的使用者許可權,必須更詳細檢查第一欄。

-

rw-

r--

---

類型

使用者權限

群組權限

其他使用者的權限

此欄是由一個前導字元,後面加上 9 個字元 (3 個為一組) 所組成的。前 10 個字母標示檔案系統元件的類型。連字號 () 表示它是一個檔案。也可以表示目錄 (d)、連結 (l)、區塊裝置 (b) 或字元裝置。

後面的三個區塊依循標準形態。前三個字元指出檔案是否可以讀取 (r) 或無法讀取 ()。中間部份的 w 代表可以編輯相應的物件,而連字號 () 表示無法寫入檔案。第三個位置的 x,代表物件可以執行。因為此範例中的檔案是文字檔,而且不是可以執行的檔案,所以不需要此特殊檔案的執行權限。

在此範例中,tux 是檔案 Roadmap 的擁有者,擁有讀取 (r) 和寫入存取權 (w),但無法執行它 (x)。群組 project3 的成員可以讀取檔案,不過無法修改或執行。其他使用者沒有此檔案的任何存取權。其他許可權可以透過 ACL (存取控制清單) 來指定。請參閱 節 27.2.6, "存取控制清單" 以取得背景資訊。

目錄許可權

目錄的存取許可權類型為 d。針對目錄,個別許可權在意義上會稍稍不同。

範例 27.2. 顯示目錄許可權的範例輸出

drwxrwxr-x 1 tux project3 35 Jun 21 15:15  ProjectData

範例 27.2, "顯示目錄許可權的範例輸出" 中,可以輕易辨別目錄 ProjectData 的擁有者 (tux) 和所屬群組 (project3)。對照 檔案存取 的存取許可權,設定讀取許可權 (r) 表示可以顯示目錄的內容。寫入許可權 (w) 表示可以建立新檔案。執行許可權 (x) 表示使用者可以變更至此目錄。在上面的範例中,這表示使用者 tux 以及群組 project3 的成員可以變更至 ProjectData 目錄 (x)、檢視內容 (r) 以及新增或刪除檔案 (w)。另一方面,其他的使用者被授與較少的存取權。他們可以進入目錄 (x) 以及瀏覽該目錄 (r),但無法插入任何新檔案 (w)。

27.2.2. 修改檔案許可權

變更存取許可權

擁有者和 root 可以使用指令 chmod 加上變更許可權的參數和一或多個檔案名稱,變更檔案或目錄的存取許可權。形成不同類別的參數:

  1. 相關使用者

    • u (使用者) -- 檔案的擁有者

    • g (群組) -- 擁有檔案的群組

    • o (其他) -- 其他使用者 (若未指定參數,變更會套用至所有類別)

  2. 用於刪除 (-)、設定 (=) 或插入 (+) 的字元

  3. 縮寫

    • r讀取

    • w -- 寫入

    • x -- 執行

  4. 檔案名稱,若有多個檔案名稱則以空格來分隔

例如,如果 範例 27.2, "顯示目錄許可權的範例輸出" 中的使用者 tux 也想授與目錄 ProjectData 的寫入 (w) 存取權給其他人,他可以使用指令 chmod o+w ProjectData 來達到目的。

不過,如果他想拒絕自己以外,所有使用者的寫入許可權,他可以輸入指令 chmod go-w ProjectData,便可達到目的。要禁止所有使用者新增檔案至 ProjectData 資料夾,可輸入 chmod -w ProjectData。現在,即使是擁有者也無法寫入檔案;擁有者必須先重建寫入許可權,才可以寫入檔案。

變更擁有權許可權

其他控制檔案系統元件擁有權與許可權的重要指令是 chown (變更擁有者) 和 chgrp (變更群組)。指令 chown 可將檔案擁有權移交給其他使用者。不過,只允許 root 執行此變更。

假設 範例 27.2, "顯示目錄許可權的範例輸出" 的檔案 Roadmap 不應該再屬於 tux,而是屬於使用者 geeko,則 root 應該輸入 chown geeko Roadmap

chgrp 會變更檔案的群組擁有權。不過,檔案的擁有者必須是新群組的成員。使用此方法,只要 範例 27.1, "顯示檔案許可權的範例輸出" 的使用者 tux 是新群組的成員,便可以使用指令 chgrp project4 ProjectData,將所擁有檔案 ProjectData 的群組切換成 project4

27.2.3. setuid 位元

在某些狀況下,存取許可權可能受限太多。因此,Linux 擁有其他的設定,可以讓目前使用者與群組可以識別特定動作的暫時變更。例如,passwd 程式通常需要開機許可權來存取 /etc/passwd。此檔案包含一些重要的資訊,例如,使用者的主目錄,以及使用者與群組的 ID。因此,一般使用者將無法變更 passwd,因為授與所有使用者直接存取此檔案是非常危險的。此問題的可行解決方案是 setuid 機制。setuid (設定使用者 ID) 是一種特殊檔案屬性,可以指示系統根據特定使用者 ID 的標示來執行程式。請考慮使用 passwd 指令:

-rwsr-xr-x  1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd

您會看到 s,表示已針對使用者許可權設定 setuid 位元。藉由 setuid 位元,所有啟動 passwd 指令的使用者,皆能以 root 來執行。

27.2.4. setgid 位元

setuid 位元適用於使用者。不過,群組也有對等的屬性:setgid 位元。設定此位元的程式會以儲存時指定的群組 ID 來執行,無論啟動它的使用者為何。因此,在附帶 setgid 位元的目錄中,所有新建的檔案和子目錄會指定至目錄所屬的群組。請思考以下範例目錄:

drwxrws--- 2 tux archive 48 Nov 19 17:12
   backup

您會看到 s,表示已針對群組許可權設定 setgid 位元。目錄的擁有者與 archive 群組的成員可存取此目錄。非此群組成員的使用者會「對應」到個別群組。所有已寫入檔案的有效群組 ID 將會是 archive。例如,以 archive 群組 ID 執行的備份程式,即使沒有 root 權限,仍然能夠存取此目錄。

27.2.5. 黏貼位元

另外還有黏貼位元。它屬於可執行程式或目錄結果是不一樣的。如果它屬於程式,用此方法標示的檔案會載入 RAM,每次使用時就不需要從硬碟取得該程式。此屬性很少用,因為現在硬碟速度夠快了。如果此位元指定至目錄,它會禁止使用者刪除其他人的檔案。典型範例包括 /tmp/var/tmp 目錄:

drwxrwxrwt   2 root  root   1160 2002-11-19 17:15 /tmp
  

27.2.6. 存取控制清單

除 Linux 檔案系統物件外,傳統許可權概念 (例如檔案或目錄) 可以透過 ACL (存取控制清單) 來擴充。它們允許將檔案系統物件的許可權,指定給原始擁有者或所屬群組以外的使用者或群組。

使用簡單的 ls -l 指令,可以偵測延伸存取許可權的檔案或目錄:

-rw-r--r--+ 1 tux project3 14197 Jun 21  15:03 Roadmap

Roadmap 的擁有者是 tux,而後者屬於 project3 群組。tux 擁有此檔案的寫入和讀取存取權。群組和所有其他使用者都有讀取存取權。區分此檔案與沒有 ACL 的檔案,唯一的不同是擁有許可權位元的欄中有多出來的 +

執行 getfacl Roadmap 可取得 ACL 的詳細資訊:

# file: Roadmap
# owner: tux
# group: project3
user::rw-
user:jane:rw-       effective: r--
group::r--
group:djungle:rw-   effective: r--
mask::r--
other::---

輸出的前三行資訊,使用 ls -l 便能取得。這幾行僅敘述檔案名稱、擁有者和所屬群組。4 到 9 行記錄 ACL 項目。傳統存取許可權代表使用 ACL 時,可能的子集合。此 ACL 範例中,授與讀取和寫入存取權給檔案擁有者和使用者 jane (第 4 和 5 行)。傳統概念已經擴充,允許額外的使用者存取。群組存取權也適用相同的處理方式。所屬群組保存讀取許可權 (第 6 行) 和群組 djungle 具有讀取和寫入許可權。第 8 行的 mask 項目會減低使用者 jane 和群組 djungle 的有效許可權,只剩下讀取權限。其他使用者和群組沒有檔案的任何存取權 (第 9 行)。

在此僅提供最基本的資訊。在 章 24, Linux 存取控制清單 可以找到更多 ACL 的相關詳細資訊。