3.4. 權限
前一頁 | 章 3. FreeBSD 基礎 | 下一頁

## 3.4. 權限

在 FreeBSD 中，每個檔案與目都有相關聯的數個權限，且有許多工具可以檢視與修改這些權限。了解權限如何運作是必須的，這可確保使用者能夠存存取它們所需的檔案以及無法不正確的存取供作業系統或其他使用者擁有的檔案。

本節會探討在 FreeBSD 中所用到的傳統 UNIX® 權限。要做檔案系統存取控制的微調，請參考 節 13.9, “存取控制清單”。

在 UNIX®，基礎權限透過三種類型的存取來分配：讀取、寫入與執行。這些存取類型用來決定檔案擁有者、群組以及其他人 (其他任何人) 的檔案存取權。讀取、寫入及執行權限可使用 `r`, `w`, and `x` 字母來表示。這些權限也可以使用二進位數字來表示每種權限的開或關 (`0`)。當以二進位數字來表示時，閱讀的順序為 `rwx`，其中 `r` 開啟的值為 `4`，`w` 開啟的值為 `2` 以及 `x` 開啟的值為 `1`。

表格 4.1 摘要了可用的數字及可用的字母。當閱讀 “目錄清單標示” 欄位時，`-` 用來代表該權限設為關閉。

表格 3.2. UNIX® 權限

數值 | 權限 | 目錄清單標示
--- | --- | ---
0 | 不可讀取, 不可寫入, 不可執行 | `---`
1 | 不可讀取, 不可寫入, 可執行 | `--x`
2 | 不可讀取, 可寫入, 不可執行 | `-w-`
3 | 不可讀取, 可寫入, 可執行 | `-wx`
4 | 可讀取, 不可寫入, 不可執行 | `r--`
5 | 可讀取, 不可寫入, 可執行 | `r-x`
6 | 可讀取, 可寫入, 不可執行 | `rw-`
7 | 可讀取, 可寫入, 可執行 | `rwx`

使用 ls(1) 指令時，可以加上 `-l` 參數， 來檢視詳細的目錄清單。 清單中欄位的資訊包含檔案對所有者、群組及其他人的權限。 在任一個目錄底下執行 `ls -l`，會顯示如下的結果：

    % ls -l
    total 530
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
    -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt

第一個 (最左邊) 的字元用來表示這個檔案的類型為何，除標準檔案以外，尚有目錄、特殊字元裝置、Socket 及其他特殊虛擬檔案裝置， 在此例當中，`-` 表示該檔案為一個標準的檔案。 範例中接下來的三個字元中，`rw-` 代表所有者對檔案擁有的權限。 再接下來的三個字元， `r--` 則代表群組對檔案擁有的權限， 最後三個字元，`r--` 則代表其他人對檔案擁有的權限。 破折號 (-) 表示沒有權限，範例中的這個檔案的權限， 只允許所有者讀取、寫入檔案，群組以及其他人僅能讀取檔案。 根據以上的表格，此種權限的檔案可以使用 `644` 來表示， 每組數字分別代表檔案的三種權限。

那系統如何控制裝置的權限？ 實際上 FreeBSD 對大多的硬碟裝置就如同檔案，程式可以開啟、讀取以及寫入資料如一般檔案。 這些特殊裝置檔案都儲存於 `/dev/` 目錄中。

目錄也同如檔案，擁有讀取、寫入及執行的權限， 但在執行權限上與檔案有明顯的差異。 當目錄被標示為可執行時，代表可以使用 cd(1) 指令切換進入該目錄。 也代表能夠存取在此目錄之中的已知檔名的檔案，但仍會受限於檔案本身所設定的權限。

要能夠列出目錄內容，必須擁有目錄的讀取權限。 要刪除已知檔名的檔案，必須擁有檔案所在目錄的寫入 以及 執行的權限。

還有一些權限位元，但這些權限主要在特殊情況使用，如 setuid 執行檔及 sticky 目錄。 如果您還想知道更多檔案權限的資訊及使用方法，請務必參閱 chmod(1)。

### 3.4.1. 權限符號

Contributed by Tom Rhodes.

權限符號可稱做符號表示，使用字元的方式來取代使用數值來設定檔案或目錄的權限。 符號表示的格式依序為 (某人)(動作)(權限)，可使用的符號如下：

項目 | 字母 | 代表意義
--- | --- | ---
(某人) | u | 使用者
(某人) | g | 群組所有者
(某人) | o | 其他
(某人) | a | 全部 (“world”)
(動作) | + | 增加權限
(動作) | - | 移除權限
(動作) | = | 指定權限
(權限) | r | 讀取
(權限) | w | 寫入
(權限) | x | 執行
(權限) | t | Sticky 位元
(權限) | s | 設定 UID 或 GID

