Linux訪問控制實戰指南 從基礎權限到高階安全防護

最後更新日期: 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--

chownchgrp 改擁有者和群組:

chown bob script.sh       # 改擁有者為 bob
chgrp dev script.sh       # 改群組為 dev
chown bob:dev script.sh   # 一次改兩者

2.4 特殊權限:進階小招

除了基本的讀、寫、執行權限,Linux 還有三種特殊權限,超實用,讓你能更靈活地控制檔案和目錄的行為。這三招分別是 SetUIDSetGIDSticky 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 會出現在權限的第四位(原本的 xs):

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 -lls -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

現在,alicebob 都能在 /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 需要目錄有寫權限(像 777775),否則沒人能創檔案。
  • 檢查 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
  • Sticky Bit 是好朋友:共享目錄一定要用,保護大家的文件。

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 怎麼用

setfaclgetfacl 搞定:

    • 看 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 --aclsrsync -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::---

這讓 alicedev 群組全權控制,bob 能讀寫跑,qa 只能讀,新檔案會自動繼承這些權限。

5.4 問題排查

  • 存取被拒:檢查權限(ls -l)和 ACL(getfacl)。
  • 權限沒生效:確認 chmodsetfacl 設對沒。
  • 新檔案錯亂:檢查目錄有沒有設預設 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 -lgetfacl 看權限對不對。
  • 備份:改權限前備份關鍵檔案。
  • 試驗場:用虛擬機試,別直接搞正式伺服器。

7.2 常見問題

  • 存取被拒:檢查 ls -lgetfacl
  • 權限沒生效:確認 chmodsetfacl 設對,檔案系統有沒有支援 ACL。
  • 協作亂套:檢查目錄的預設 ACL 和群組權限。

7.3 進階資源

結論

Linux 的訪問控制像個超聰明的門衛,從簡單的檔案權限到進階的 ACL,讓你輕鬆管好誰能碰什麼。DAC(自主控制)簡單好用,適合個人或小伺服器;MAC(強制控制)像 SELinux 和 AppArmor,則是企業級安全的大招。這篇用簡單語言,帶你從基礎到進階,學會怎麼保護檔案、搞定多人協作,還為 SELinux 和 AppArmor 暖場。

後面文章會更精彩:第二篇深入 SELinux,教你用標籤和規則把 RHEL 伺服器變堡壘;第三篇聊 AppArmor,帶你玩 Ubuntu 的簡單安全招。不管你是新手還是老手,這系列都會讓你對 Linux 安全又愛又懂!

有問題或想看更多範例,隨時留言!下一篇 SELinux 等你來挑戰!