學習案例:設定多人共用的安全 Web 目錄

# 實戰案例:設定多人共用的安全 Web 目錄


## 情境介紹 (The Core Problem)

您是公司的系統管理員,目前正在管理一台 Web 伺服器。有兩位網頁開發者,`alice` 和 `bob`,他們需要共同開發一個位於 `/var/www/project_alpha` 的新網站。


**您的核心挑戰是:**

1.  `alice` 和 `bob` 都必須能夠在 `/var/www/project_alpha` 目錄中新增、編輯和刪除檔案。

2.  為了解決協作問題,`alice` 建立的檔案,`bob` 必須能夠編輯,反之亦然。

3.  系統上其他的無關使用者,絕對不能對此目錄有寫入權限。

4.  最終,網站伺服器軟體(例如 Nginx,通常以 `www-data` 使用者身份運行)需要能夠讀取這些檔案,以便將網頁呈現給訪客。


---


## 階段一:【建立協作團隊與成員】


* **問題:** 「首先,我需要為開發者 `alice` 和 `bob` 建立系統帳號,並將他們納入一個名為 `webdevs` 的共同開發群組中。」


* **操作與解說 (以 `root` 或具備 `sudo` 權限的使用者執行):**


    1.  **建立 `webdevs` 群組:**

        ```bash

        sudo groupadd webdevs

        ```

        * **`groupadd`**: 用於建立一個新的使用者群組。


    2.  **建立使用者 `alice`,並將其主要群組設為 `webdevs`:**

        ```bash

        sudo useradd -m -s /bin/bash -g webdevs alice

        ```

        * **`useradd`**: 建立新使用者。

        * `-m`: 自動建立使用者的家目錄 (`/home/alice`)。

        * `-s /bin/bash`: 設定使用者登入後預設使用的 Shell。

        * `-g webdevs`: 將使用者的「主要群組」直接設定為 `webdevs`。


    3.  **建立使用者 `bob`,同樣加入 `webdevs` 群組:**

        ```bash

        sudo useradd -m -s /bin/bash -g webdevs bob

        ```


    4.  **為新使用者設定密碼:**

        ```bash

        sudo passwd alice

        sudo passwd bob

        ```

        * 依提示輸入兩次新密碼。


    5.  **驗證使用者與群組設定:**

        ```bash

        id alice

        # 預期輸出:uid=1001(alice) gid=1001(webdevs) groups=1001(webdevs)

        id bob

        # 預期輸出:uid=1002(bob) gid=1001(webdevs) groups=1001(webdevs)

        ```

        * **`id`**: 檢查使用者的身份識別碼。確認 `gid` (群組ID) 和 `groups` 都指向了 `webdevs`。


---


## 階段二:【準備共用工作區】


* **問題:** 「使用者帳號有了,現在我需要在 `/var/www/` 底下建立專案目錄 `project_alpha`,並將這個目錄的所有權指派給我們的 `webdevs` 團隊。」


* **操作與解說:**


    1.  **建立專案目錄:**

        ```bash

        sudo mkdir -p /var/www/project_alpha

        ```

        * `-p`: 確保上層目錄 `/var/www` 如果不存在,也會一併被建立。


    2.  **變更目錄的群組所有權:**

        為了安全,我們讓目錄的「擁有者」維持為 `root`,但將「所屬群組」變更為 `webdevs`。

        ```bash

        sudo chown root:webdevs /var/www/project_alpha

        ```

        * **`chown`**: "Change Owner",用於變更檔案或目錄的擁有者與群組。格式為 `擁有者:群組`。


    3.  **驗證所有權設定:**

        ```bash

        ls -ld /var/www/project_alpha

        ```

        * **預期輸出:**

        `drwxr-xr-x 2 root webdevs 4096 Oct  2 14:00 /var/www/project_alpha`

        * 確認擁有者是 `root`,群組是 `webdevs`。


