最後更新日期: 2025 年 4 月 26 日
引言
你有沒有想過,Linux 伺服器為什麼能讓一堆人同時用,還不怕資料被亂搞?這全靠 訪問控制(Access Control),Linux 系統的安全大門!它決定誰能看、改、跑哪些檔案或程式,保護你的資料不被偷、不被搞亂,還確保大家都能順利用系統。
Linux 的訪問控制超靈活,從簡單的檔案權限到進階的存取控制清單(ACL),再到超強的 SELinux 和 AppArmor,層層把關。這篇是 Linux 訪問控制系列的第一篇,用超簡單的語言,從零教你怎麼用這些工具。我們從最基本的檔案權限開始,一步步進階到 ACL 和強制訪問控制(MAC),讓你從新手變成安全小達人。本文適合用 RHEL、Ubuntu 或任何 Linux 發行版的人,無論你是初學者還是想複習的管理員。
這篇會講:
- 訪問控制是什麼?為啥重要
- 基礎檔案權限:最簡單的起手式
- 存取控制清單(ACL):進階權限玩法
- 自主 vs. 強制控制:DAC 和 MAC 的差別
- 實務範例:從簡單到高階的應用
- SELinux 和 AppArmor 初體驗
- 怎麼用得更好?最佳技巧與資源
1. 訪問控制是什麼?為啥重要
1.1 訪問控制的角色
訪問控制是 Linux 的安全保鑣,決定誰能碰哪些東西。它的目標是:
- 保密:不讓外人偷看你的私密檔案,像密碼或個人資料。
- 完整:不讓人亂改你的檔案,確保資料沒被搞壞。
- 順暢:讓有權限的人能正常用檔案,不被卡住。
想像你的 Linux 伺服器是一間大圖書館,裡面有很多書(檔案)和房間(目錄)。訪問控制就像管理員,決定誰能借哪本書、誰能進哪個房間。如果沒這層保護,隨便誰都能亂翻書、塗鴉,甚至偷走東西!
1.2 訪問控制的兩大類
Linux 的訪問控制分兩種:
- 自主訪問控制(DAC, Discretionary Access Control):檔案主人說了算,決定誰能看、改。像普通檔案權限和 ACL 就是這類。
- 強制訪問控制(MAC, Mandatory Access Control):系統訂規則,就算主人或
root
也得聽。SELinux 和 AppArmor 是這類。
1.3 檔案系統的影響
訪問控制跟檔案系統(像 ext4、XFS、Btrfs)有關。不同檔案系統支援的功能不一樣,比如 ext4 能用 ACL 和 SELinux,但老舊的 FAT32 就不行。檢查你的檔案系統:
df -T
1.4 怎麼學?從簡單到進階
這篇會從最簡單的檔案權限開始,慢慢進階到 ACL 和 MAC,讓你一步步上手。範例會從保護單個檔案到搞定多人協作,幫你學得又快又紮實。
2. 基礎檔案權限:最簡單的起手式
2.1 基本概念
Linux 的檔案權限是最簡單的訪問控制,像給每個檔案或目錄貼張「誰能幹什麼」的標籤。它分成三類人:
- 擁有者(User):檔案的創建者或指定主人。
- 群組(Group):一堆用戶的集合,方便多人共享。
- 其他(Others):系統裡的其他人。
每類人能有三種權限:
- 讀取(Read, r):能看檔案內容(像
cat file.txt
)或列出目錄(像ls dir
)。 - 寫入(Write, w):能改檔案內容或在目錄裡加刪檔案。
- 執行(Execute, x):能跑程式(像
./script.sh
)或進目錄(像cd dir
)。
2.2 權限怎麼看
權限有兩種表示法:
- 符號表示:像
rwxr-xr-x
,意思是擁有者能讀寫跑(rwx
),群組和其他人只能讀和跑(r-x
)。 - 數字表示:像
755
,讀=4,寫=2,跑=1,加起來表示權限(rwx
= 4+2+1 = 7)。
檢查權限:
ls -l
輸出:
-rwxr-xr-x 1 alice users 4096 Apr 26 2025 script.sh
-rwxr-xr-x
:權限(擁有者rwx
,群組r-x
,其他r-x
)。1
:硬連結數。alice users
:擁有者和群組。4096
:檔案大小。Apr 26 2025
:修改時間。script.sh
:檔案名。
2.3 怎麼改權限
用 chmod
改權限:
- 符號方式:
chmod u+x script.sh # 給擁有者加跑的權限
chmod go-r script.sh # 拿掉群組和其他人的讀權限
chmod 755 script.sh # 設成 rwxr-xr-x
chmod 644 file.txt # 設成 rw-r--r--
用 chown
和 chgrp
改擁有者和群組:
chown bob script.sh # 改擁有者為 bob
chgrp dev script.sh # 改群組為 dev
chown bob:dev script.sh # 一次改兩者
2.4 特殊權限:進階小招
除了基本的讀、寫、執行權限,Linux 還有三種特殊權限,超實用,讓你能更靈活地控制檔案和目錄的行為。這三招分別是 SetUID、SetGID 和 Sticky Bit,各有獨特功能,常用在多人環境或需要特殊權限的場景。讓我們來一一拆解它們的用法、例子和注意事項!
2.4.1 SetUID:借用主人身份跑程式
什麼是 SetUID? SetUID(Set User ID)讓普通用戶在執行某個程式時,暫時用檔案擁有者的身份跑,而不是自己的身份。這在需要高權限的程式超有用,比如修改密碼的 passwd
程式。普通用戶沒權限改 /etc/shadow
(密碼檔案),但 passwd
設了 SetUID,就能讓你用 root
身份跑,安全又方便。
怎麼設? 用 chmod u+s
開啟 SetUID,權限會在「擁有者」的執行位(x)顯示為 s
:
chmod u+s program
檢查 SetUID:用 ls -l
看,SetUID 會出現在權限的第四位(原本的 x
變 s
):
ls -l /usr/bin/passwd
輸出:
-rwsr-xr-x 1 root root 68208 Apr 26 2025 /usr/bin/passwd
這裡的 rws
表示 SetUID 開啟,普通用戶跑 passwd
時會用 root
身份。
範例:假設你寫了個程式 /usr/local/bin/mytool
,需要用 root
身份跑來改系統設定:
sudo chown root /usr/local/bin/mytool
sudo chmod u+s /usr/local/bin/mytool
ls -l /usr/local/bin/mytool
輸出:
-rwsr-xr-x 1 root root 1024 Apr 26 2025 /usr/local/bin/mytool
現在,普通用戶跑 mytool
會用 root
身份,超方便!
注意事項:
- 只用在可執行檔案:SetUID 只對程式(二進位檔案或腳本)有效,對目錄沒用。
- 小心安全風險:如果程式有漏洞,駭客可能用
root
身份搞亂。謹慎用 SetUID,確保程式安全(像只用在信任的系統工具)。 - 檢查程式:用
find
找有 SetUID 的檔案,定期審查:
find / -perm -4000
2.4.2 SetGID:群組身份與目錄繼承
什麼是 SetGID? SetGID(Set Group ID)有兩種用法:
- 對程式:讓用戶用檔案的群組身份跑程式,而不是自己的群組身份。比如,某程式需要用特定群組(如
admin
)存取資源。 - 對目錄:讓目錄裡的新檔案自動繼承目錄的群組,而不是創建者的群組。這在團隊協作超有用,確保大家的新檔案都屬於同個群組。
怎麼設? 用 chmod g+s
開啟 SetGID,權限會在「群組」的執行位顯示為 s
:
chmod g+s dir
檢查 SetGID:用 ls -l
或 ls -ld
看,SetGID 會出現在群組的執行位:
ls -l /usr/bin/wall
輸出:
-rwxr-sr-x 1 root tty 32768 Apr 26 2025 /usr/bin/wall
這裡的 r-s
表示 SetGID,跑 wall
會用 tty
群組身份。
範例 1:程式 SetGID:假設你有個程式 /usr/local/bin/teamtool
,需要用 team
群組身份跑:
sudo chgrp team /usr/local/bin/teamtool
sudo chmod g+s /usr/local/bin/teamtool
ls -l /usr/local/bin/teamtool
輸出:
-rwxr-sr-x 1 root team 1024 Apr 26 2025 /usr/local/bin/teamtool
用戶跑 teamtool
會用 team
群組身份,方便存取群組資源。
範例 2:目錄 SetGID:假設團隊共用目錄 /shared/team
,希望新檔案都屬於 dev
群組:
mkdir /shared/team
sudo chgrp dev /shared/team
sudo chmod g+s /shared/team
ls -ld /shared/team
輸出:
drwxr-sr-x 2 root dev 4096 Apr 26 2025 /shared/team
現在,任何人在 /shared/team
創建的檔案都會屬於 dev
群組:
touch /shared/team/newfile.txt
ls -l /shared/team/newfile.txt
輸出:
-rw-r--r-- 1 alice dev 0 Apr 26 2025 /shared/team/newfile.txt
注意事項:
- 程式風險:跟 SetUID 一樣,SetGID 程式要小心漏洞,避免濫用群組權限。
- 目錄繼承:SetGID 對目錄超有用,但確認群組權限(
chmod g+rwx
)夠用,否則新檔案可能沒權限。 - 檢查 SetGID:找有 SetGID 的檔案或目錄:
find / -perm -2000
2.4.3 Sticky Bit:保護共享目錄
什麼是 Sticky Bit? Sticky Bit 讓目錄裡的檔案只能被檔案擁有者刪除,其他人就算有寫權限也不行。這在共享目錄超有用,比如 /tmp
,大家都能在裡面創檔案,但只能刪自己的。
怎麼設? 用 chmod +t
開啟 Sticky Bit,權限會在「其他」的執行位顯示為 t
:
chmod +t dir
檢查 Sticky Bit:用 ls -ld
看,Sticky Bit 會出現在其他執行位:
ls -ld /tmp
輸出:
drwxrwxrwt 10 root root 4096 Apr 26 2025 /tmp
這裡的 t
表示 Sticky Bit,確保只有檔案擁有者能刪 /tmp
裡的檔案。
範例:假設你有個共享目錄 /shared/public
,大家能創檔案,但不能刪別人的:
mkdir /shared/public
chmod 777 /shared/public
chmod +t /shared/public
ls -ld /shared/public
輸出:
drwxrwxrwt 2 root root 4096 Apr 26 2025 /shared/public
現在,alice
和 bob
都能在 /shared/public
創檔案,但只能刪自己的:
su - alice
touch /shared/public/alice.txt
exit
su - bob
touch /shared/public/bob.txt
rm /shared/public/alice.txt # 會失敗:Permission denied
exit
注意事項:
- 只用在目錄:Sticky Bit 對檔案沒什麼用,現代 Linux 通常只用在目錄。
- 權限配合:Sticky Bit 需要目錄有寫權限(像
777
或775
),否則沒人能創檔案。 - 檢查 Sticky Bit:找有 Sticky Bit 的目錄:
find / -perm -1000
2.4.4 數字方式設定特殊權限
除了 chmod u+s
這種符號方式,你也可以用數字方式設特殊權限。特殊權限用第四位數字表示:
- SetUID = 4
- SetGID = 2
- Sticky Bit = 1
比如,設 SetUID 和 SetGID(4+2=6):
chmod 6755 program
輸出:
-rwsr-sr-x 1 root team 1024 Apr 26 2025 program
設 Sticky Bit(1):
chmod 1777 /shared/public
輸出:
drwxrwxrwt 2 root root 4096 Apr 26 2025 /shared/public
2.4.5 安全小提醒
特殊權限超強,但用不好可能出亂子:
- 少用 SetUID/SetGID:只用在必要程式,檢查程式安全,別讓駭客有機可乘。
- 審計特殊權限:定期用
find
檢查,確保沒亂設:
find / -perm /7000 # 找 SetUID 或 SetGID
2.5 簡單範例
你寫了個腳本 backup.sh
,想讓只有自己能用:
touch backup.sh
chown alice backup.sh
chmod 700 backup.sh
ls -l backup.sh
輸出:
-rwx------ 1 alice users 0 Apr 26 2025 backup.sh
這保證只有 alice
能讀、寫、跑,其他人連看都別想。
3. 存取控制清單(ACL):進階權限玩法
3.1 ACL 是什麼?
基礎權限簡單,但有時候不夠靈活。比如,你想讓某個檔案給好幾個人不同權限,基礎權限只能設一個擁有者和一個群組,怎麼辦?這時候 存取控制清單(ACL, Access Control List) 登場!它像個進階版的權限清單,能單獨給特定用戶或群組設權限,不用改擁有者或群組。
3.2 怎麼開 ACL
ACL 得靠檔案系統支援(像 ext4、XFS)。檢查有沒有開:
mount | grep acl
如果沒開,編輯 /etc/fstab
,加 acl
選項,然後重新掛載:
mount -o remount,acl /partition
3.3 ACL 怎麼用
用 setfacl
和 getfacl
搞定:
-
- 看 ACL:
getfacl file.txt
-
- 給特定用戶加權限:
setfacl -m u:bob:rw file.txt
-
- 給群組加權限:
setfacl -m g:dev:r file.txt
-
- 設目錄的「預設 ACL」(新檔案會繼承):
setfacl -m d:u:bob:rw /path/to/dir
-
- 刪 ACL:
setfacl -x u:bob file.txt
setfacl -b file.txt # 清空所有 ACL
3.4 範例
你有個目錄 /project/
,alice 和 dev 群組成員都可以完全存取(讀、寫、執行), 另外 bob 這個使用者也有完全存取權限,而 qa 群組成員只能讀取,其他人則沒有權限。
chown alice:dev /project
chmod 770 /project
setfacl -m u:bob:rwx /project
setfacl -m g:qa:r /project
setfacl -m d:u:bob:rwx /project
getfacl /project
輸出:
# file: project/
# owner: alice
# group: dev
user::rwx
user:bob:rwx
group::rwx
group:qa:r--
other::---
default:user::rwx
default:user:bob:rwx
default:group::rwx
default:other::---
3.5 小心點
ACL 跟基礎權限一起用,基礎權限是底線。備份要記得帶 ACL(像 tar --acls
或 rsync -A
)。有些老程式可能不認 ACL,記得測一下。
4. 自主 vs. 強制控制:DAC 和 MAC 的差別
4.1 自主訪問控制(DAC)
DAC 是基礎權限和 ACL 的玩法,特點是:
- 主人說了算:檔案擁有者決定誰能用,超靈活。
- 靠身份:權限跟用戶和群組綁定。
- 問題:
- 主人設錯權限(像
777
),就GG了。 root
或駭客能繞過權限。- 多人協作時,規則可能變亂。
- 主人設錯權限(像
DAC 適合個人電腦或簡單伺服器,但高安全場景(像企業伺服器)不夠力。
4.2 強制訪問控制(MAC)
MAC 是系統訂規則,連 root
都得聽,特點是:
- 系統管到底:規則由系統策略決定,沒得商量。
- 超細膩:能管到程式、檔案、甚至網路埠。
- 高安全:駭客再強,也跑不出規則。
Linux 的 MAC 有兩大明星:
- SELinux:用在 RHEL,超細膩,靠標籤控制。
- AppArmor:用在 Ubuntu,簡單好上手,靠路徑控制。
4.3 DAC vs. MAC
比較點 | DAC | MAC |
---|---|---|
誰管 | 檔案主人 | 系統策略 |
靈活性 | 超高,隨你設 | 較低,得照規則 |
安全性 | 看主人腦子 | 超高,系統強制 |
工具 | chmod, chown, ACL | SELinux, AppArmor |
適合場景 | 個人電腦、簡單伺服器 | 企業伺服器、雲端 |
4.4 為啥要 MAC?
DAC 簡單好用,但像個大門敞開的房子,萬一 root
被偷或程式被駭,什麼都能搞亂。MAC 像裝了防盜門,就算有鑰匙也得有通行證。後面文章會深入 SELinux 和 AppArmor,教你怎麼用 MAC 保護伺服器。
5. 實務範例:從簡單到高階的應用
讓我們動手玩,從簡單到高階,學會怎麼用權限和 ACL!
5.1 簡單範例:鎖住私人檔案
場景:你有個私人檔案 secret.txt
,只想自己看。
touch secret.txt
chown alice secret.txt
chmod 600 secret.txt
ls -l secret.txt
輸出:
-rw------- 1 alice users 0 Apr 26 2025 secret.txt
這保證只有 alice
能讀寫,其他人連看都別想。
5.2 中階範例:保護網站檔案
場景:你跑 Apache 伺服器,檔案在 /var/www/html
,想讓 bob
能改某個網頁。
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
setfacl -m u:bob:rw /var/www/html/index.html
getfacl /var/www/html/index.html
輸出:
# file: index.html
# owner: www-data
# group: www-data
user::rw-
user:bob:rw-
group::r-x
other::r-x
這讓 www-data
(Apache)能跑網站,bob
能改 index.html
,其他人只能看。
5.3 高階範例:多人協作目錄
場景:/shared
目錄要給開發(dev
)、測試(qa
)、顧問(bob
)用。
mkdir /shared
chown alice:dev /shared
chmod 770 /shared
setfacl -m u:bob:rwx /shared
setfacl -m g:qa:r /shared
setfacl -m d:u:bob:rwx /shared
setfacl -m d:g:qa:r /shared
getfacl /shared
輸出:
# file: shared/
# owner: alice
# group: dev
user::rwx
user:bob:rwx
group::rwx
group:qa:r--
other::---
default:user::rwx
default:user:bob:rwx
default:group::rwx
default:group:qa:r--
default:other::---
這讓 alice
和 dev
群組全權控制,bob
能讀寫跑,qa
只能讀,新檔案會自動繼承這些權限。
5.4 問題排查
- 存取被拒:檢查權限(
ls -l
)和 ACL(getfacl
)。 - 權限沒生效:確認
chmod
或setfacl
設對沒。 - 新檔案錯亂:檢查目錄有沒有設預設 ACL。
6. SELinux 和 AppArmor 初體驗
6.1 SELinux
SELinux 是 RHEL 的安全大招,屬於 MAC。它給每個檔案和程式貼標籤(像「網頁檔案」或「Apache 程式」),用系統規則決定誰能碰誰,連 root
都管不住。
特點:
- 超細膩,標籤管到每個細節。
- 有強制(Enforcing)、寬鬆(Permissive)、關閉(Disabled)三種模式。
- 適合銀行、雲端這種高安全場景。
試試看:
檢查 SELinux:
getenforce
設網頁檔案標籤:
chcon -t httpd_sys_content_t /var/www/html/file
6.2 AppArmor
AppArmor 是 Ubuntu 的 MAC 好朋友,用路徑(像 /var/www/html
)限制程式行為,比 SELinux 簡單,超好上手。
特點:
- 靠路徑管,學起來快。
- 有 Enforce(強制)和 Complain(記錄)模式。
- 跟 Ubuntu 的 snap 套件超搭。
試試看:
檢查 AppArmor:
sudo aa-status
幫 Nginx 設規則:
sudo aa-genprof /usr/sbin/nginx
6.3 後續計畫
第二篇會深入 SELinux,教你怎麼用標籤和規則把 RHEL 伺服器變堡壘;第三篇聊 AppArmor,帶你玩 Ubuntu 的簡單安全招。
7. 怎麼用得更好?最佳技巧與資源
7.1 最佳技巧
- 只給必要權限:別亂設
777
,小心駭客趁虛而入。 - 層層進階:先用基礎權限,複雜場景再加 ACL。
- 常檢查:用
ls -l
和getfacl
看權限對不對。 - 備份:改權限前備份關鍵檔案。
- 試驗場:用虛擬機試,別直接搞正式伺服器。
7.2 常見問題
- 存取被拒:檢查
ls -l
和getfacl
。 - 權限沒生效:確認
chmod
或setfacl
設對,檔案系統有沒有支援 ACL。 - 協作亂套:檢查目錄的預設 ACL 和群組權限。
7.3 進階資源
- 官方文件:
- 書:
- 《Linux System Administration》by Evi Nemeth 等
- 《Linux Security Cookbook》by Daniel J. Barrett 等
- 線上資源:
- Linux 基金會:https://docs.linuxfoundation.org/
- Ubuntu 伺服器指南:https://ubuntu.com/server/docs
結論
Linux 的訪問控制像個超聰明的門衛,從簡單的檔案權限到進階的 ACL,讓你輕鬆管好誰能碰什麼。DAC(自主控制)簡單好用,適合個人或小伺服器;MAC(強制控制)像 SELinux 和 AppArmor,則是企業級安全的大招。這篇用簡單語言,帶你從基礎到進階,學會怎麼保護檔案、搞定多人協作,還為 SELinux 和 AppArmor 暖場。
後面文章會更精彩:第二篇深入 SELinux,教你用標籤和規則把 RHEL 伺服器變堡壘;第三篇聊 AppArmor,帶你玩 Ubuntu 的簡單安全招。不管你是新手還是老手,這系列都會讓你對 Linux 安全又愛又懂!
有問題或想看更多範例,隨時留言!下一篇 SELinux 等你來挑戰!