Vibe Coder
IAM 與權限管理:最小權限原則,出事不會全滅
IAM 就是管理誰能對什麼資源做什麼事的系統。最小權限原則要求每個身份只給執行任務所需的最小權限,不多給一分,這樣就算 Key 洩漏,攻擊者能做的事也被限制住。用 Supabase 的話,每張資料表都要開啟 RLS(Row Level Security),否則任何知道 API 網址的人都能讀到所有資料。
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 |
最小權限原則
最小權限原則(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:
- 登入 AWS Console,進入 IAM → Users → Create User。
- 選「Attach policies directly」,搜尋並附加你需要的 Policy,例如 AmazonS3ReadOnlyAccess。
- 建立後進入 User → Security Credentials → Create Access Key,選「Application running outside AWS」。
- 下載 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,不應該用個人帳號。
| 比較項目 | 個人帳號 Key | Service Account |
|---|---|---|
| 人員離職 | 必須緊急撤換程式裡的 Key | 不受影響,帳號和人無關 |
| 權限範圍 | 包含所有個人操作的廣泛權限 | 只有程式需要的最小權限 |
| 審計 | 混在個人操作記錄裡,難以分辨 | 獨立的操作記錄,容易審計 |
| 建議 | 不應該用在程式裡 | 建立專屬的服務帳號 |
Vibe Coder 的 IAM 檢查清單
- 程式使用的 API Key 是 Service Account 或限制權限的 Key,不是個人帳號或 Root
- 每個 Key 只有它執行任務所需的最小權限
- Supabase 的所有資料表都開啟了 RLS
- 不同環境(dev、prod)使用不同的 Key,不共用
- 定期檢查有沒有閒置但未撤銷的 Key
延伸學習
常見問答
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 從一開始就避開這些問題。
