Linux 檔案權限系統遠比「rwx」三組字元複雜。除了基本的擁有者/群組/其他人權限外,umask 決定預設權限,setuid/setgid/sticky 特殊位元改變執行語義,ACL(存取控制清單)提供更細粒度的權限控制。本文深度解析這些「隱藏」機制。

一、umask:預設權限遮罩
查看目前 umask
umask # 八進位顯示,如 0022
umask -S # 符號模式顯示,如 u=rwx,g=rx,o=rx
umask 運作邏輯
- 檔案預設最大權限:
666(rw-rw-rw-,無執行權限)
- 目錄預設最大權限:
777(rwxrwxrwx,需執行權限進入)
- 實際權限 = 預設最大權限 - umask
實例演示
$ umask
0022
$ touch file1
$ mkdir dir1
$ ls -l
-rw-r--r-- 1 root root 0 ... file1 # 666 - 022 = 644
drwxr-xr-x 2 root root 4096 ... dir1 # 777 - 022 = 755
$ umask 002
$ touch file2
$ mkdir dir2
$ ls -l
-rw-rw-r-- 1 root root 0 ... file2 # 666 - 002 = 664
drwxrwxr-x 2 root root 4096 ... dir2 # 777 - 002 = 775
常見 umask 值對照
| umask | 檔案權限 | 目錄權限 | 適用場景 |
| 022 | 644 (rw-r--r--) | 755 (rwxr-xr-x) | Root 預設,安全導向 |
| 002 | 664 (rw-rw-r--) | 775 (rwxrwxr-x) | 一般使用者,群組協作 |
| 077 | 600 (rw-------) | 700 (rwx------) | 高安全性,完全私有 |
| 027 | 640 (rw-r-----) | 750 (rwxr-x---) | 群組共享,其他無權限 |
永久設定 umask
# 個人設定
echo "umask 002" >> ~/.bashrc
# 系統全域
echo "umask 022" >> /etc/profile
# 或編輯 /etc/login.defs:UMASK 022
二、特殊權限位元
1. SetUID (s/S) — 檔案執行時以擁有者權限執行
chmod u+s /path/to/executable
# 或
chmod 4755 /path/to/executable
- 典型案例:
/usr/bin/passwd(一般使用者修改密碼需寫入 /etc/shadow,需 root 權限)
- 顯示:
-rwsr-xr-x(擁有者 x 位置變 s)
- 大寫
S 表示無執行權限但設定了 SetUID(無效配置)
2. SetGID (s/S) — 檔案/目錄的群組繼承行為
- 檔案:執行時以檔案群組權限執行(
chmod g+s file,2755)
- 目錄:新建檔案/子目錄自動繼承該目錄的群組(協作目錄必備)
- 目錄顯示:
drwxrwsr-x
# 團隊共享目錄最佳實踐
mkdir /shared/team
chgrp devteam /shared/team
chmod 2775 /shared/team # SetGID + 群組可寫
# 此後所有成員建立的檔案群組自動為 devteam
3. Sticky Bit (t/T) — 目錄防刪除保護
chmod +t /tmp
# 或
chmod 1777 /tmp
- 設定後,只有檔案擁有者、目錄擁有者、root 可刪除/重命名目錄下的檔案
- 典型案例:
/tmp、/var/tmp
- 顯示:
drwxrwxrwt(其他人 x 位置變 t)
- 大寫
T 表示無執行權限但設定 Sticky(無效配置)
三、ACL(存取控制清單)— 突破 UGO 限制
當需要針對「特定使用者」或「特定群組」給予不同權限時,ACL 是標準解法。
啟用 ACL
# 檢查檔案系統是否掛載 acl 選項
mount | grep acl
# /etc/fstab 加入 acl 選項後重新掛載
mount -o remount,acl /home
ACL 操作指令
# 設定使用者 ACL
setfacl -m u:alice:rwx /project/data
# 設定群組 ACL
setfacl -m g:devteam:rw /project/data
# 設定預設 ACL(目錄:新建檔案自動繼承)
setfacl -d -m u:alice:rwx /project/data
# 查看 ACL
getfacl /project/data
# 移除特定 ACL
setfacl -x u:alice /project/data
# 移除所有 ACL
setfacl -b /project/data
ACL 輸出範例
# file: project/data
# owner: root
# group: devteam
user::rwx
user:alice:rwx # 有效權限:rwx
group::r-x
group:devteam:rw- # 有效權限:rw-
mask::rwx # 最大有效權限遮罩
other::r--
default:user::rwx
default:user:alice:rwx
default:group::r-x
default:group:devteam:rw-
default:mask::rwx
default:other::r--
四、ls -l 權限欄位完整解讀
- r w s r w x r - t
│ │ │ │ │ │ │ │ └─ 其他人執行 + Sticky
│ │ │ │ │ │ │ └──── 其他人寫入
│ │ │ │ │ │ └────── 其他人讀取
│ │ │ │ │ └──────── 群組執行 + SetGID
│ │ │ │ └────────── 群組寫入
│ │ │ └──────────── 群組讀取
│ │ └────────────── 擁有者執行 + SetUID
│ └──────────────── 擁有者寫入
└────────────────── 擁有者讀取 + 檔案類型(-=檔案 d=目錄 l=連結等)
五、權限數值對照表(含特殊位元)
| 數值 | 含義 |
| 4000 | SetUID |
| 2000 | SetGID |
| 1000 | Sticky Bit |
| 0777 | 基本權限 |
組合範例:4755 = SetUID + rwxr-xr-x,2775 = SetGID + rwxrwxr-x,1777 = Sticky + rwxrwxrwx
深入理解 umask、特殊位元與 ACL,能讓您精準控管 Linux 檔案存取安全,滿足從個人桌面到企業級多租戶環境的多樣化需求。