Linux 群組權限管理教學:chmod、chown 與 group 設定

2024/01/18

Linux 中,群組權限(Group Permissions) 是多人協作與系統安全的基礎。了解 owner、group、others 三種身份,掌握 chmodchownchgrp 指令,以及群組管理的完整流程,是每個 Linux 使用者的必備技能。

Linux 權限基礎

Linux 採用嚴格的存取控制機制,每個檔案和目錄都有三種身份(Identity)和三種權限(Permission)的組合。

三種身份

身份說明符號
Owner(擁有者)建立該檔案的使用者,通常是最高權限u(user)
Group(群組)擁有者所屬的群組,群組成員共享相同權限g(group)
Others(其他人)不屬於擁有者也不在群組內的所有其他使用者o(others)

三種權限

權限符號數值對檔案的意義對目錄的意義
Read(讀取)r4可以讀取檔案內容可以列出目錄內容(ls
Write(寫入)w2可以修改、刪除檔案可以在目錄中新增、刪除檔案
Execute(執行)x1可以執行此檔案(腳本或程式)可以進入此目錄(cd

讀懂 ls -l 輸出

$ ls -l my_file.txt
-rw-r--r-- 1 benz developers 1024 Jan 18 10:00 my_file.txt

逐欄解讀:

-  rw-  r--  r--  1  benz  developers  1024  Jan 18 10:00  my_file.txt
│   │    │    │   │    │       │          │
│   │    │    │   │    │       │          └── 檔案大小(bytes)
│   │    │    │   │    │       └──────────── 群組名稱
│   │    │    │   │    └──────────────────── 擁有者名稱
│   │    │    │   └───────────────────────── 硬連結數量
│   │    │    └───────────────────────────── others(其他人)的權限
│   │    └────────────────────────────────── group(群組)的權限
│   └─────────────────────────────────────── owner(擁有者)的權限
└─────────────────────────────────────────── 檔案類型(- 是一般檔案,d 是目錄)

數字表示法(Numeric Notation)

權限可以用數字來表示,把三種權限的數值加起來:

數字權限組合符號說明
74+2+1rwx讀取 + 寫入 + 執行(完整權限)
64+2rw-讀取 + 寫入(一般檔案常用)
54+1r-x讀取 + 執行
44r--只有讀取
00---無任何權限

三位數字代表三種身份:

755 = rwx r-x r-x
      │   │   └── others: 可讀、可執行(不可寫)
      │   └────── group: 可讀、可執行(不可寫)
      └────────── owner: 可讀、可寫、可執行(完整權限)

644 = rw- r-- r--
      │   │   └── others: 只有讀取
      │   └────── group: 只有讀取
      └────────── owner: 可讀、可寫(不可執行)

chmod 指令完整用法

chmod(change mode)用來修改檔案或目錄的存取權限。

數字模式(Numeric Mode)

# 腳本給予擁有者完整權限,群組和其他人只能讀取和執行
chmod 755 script.sh
# -rwxr-xr-x

# 一般文件設定:擁有者可讀寫,其他人只能讀取
chmod 644 document.txt
# -rw-r--r--

# 只有擁有者能讀寫(私密設定檔常用)
chmod 600 ~/.ssh/id_rsa
# -rw-------

# 目錄通常設 755 讓其他人可以進入
chmod 755 /var/www/html

# 遞迴修改整個目錄及其所有內容
chmod -R 755 /var/www/html

符號模式(Symbolic Mode)

符號模式更直覺,適合只修改某個特定身份的某個權限:

# u=owner, g=group, o=others, a=all(三者)
# +=新增, -=移除, ==設定(完整覆蓋)

# 給擁有者加上執行權限
chmod u+x script.sh

# 移除群組的寫入權限
chmod g-w file.txt

# 設定其他人的權限為只有讀取(完整覆蓋)
chmod o=r file.txt

# 給所有人加上讀取權限
chmod a+r document.txt

# 同時設定多個身份的權限
chmod u=rw,g=r,o=r document.txt
# 等同於 chmod 644 document.txt

# 遞迴修改(符號模式也支援 -R)
chmod -R g+rw /home/benz/shared/

chown 指令

chown(change owner)用來修改檔案或目錄的擁有者,也可以同時修改群組。

# 查看目前擁有者
ls -l file.txt

# 修改擁有者(需要 root 或 sudo 權限)
sudo chown benz file.txt

# 同時修改擁有者和群組(格式:owner:group)
sudo chown benz:developers file.txt

# 只修改群組(擁有者不變):在冒號前留空
sudo chown :developers file.txt

# 遞迴修改整個目錄
sudo chown -R benz:developers /home/benz/projects/

# 實用範例:修正 web 伺服器檔案權限
sudo chown -R www-data:www-data /var/www/html/

chgrp 指令

chgrp(change group)用來單獨修改檔案或目錄的所屬群組

# 修改單一檔案的群組
sudo chgrp developers file.txt

# 修改目錄及其所有內容的群組
sudo chgrp -R developers /home/benz/projects/

# 確認修改結果
ls -l file.txt
# -rw-r--r-- 1 benz developers 1024 Jan 18 10:00 file.txt

群組管理指令

查看群組資訊

# 查看目前使用者所屬的所有群組
groups

# 查看指定使用者的群組
groups benz

# 查看詳細的使用者和群組 ID 資訊
id

# 查看系統中所有群組(格式:群組名稱:密碼:GID:成員列表)
cat /etc/group

# 搜尋特定群組
grep "developers" /etc/group

建立和管理群組

# 建立新群組
sudo groupadd developers

# 建立指定 GID 的群組
sudo groupadd -g 1050 developers

# 將使用者加入群組(-aG 是附加模式,不移除其他群組)
sudo usermod -aG developers benz
sudo usermod -aG docker benz

# 從群組中移除使用者
sudo gpasswd -d benz developers

# 刪除群組
sudo groupdel developers

# 注意:修改群組後,使用者需要重新登入(或執行 newgrp)才能生效
newgrp developers

實用範例

範例一:團隊共享目錄設定

假設你有一個開發團隊,成員需要共用 /srv/project 目錄:

# 1. 建立群組
sudo groupadd dev-team

# 2. 將成員加入群組
sudo usermod -aG dev-team alice
sudo usermod -aG dev-team bob
sudo usermod -aG dev-team charlie

# 3. 建立共享目錄並設定擁有者和群組
sudo mkdir -p /srv/project
sudo chown root:dev-team /srv/project

# 4. 設定權限:擁有者完整權限,群組可讀寫,其他人無權限
sudo chmod 770 /srv/project

# 5. 設定 setgid bit:確保在此目錄下建立的新檔案都自動屬於 dev-team
sudo chmod g+s /srv/project

# 確認設定
ls -ld /srv/project
# drwxrws--- 2 root dev-team 4096 Jan 18 10:00 /srv/project

範例二:Web 伺服器檔案權限設定

# Nginx / Apache 的 web root 目錄標準權限設定
# Web 伺服器進程(www-data)需要讀取所有檔案,但不應該有寫入權限

# 設定目錄擁有者為你的帳號,群組為 www-data
sudo chown -R benz:www-data /var/www/html/mysite

# 目錄:擁有者完整權限,群組和其他人只能讀取和進入
find /var/www/html/mysite -type d -exec chmod 755 {} \;

# 一般檔案:擁有者可讀寫,群組和其他人只能讀取
find /var/www/html/mysite -type f -exec chmod 644 {} \;

# 如果有需要 PHP 寫入的目錄(如上傳目錄),開放群組寫入
sudo chmod 775 /var/www/html/mysite/uploads
sudo chown www-data:www-data /var/www/html/mysite/uploads

範例三:保護敏感設定檔

# SSH 私鑰:只有擁有者可以讀寫,其他人完全無法存取
chmod 600 ~/.ssh/id_rsa
# -rw-------

# SSH 公鑰:可以讓其他人讀取
chmod 644 ~/.ssh/id_rsa.pub

# .env 設定檔(含資料庫密碼等敏感資訊):只有擁有者能讀寫
chmod 600 .env

# 整個 .ssh 目錄只有擁有者能進入
chmod 700 ~/.ssh

# 如果 SSH 私鑰權限不對,SSH 登入會失敗並報錯:
# "Permissions 0644 for '/home/benz/.ssh/id_rsa' are too open."

常見問題(FAQ)

Q1:755 和 644 分別適合哪些使用情境?

這兩個是最常見的權限設定:

  • 755(rwxr-xr-x):適合目錄可執行腳本。擁有者可以完全控制,群組和其他人可以進入目錄和執行腳本,但不能修改內容。
  • 644(rw-r–r–):適合一般文件(HTML、CSS、圖片、設定檔等)。擁有者可以讀寫,群組和其他人只能讀取。

Q2:usermod -aGusermod -G 有什麼差別?一定要加 -a 嗎?

這個差別非常重要,請務必記住:

# 危險!-G 會「取代」使用者的所有群組
sudo usermod -G developers benz
# 如果 benz 原本在 sudo、docker 群組,執行後會全部消失!
# benz 只剩下 developers 這一個附加群組

# 正確!-aG 是「附加(append)」到群組,不影響現有群組
sudo usermod -aG developers benz
# benz 原本的 sudo、docker 群組都保留,再加上 developers

所以一定要加 -a 參數,否則使用者可能會突然失去 sudo 等重要權限。

Q3:我已經設定了權限,為什麼還是無法進入目錄?

目錄需要「執行權限(x)」才能進入(cd 進去)。只有讀取權限(r)只能列出目錄內容(ls),但無法實際進入。

# 如果目錄是 dr--r--r--(沒有 x)
ls directory/   # 可以列出,但...
cd directory/   # 錯誤:Permission denied

# 正確設定:目錄需要 x 才能進入
chmod 755 directory/   # rwxr-xr-x,可以進入
chmod 711 directory/   # rwx--x--x,可以進入但不能列出內容

# 父目錄也要有 x 權限
# 例如要存取 /home/benz/data/,路徑上每個目錄都需要 x 權限

延伸閱讀: