National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 72 24°C PM2.5 13
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 14

權限與最小授權

使用者、權限提升與機密資訊管理
Interaction 30 minute(s)

Learning Objectives

  • 依 Linux 的規則判斷帳號對檔案與目錄的存取結果
  • 將服務調整為以專用帳號執行,並做到功能正常、權限最小
  • 說明 SUID 的作用與權限提升的概念
  • 說明機密資訊的存放方式,以及外洩後應優先採取的處理步驟

最小權限原則

前面幾課的弱點都可能讓攻擊者以網站服務的身分讀取檔案或執行操作。服務本身擁有多少權限,決定了這些弱點的影響範圍。若服務以 root 執行,一個路徑穿越弱點就能讀取整台主機的檔案;若服務以專用帳號執行,能接觸的範圍僅限於這個帳號被授權的部分。

NIST 將最小權限(least privilege)定義為:系統應將使用者(或代表使用者的行程)的存取權限限制在完成指定工作所需的最小範圍。這項原則適用於帳號、服務、資料庫連線(第 7 課)與 API 權杖。

Linux 的檔案權限判斷規則如下:

  1. 行程的有效使用者等於檔案擁有者時,使用第一組權限;否則,群組(含附加群組)相符時使用第二組;都不符合時使用第三組。只會使用其中一組
  2. 路徑上的每一層目錄都需要搜尋權限 x
  3. 在目錄內建立檔案需要該目錄的 w 與 x
  4. 有效 UID 為 0 的行程(root)略過讀、寫與搜尋的檢查;執行一般檔案時,則要求至少一組權限含有 x

-rw-r----- root campusweb secret.env 這樣的表示方式,代表擁有者 root 可讀寫、群組 campusweb 可讀取、其他人沒有權限。

服務不應以 root 執行。 常見的理由是需要綁定 80 與 443 連接埠。常見的作法是由反向代理(例如 nginx)接收請求後轉給應用程式,應用程式以專用帳號執行;Linux 也提供 CAP_NET_BIND_SERVICE 這項能力(capability),可以只授予綁定低編號連接埠的權限。

本課的模擬環境。 下方的伺服器是模擬的,帳號與檔案皆為虛構,判斷結果由權限規則算出。權限管理只應在自己負責或獲得授權的系統上進行(第 1 課)。

互動練習:服務帳號與檔案權限

按鈕 r、w、x 分別切換讀、寫、執行(目錄為搜尋)權限,藍色代表開啟。每一列的原因說明這次判斷使用了哪一組權限。解法不只一種,結果由規則計算。

SUID 與權限提升

一般情況下,程式以執行者的身分運作。SUID(set-user-ID)是例外:程式檔設有這個權限位元時,行程的有效使用者會變成檔案的擁有者。SUID 只改變有效使用者,行程的群組仍是執行者的。常見的用途是讓一般使用者透過特定程式執行需要較高權限的工作,例如修改自己的密碼。ls -l 顯示時,擁有者的執行位元會寫成 s:-rwsr-xr-x。Linux 會忽略腳本的 SUID 位元,它只對可執行的二進位檔有效。改變程式檔的擁有者或群組時,系統會清除 SUID 位元,需要重新設定。

這項機制的安全性完全取決於程式本身。擁有者為 root 的 SUID 程式若接受任意路徑或指令作為輸入,就相當於把 root 的部分權限交給所有能執行它的人。使用者由較低權限取得較高權限的情形,稱為權限提升(privilege escalation)。

系統管理上的原則如下:

  • SUID 程式的數量盡量少,定期檢查清單,移除不需要的項目
  • 若工作只需要讀取特定檔案,優先使用群組權限,不需要 SUID
  • 確實需要時,讓程式由權限受限的專用帳號擁有,不使用 root,並限制哪些人可以執行
  • 這類程式要嚴格驗證輸入,並在完成需要權限的動作後放棄權限

下方的練習用虛構的程式說明這個概念,不涉及任何真實程式的利用方式。