---


## 階段三:【設定協作權限的魔法:SGID】


* **問題:** 「如果只設定普通權限,`alice` 建立的檔案,群組會是 `alice`,`bob` 可能無權修改。如何設定一個『繼承』規則,讓任何人在這個目錄裡建立的新檔案或新資料夾,都自動屬於 `webdevs` 群組?」


* **操作與解說:**

    * 這裡的關鍵是設定 **SGID (Set Group ID)** 特殊權限。


    1.  **設定目錄的基礎權限為 `775`:**

        ```bash

        sudo chmod 775 /var/www/project_alpha

        ```

        * **`chmod`**: "Change Mode",用於變更權限。

        * `775` 意義:

            * `7` (擁有者 `root`): 讀 (`r`=4) + 寫 (`w`=2) + 執行 (`x`=1) = 7

            * `7` (群組 `webdevs`): 讀 + 寫 + 執行 = 7

            * `5` (其他人): 讀 + 執行 = 5


    2.  **為目錄加上 SGID 權限:**

        ```bash

        sudo chmod g+s /var/www/project_alpha

        ```

        * `g+s`: 為群組 (`g`) 加上 (`+`) SGID (`s`) 權限。


    3.  **驗證最終權限:**

        ```bash

        ls -ld /var/www/project_alpha

        ```

        * **預期輸出:**

        `drwxr-sr-x 2 root webdevs 4096 Oct  2 14:00 /var/www/project_alpha`

        * **注意看!** 原本群組的執行權 `x`,現在變成了 `s`。這就代表 SGID 已成功設定。


---


## 階段四:【實戰演練與驗證】


* **問題:** 「設定完成了,我們來實際模擬 `alice` 和 `bob` 的協作流程,看看是否真的解決了問題。」


* **操作與解說:**


    1.  **切換為 `alice` 身份:**

        ```bash

        su - alice

        ```

    2.  **`alice` 進入專案目錄並建立檔案:**

        ```bash

        cd /var/www/project_alpha

        echo "Alice's first line" > index.html

        ls -l index.html

        ```

        * **預期輸出:** `-rw-rw-r-- 1 alice webdevs 21 Oct  2 14:05 index.html`

        * **驗證成功!** `index.html` 的所屬群組自動變成了 `webdevs`。


    3.  **登出 `alice`,切換為 `bob` 身份:**

        ```bash

        exit

        su - bob

        ```

    4.  **`bob` 進入專案目錄,並嘗試編輯 `alice` 的檔案:**

        ```bash

        cd /var/www/project_alpha

        echo "Bob added a new line" >> index.html

        cat index.html

        ```

        * **預期結果:** 指令成功執行,證明 `bob` 確實有權限修改 `alice` 建立的檔案!


    5.  **`bob` 建立一個自己的目錄:**

        ```bash

        mkdir images

        ls -ld images

        ```

        * **預期輸出:** `drwxr-sr-x 2 bob webdevs 4096 Oct  2 14:10 images`

        * **驗證成功!** `images` 目錄的群組也是 `webdevs`,並且也繼承了 `s` 權限。


    6.  **最後,讓網站伺服器 `www-data` 也能讀取檔案**

        回到管理者帳號 (`exit` 登出 `bob`),執行:

        ```bash

        sudo usermod -aG webdevs www-data

        ```

        * **`usermod -aG`**: 將一個使用者**附加 (`a`)**到某個**群組 (`G`)**中。


---


## 任務總結

恭喜!您已成功建立並驗證了一個安全、高效的多人協作目錄。透過**使用者/群組管理 (`useradd`, `groupadd`)**、**所有權變更 (`chown`)** 和**權限設定 (`chmod`)**,特別是利用了 **SGID (`g+s`)** 的繼承特性,您從根本上解決了 Linux 環境下團隊協作的權限痛點。這是在真實工作場景中非常實用的一項核心技能。

留言