學習案例:設定多人共用的安全 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 環境下團隊協作的權限痛點。這是在真實工作場景中非常實用的一項核心技能。
留言