互動練習:SUID 與權限提升

campus-report 是虛構的程式,功能是讀取指定路徑的檔案並輸出。紅色的 s 按鈕切換 SUID。解法不只一種,結果由規則計算。

機密資訊的管理

資料庫密碼、API 權杖與簽章金鑰都屬於機密資訊。常見的外洩途徑是寫在程式碼裡並提交到版本控制,之後儲存庫被公開或被其他人複製。提交之後即使刪除,內容仍然保留在 Git 歷史中。

存放方式 特性
寫在程式碼裡 不應使用。所有能讀取程式碼的人都能取得,也會進入版本控制的歷史
不進版本控制的設定檔 本站的 app_config.py 列在 .gitignore 中,部署時由伺服器提供。檔案本身仍要限制權限
環境變數 比寫在程式碼裡好,但 OWASP 指出環境變數通常可被同一環境的行程取得,也可能出現在日誌或系統傾印中,建議在沒有其他方式時才使用
機密管理服務 集中保管,具有細緻的存取控制、稽核紀錄與輪替機制。OWASP 建議優先採用專門的機密管理服務

輪替(rotation)是定期更換機密資訊,讓被竊取的憑證只在短時間內有效。機密資訊本身也應遵守最小權限,每一組權杖只授予需要的範圍。

外洩後的處理順序。 OWASP 與 GitHub 的文件都指出,第一步是撤銷或輪替外洩的憑證。GitHub 也說明,憑證輪替後便無法再使用,可能已足以解決問題;重寫歷史有協作上的代價,內容也可能仍可在其他地方存取。

實務上還要注意服務的連續性。外洩的憑證原則上應立即撤銷。若服務支援新舊憑證並存,而且外洩範圍有限、沒有被使用的跡象,可以先建立新憑證並完成部署,再立刻停用舊憑證,以縮短中斷;儲存庫是公開的,或有跡象顯示憑證已被使用時,應立即撤銷,不等待部署完成。事後要檢查憑證是否被使用過(第 16、17 課)。

互動練習:權杖外洩後的處理

一支含有 API 權杖的虛構程式已經推送到共用的儲存庫。按鈕可依任意順序操作,每個動作的後果由規則計算。過程中服務可能暫時失敗,觀察原因後繼續操作,也可以重新開始。這個情境假設儲存庫不公開、沒有跡象顯示權杖已被使用,而且 API 提供者允許新舊權杖短暫並存,所以可以比較不同順序造成的中斷;條件不符時應立即撤銷。

重點整理

  • 最小權限將權限限制在完成工作所需的最小範圍,它不能消除弱點,但能限制影響範圍
  • Linux 依擁有者、群組、其他的順序選用一組權限,路徑上的目錄都需要 x
  • 服務應以專用帳號執行;檔案擁有者可以自行更改權限,服務不應擁有自己不該修改的檔案
  • SUID 讓程式以檔案擁有者的身分執行,接受任意輸入的 SUID 程式會造成權限提升
  • 機密資訊不寫進程式碼、不進版本控制;環境變數有其限制,優先使用機密管理服務
  • 外洩時第一步是撤銷或輪替,重寫歷史無法讓憑證失效

下一課討論網路層:哪些資訊在網路上看得到,以及防火牆能做到與做不到的事。

小測驗

1.

檔案權限為 -rw----r--,擁有者 deploy,群組 staff。帳號 amy 屬於 staff 群組,不是擁有者。amy 能否讀取這個檔案?

2.

帳號對檔案 /srv/app/data.txt 有讀取權限,但對目錄 /srv/app 沒有 x。實際結果是什麼?

3.

將網站服務由 root 改為專用帳號後,下列敘述何者正確?

4.

權杖被提交到共用儲存庫後,第一步應該做什麼?

5.

程式改由環境變數讀取 API 權杖。關於這個作法,下列敘述何者較準確?

第 1 次作答
這一課完成了!
Next lesson:封包與防火牆
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。