如先前同樣使用 chmod(1) 指令來設定，但使用的參數為這些字元。 例如，您可以使用下列指令禁止其他使用者存取檔案 `FILE`：

    % chmod go= FILE

若有兩個以上的符號表示可以使用逗號 (,) 區隔。 例如，下列指令將會移除群組及其他人對檔案 `FILE` 的寫入權限， 並使全部人 (“world”) 對該檔有執行權限。

    % chmod go-w,a+x FILE

### 3.4.2. FreeBSD 檔案旗標

Contributed by Tom Rhodes.

除了前面提到的檔案權限外，FreeBSD 支援使用 “檔案旗標”。 這些旗標增加了檔案的安全性及管理性，但不包含目錄。有了檔案旗標可確保在某些時候 `root` 不會意外將檔案修改或移除。

修改的檔案 flag 僅需要使用擁有簡易的介面的 chflags(1) 工具。 例如，標示系統禁止刪除的旗標於檔案 `file1`，使用下列指令：

    # chflags sunlink file1

若要移除系統禁止刪除的旗標，只需要簡單在 `sunlink` 前加上 “no”，例如：

    # chflags nosunlink file1

使用 ls(1) 及參數 `-lo` 可檢視檔案目前的旗標：

    # ls -lo file1

    -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

多數的旗標僅能由 `root` 使用者來標示或移除，而部份旗標可由檔案所有者設定。 我們建議系統管理者可閱讀 chflags(1) 及 chflags(2) 說明以瞭解相關細節。

### 3.4.3. `setuid` 、`setgid` 與 `sticky` 權限

Contributed by Tom Rhodes.

除了已經探討過的權限外，這裡尚有另外三種特別的設定所有管理者都應該知道，這些設定為 `setuid`, `setgid` 以及 `sticky` 權限。

這些設定對某些一般不會授權給一般使用者的 UNIX® 操作非常重要，它讓這些功能可運作。要了解這些權限，就必須說明真實使用者 ID (Real user ID) 與有效使用者 ID (Effective user ID) 的差異。

真實使用者 ID 即是擁有者或啟動程序者的 UID，而有效 UID 是執行程序所使用的使用者 ID。例如，passwd(1) 在使用者更改自己的密碼時會以真實使用者 ID 執行，然而，為了要更新密碼資料庫，該指令必須以 `root` 使用者做為有效 ID 來執行，這讓使用者可以更改自己的密碼而不會遇到權限不足 (Permission Denied) 的錯誤。

setuid 權限可以透過在權限集前加上數字 (4) 來設定，如下範例所示：

    # chmod 4755 suidexample.sh

現在 ``suidexample.sh`` 的權限會如下所示：

    -rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

注意，`s` 現在取代了原來的執行位元成為指定檔案擁有者權限集的一部份，這會允許須要提升權限的工具，如 passwd(1) 可正常使用。

### 注意:

mount(8) 的 `nosuid` 選項會造成這類 Binary 執行失敗，但不會警告使用者。由於 `nosuid` Wrapper 可能可繞過該選項，因此該選項並非完全可靠。

實際來看這個範例，先開啟兩個終端機，其中一個用一般使用者輸入 `passwd`。在等待輸入新密碼的同時，檢查程序表並查看 passwd(1) 程序的使用者資訊：

於終端機 A：

    Changing local password for trhodes
    Old Password:

於終端機 B：

    # ps aux | grep passwd

    trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
    root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

雖然使用一般使用者來執行 passwd(1)，但該程序使用了 `root` 的有效 UID。

`setgid` 權限的功能與 `setuid` 相似，當應用程式或工具使用此設定執行時，將會以擁有該檔案的群組來執行，而非執行行該程序的使用者。

要在檔案設定 `setgid` 權限，需在 chmod(1) 的參數前加上 (2)：

    # chmod 2755 sgidexample.sh

注意以下清單中，`s` 現在位於指定群組權限設定的欄位：

    -rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

### 注意:

在以上這些範例中，雖然在例子中的 Shell script 是可執行的檔案，但並不會以其他的 EUID 或有效使用者 ID 執行，這是因為 Shell script 並不會存取 setuid(2) 系統呼叫 (System call)。

`setuid` 及 `setgid` 權限位元可能會因允許提升權限而降低系統的安全性，因此有了第三個特殊的權限：`sticky bit`，可以加強系統的安全性。

當在目錄上設定 `sticky bit`，將只允許由檔案擁有者刪除檔案。這對避免公開目錄，如 `/tmp` 中的檔案被不擁有該檔案的人刪除非常有用。要使用這個權限，可在權限集前加上 (1)：

    # chmod 1777 /tmp

`sticky bit` 權限會以 `t` 顯示於權限集的最後：

    # ls -al / | grep tmp

    drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

前一頁 | 上一層 | 下一頁
3.3. 使用者與基礎帳號管理 | 起始頁 | 3.5. 目錄結構

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。