Vibe Coder

IAM 與權限管理:最小權限原則,出事不會全滅

IAM 就是管理誰能對什麼資源做什麼事的系統。最小權限原則要求每個身份只給執行任務所需的最小權限,不多給一分,這樣就算 Key 洩漏,攻擊者能做的事也被限制住。用 Supabase 的話,每張資料表都要開啟 RLS(Row Level Security),否則任何知道 API 網址的人都能讀到所有資料。
IAM 與權限管理:最小權限原則,出事不會全滅

IAM 與權限管理:最小權限原則,出事不會全滅

用 Root 帳號做所有事,等於完全不鎖門:Key 一旦洩漏,攻擊者拿到的是完整控制權,包括刪除你的資料和產生天文數字帳單。更麻煩的是,AI 生成的程式範例通常直接用 Root Key,不會主動提醒你建立限制權限的帳號。這篇帶你搞懂 IAM 的基本概念,學會用最小權限原則保護自己的專案。

你將學到什麼

IAM 是什麼

身份、政策、角色、資源四個核心概念,一次看懂。

最小權限原則

為什麼每個身份只該拿到剛好夠用的權限,不多給一分。

Supabase RLS 怎麼設

資料庫層級的權限控管,Supabase App 的必設安全機制。

Service Account vs 個人帳號

程式該用哪一種帳號,離職交接時差在哪。

IAM 是什麼

IAM(Identity and Access Management)是管理誰能對什麼資源做什麼事的系統。每個雲端平台都有自己的 IAM:AWS IAM、GCP IAM、Supabase 的 RLS 都是 IAM 的概念。

概念說明例子
Identity(身份)誰在操作使用者帳號、Service Account、API Key
Policy(政策)允許或拒絕做什麼允許讀取 S3、拒絕刪除資料庫
Role(角色)一組 Policy 的集合ReadOnly Role、Admin Role
Resource(資源)被操作的對象S3 bucket、RDS 資料庫、API endpoint

最小權限原則

個人帳號 整個專案的所有資源都能動Service Account 限定在特定服務與資源RLS Policy 限定到資料表的列
最小權限原則:範圍一層比一層小,出事的災情也一層比一層小。

最小權限原則(Principle of Least Privilege):每個身份只給它執行任務所需的最小權限,不多給一分。這麼做有三個好處:洩漏損害最小化,就算 API Key 洩漏,攻擊者能做的事也被限制住了;bug 影響範圍最小化,程式 bug 導致的誤操作不會波及無關的資源;審計更容易,每個身份的操作都有明確範圍,異常行為容易發現。

服務過度授權(不要這樣)最小權限(應該這樣)
讀取 S3 圖片給完整 S3 管理員權限只給特定 bucket 的 s3:GetObject
讀取資料庫給 root 帳號建立只有 SELECT 權限的帳號
發送 Email給 SendGrid 完整 API Key建立只有 mail.send 權限的 API Key
操作 GitHub給完整帳號的 Personal Access Token建立只有 repo 讀取的 Fine-grained Token
給 AI 的指令請 AI 幫你設定 IAM 時,主動說:「請遵循最小權限原則,只給這個服務執行任務所需的最小權限,不要給 admin 或 root 等全域權限。」

AWS IAM 快速入門

如果你用 AWS 的服務(S3、Lambda、RDS),一定要理解 IAM 的基本操作。建立限制權限的 IAM User,不要用 Root:

  1. 登入 AWS Console,進入 IAM → Users → Create User。
  2. 選「Attach policies directly」,搜尋並附加你需要的 Policy,例如 AmazonS3ReadOnlyAccess。
  3. 建立後進入 User → Security Credentials → Create Access Key,選「Application running outside AWS」。
  4. 下載 Access Key ID 和 Secret Access Key,存到 .env。不要用 Root 帳號的 Key。

Supabase RLS:資料庫層級的權限

RLS(Row Level Security)讓你在資料庫層級控制誰能看到哪些資料列,是 Supabase App 的必設安全機制。

-- 開啟 RLS(預設關閉,開啟後所有操作都被擋)
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

-- 政策:只能看自己的文章
CREATE POLICY "Users can view own posts"
ON posts FOR SELECT
USING (auth.uid() = user_id);

-- 政策:只能新增自己的文章
CREATE POLICY "Users can insert own posts"
ON posts FOR INSERT
WITH CHECK (auth.uid() = user_id);
Supabase 新專案的第一步建完 Supabase 專案後,第一件事就是為每個資料表執行 ALTER TABLE 開啟 Row Level Security,然後再建立對應的 Policy。不設 RLS 的資料表,用 anon key 就能讀到所有資料。

Service Account vs 個人帳號

很多人把個人帳號的 Key 用在程式裡,這是常見的安全問題。程式應該用 Service Account 或獨立的 API Key,不應該用個人帳號。

比較項目個人帳號 KeyService Account
人員離職必須緊急撤換程式裡的 Key不受影響,帳號和人無關
權限範圍包含所有個人操作的廣泛權限只有程式需要的最小權限
審計混在個人操作記錄裡,難以分辨獨立的操作記錄,容易審計
建議不應該用在程式裡建立專屬的服務帳號

Vibe Coder 的 IAM 檢查清單

  • 程式使用的 API Key 是 Service Account 或限制權限的 Key,不是個人帳號或 Root
  • 每個 Key 只有它執行任務所需的最小權限
  • Supabase 的所有資料表都開啟了 RLS
  • 不同環境(dev、prod)使用不同的 Key,不共用
  • 定期檢查有沒有閒置但未撤銷的 Key

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

IAM 是什麼?
IAM(Identity and Access Management)是管理誰能對什麼資源做什麼事的系統。每個雲端平台都有自己的 IAM,AWS IAM、GCP IAM、Supabase 的 RLS 都是同一種概念的不同實作。
為什麼要遵循最小權限原則?
因為就算 API Key 洩漏,攻擊者能做的事也被限制住了;程式 bug 導致的誤操作也不會波及無關的資源;每個身份的操作範圍明確,異常行為也更容易被發現。
Supabase 新專案的第一步該做什麼?
為每個資料表執行 ALTER TABLE 開啟 Row Level Security,然後建立對應的 Policy。不設 RLS 的資料表,任何知道 anon key 的人就能讀到所有資料,非常危險。
程式裡的 API Key 應該用個人帳號還是 Service Account?
應該用 Service Account 或獨立建立的限制權限 Key,不要用個人帳號。個人帳號離職時要緊急撤換程式裡的 Key,而且權限範圍過廣、難以審計,Service Account 從一開始就避開這些問題。