AWS IAM 入門教學:什麼是 IAM?為何每個 AWS 使用者都該懂?

更新日期: 2025 年 6 月 4 日

當你開始使用 AWS(Amazon Web Services)建立雲端資源時,你就會接觸到一個不可或缺的服務:IAM(Identity and Access Management)

IAM 是 AWS 的安全基礎,它決定了誰能存取你的資源、能執行什麼動作、在哪些條件下操作等。

無論你是單人開發者、初創團隊,還是企業級架構師,只要使用 AWS,就一定需要正確理解與設定 IAM。

這篇文章將一步步帶你了解 IAM 的核心功能、使用方式與實務建議,幫助你打造安全又可控的雲端環境。

IAM 是什麼?

在 AWS 上建構系統的過程中,你可能會建立 EC2 虛擬機、儲存資料到 S3、建立資料庫 RDS 或發佈 Lambda 函式。

這些資源都非常強大,也可能非常敏感。

因此,「誰能存取這些資源、可以做什麼事情」,就變成了至關重要的議題。

這時候,IAM(Identity and Access Management)就登場了。

IAM 的定義

IAM 是 AWS 提供的一套存取控制機制,讓你可以精確地管理「誰」可以對「哪些資源」執行「哪些操作」。

換句話說,它是:

🎫 一套精密的「權限管理系統」,控制你的 AWS 環境中每一份資源的「使用權限」。

IAM 的角色就像是 AWS 的保全系統,你可以用它設定:

  • 誰可以登入 AWS(例如你的工程師或管理者)
  • 誰可以操作 EC2、S3、RDS 等服務
  • 哪些系統服務可以與彼此互動(例如讓 Lambda 存取 DynamoDB)
  • 如何加強安全性(例如開啟多因子認證、限制 IP 來源)

這一切,都是透過 IAM 來設定與管理的。

從 Policy 認識 IAM 的運作核心

什麼是 IAM Policy?

在 AWS 中,Policy(政策)是一份權限聲明書,用來明確定義一個身份(如使用者、角色、服務)可以對哪些資源執行哪些操作。

它就像是 AWS 的「門禁清單」,你可以透過這份清單精準地設定:

  • 誰(例如某個 IAM 使用者)
  • 可以對什麼(例如某個 S3 Bucket)
  • 做什麼事情(例如讀取檔案、上傳資料)

這份清單的內容是用 JSON 格式 編寫的,每一份 Policy 通常包含一或多個「Statement(敘述)」區塊,每個區塊代表一條具體的權限規則。

一份 IAM Policy 的基本結構

以下是一個典型的 IAM Policy:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

這份政策的意思是:

✅ 允許(Allow)這個身份對 my-bucket 裡的所有物件執行 s3:GetObject 操作(也就是讀取檔案)。

我們逐一來看每個欄位的意思:

Version

這個欄位不是代表你自己的 Policy 版本,而是固定填寫 AWS 使用的語法版本。

目前統一使用 "2012-10-17"

✅ 寫法固定為:

"Version": "2012-10-17"

Statement

Statement 是整份 Policy 的重點部分,可以是一個物件,也可以是一個陣列。

每個 Statement 都代表一條獨立的權限規則。

通常會包含以下欄位:

欄位說明
Effect決定這條規則是 Allow(允許)還是 Deny(拒絕)
Action要執行的 AWS 操作,例如 s3:GetObject、ec2:StartInstances
Resource這個動作可以作用在哪些資源上,例如某個 S3 bucket、某個特定 EC2 實例
Condition(可選)限制條件,例如 IP、時間、使用者代理等
Principal(僅用於 Resource-based policy)誰可以來存取這個資源(例如另一個帳號的 User 或 Role)

小範例解釋(再深入一點):

{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::my-bucket/*"
}

這代表「只允許」這個身份:

  • 執行 s3:GetObject:也就是從 S3 Bucket 中讀取物件
  • 資源是 arn:aws:s3:::my-bucket/*:這是指定某個 Bucket 底下的所有物件(而不是整個 Bucket 本身)

❗ 注意:「Bucket 本身」與「Bucket 內的物件」是不同的資源,兩者 ARN 寫法也不同:

資源ARN 寫法
整個 bucketarn:aws:s3:::my-bucket
bucket 裡的檔案arn:aws:s3:::my-bucket/*

🔐 Effect:允許或拒絕

你可以明確寫出:

  • "Effect": "Allow":表示「我允許這件事發生」
  • "Effect": "Deny":表示「即使其他地方允許,我還是要拒絕這件事」

📌 小提醒:Deny 的權限優先於 Allow。如果一個身份同時被 Allow 和 Deny 相同動作,最終會被拒絕。

⚙️ Action:你想執行什麼操作?

這裡會指定 AWS 上的某項操作。例如:

  • s3:PutObject → 上傳物件
  • s3:GetObject → 讀取物件
  • ec2:StartInstances → 啟動 EC2 執行個體
  • dynamodb:Query → 查詢資料

你也可以使用萬用字元:

"Action": "s3:*"

這代表允許「所有 S3 的操作」,但這麼做風險較高,實務上建議精確指定必要的行為(稱為「最小權限原則」)。

📦 Resource:對哪個資源做這些事?

這裡是最重要的權限範圍設定,你要清楚列出哪些資源是被授權的。

例如:

  • arn:aws:s3:::my-bucket/*:某個 bucket 裡的所有物件
  • arn:aws:ec2:us-east-1:123456789012:instance/i-12345678:特定 EC2 實例

若你想允許操作「所有資源」,可以寫成:

"Resource": "*"

但這樣非常危險,千萬不要用在正式環境中!

📌 總結一句話:

Policy 就像 AWS 的「進出許可證」,用 JSON 說明誰可以怎麼樣操作哪些資源。

它是 IAM 權限機制的核心,所有的授權都是透過這些文字規則來完成的。

延伸補充:Condition 與 Principal 是什麼?

  • Condition:讓你加入一些附加條件(例如只允許從某個 IP 存取、只允許平日登入)
  • Principal:只在 Resource-based policy 才會用,代表「被授權的人是誰」

這兩個屬性不是每次都會出現,但在需要進階控制時非常有用。之後可以獨立介紹。

Policy 有兩種類型:Identity-based 與 Resource-based

在 IAM 中,Policy 並不只是單純給某個人用的權限清單,而是有兩種用途,取決於你是「從身份的角度授權」還是「從資源的角度控管」。

我們可以將這兩種 Policy 類型理解為:

類型代表誰說了算?套用對象用法重點
Identity-based Policy我是使用者,我來說我能做什麼User / Group / Role我主動去操作資源
Resource-based Policy我是資源,我來說誰可以使用我S3、Lambda 等資源本體誰可以來用我?

接下來我們分別說明:

Identity-based Policy(身份型政策)

這種 Policy 是最常見、最基本的授權方式。

你可以把它想成「我是一個人/一個服務,我要設定我自己能做哪些事」。這種政策會綁定在某個身份上,身份的種類包括:

🔹 使用者(User)

代表一個實體的人,例如開發者、管理員。通常會登入 AWS 控制台或使用 CLI 操作。

🔹 群組(Group)

代表一群使用者的集合,你可以把一套 Policy 指派給整個群組,讓所有成員都擁有相同權限。

🔹 角色(Role)

代表一種可被「扮演」的身份,通常由 EC2、Lambda 等 AWS 服務、或其他帳號來使用。

使用情境舉例:

身份需求可設定的 Policy
User讓後端工程師可以啟動 EC2Allow ec2:StartInstances
Group所有開發者可以讀寫某個 S3 資料夾Allow s3:GetObject, s3:PutObject
RoleEC2 實例要上傳圖片到 S3Allow s3:PutObject,由 EC2 Assume 此 Role

🧠 特點與優點:

  • 是 IAM 中最基礎的授權機制
  • 適用於「自己想要去做事」的情境
  • 搭配 ActionResource 定義行為範圍
  • 管理簡單、邏輯直觀

Resource-based Policy(資源型政策)

這種 Policy 是「寫在資源本身」的,也就是由資源來決定:「誰可以來用我」。

例如:某個 S3 Bucket,可以設定成:

允許某個 IAM 使用者、角色、甚至外部帳號來存取我這個 Bucket。

你可以把它理解為:「資源自己訂門禁」。

🔧 常見資源支援 Resource-based Policy:

資源類型支援的 Policy 名稱
S3 BucketBucket Policy
Lambda FunctionResource-based permission
SNS TopicTopic Policy
SQS QueueQueue Policy
API GatewayResource Policy

這類型的 Policy 多了一個很重要的欄位:Principal,用來指定「被授權的人是誰」。

🧠 語法差異示例:

{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:user/Alice"
  },
  "Resource": "arn:aws:s3:::my-bucket/*"
}

這段寫在某個 S3 Bucket 的 Resource-based Policy 裡,意思是:

允許帳號 123456789012 下的 Alice 使用者,來讀取我這個 Bucket 裡的物件。

✅ 使用情境舉例:

資源授權對象說明
S3 Bucket外部帳號的某個 Role資源分享給合作夥伴
Lambda允許某個角色執行函式給其他帳號的應用呼叫 Lambda
SNS Topic訂閱者帳號跨帳號廣播通知

🧠 Resource-based Policy 的特點:

  • 必須資源本身支援,並非所有服務都可以用
  • 適用於跨帳號授權、開放存取的情境
  • 權限來自資源本身,而非操作者的身份
  • 多用於資料分享與服務整合

初學者常見誤解整理:

常見誤解正確觀念
所有資源都能用 Resource-based Policy❌ 錯,僅部分服務支援
Identity-based 與 Resource-based 二選一✅ 兩者可同時存在,互補授權效果
Resource-based 不需要指定誰❌ 錯,一定要設定 Principal,不然就等於開放給所有人

✅ 小結:如何選擇用哪一種 Policy?

使用場景建議使用的 Policy 類型
公司內部管理人員權限Identity-based
EC2、Lambda 要自動存取資源Identity-based(使用 Role)
需要讓其他帳號來存取我的資源Resource-based
開放某些檔案下載、不登入即可使用Resource-based(S3 Public Policy)

三種 IAM 身份:User、Group、Role

IAM 的設計邏輯是這樣的:

先建立「身份」,再授與「權限」。

而這三種身份(User、Group、Role)就是你用來操作 AWS 資源時的「主體」,你必須先知道這三種角色有什麼差別,才能正確分配權限與管理使用者。

User(使用者)

🧾 定義:

IAM User 代表的是一個「具名的實體人員」,像是你、你的同事或組織裡的工程師、財務人員等。

每個使用者都是 AWS 上的一個個體,會有自己的登入方式與個人金鑰。

🧰 特性:

項目說明
登入方式可登入 AWS 控制台(Web)或透過 CLI
身份憑證支援使用者名稱、密碼、MFA、Access Key(用於 CLI / SDK)
權限來源可直接指派 IAM Policy,也可以透過加入 Group 繼承權限
記錄追蹤CloudTrail 可以記錄誰做了什麼,利於審計與除錯

📘 適用情境:

  • 工程師需要登入 AWS 控制台管理資源
  • 財務部門查看帳單與成本報表
  • 系統管理員需要維護 IAM 設定與安全政策

✅ 實作建議:

  • 每個人都應該擁有獨立的 IAM User,避免共用帳號(這是最常見的新手錯誤之一)
  • 啟用 MFA(多因子認證)提升安全性
  • 搭配 Group 使用,提高維護效率

Group(群組)

🧾 定義:

IAM Group 是一種「使用者的集合」,你可以將一組 IAM User 加入同一個 Group,然後對這個 Group 授與 Policy,所有成員都會自動繼承該權限。

Group 並不是一種可以登入或操作的身份,它只是為了「統一管理權限」而存在的邏輯分組工具。

🧰 特性:

項目說明
登入方式❌ 不能登入,因為 Group 不是個人身份
授權方式對整個 Group 指派 IAM Policy,所有 User 繼承該權限
可否套用多個 Policy?✅ 可針對 Group 套用多份政策
一個使用者可否屬於多個 Group?✅ 可以同時屬於多個 Group 並合併權限

📘 適用情境:

  • 給「所有工程師」一樣的權限,例如:操作 EC2、讀寫 S3
  • 管理者需要快速移除或變更一整群人權限時,只要調整 Group 即可
  • 節省人力成本,不用為每個人逐一設定權限

✅ 實作建議:

  • 將 User 加入不同部門 Group,例如:DevelopersQAFinance
  • Group 的命名應清楚反映職責(如 S3-ReadOnly-Team
  • 變更權限時優先修改 Group,而非每位使用者

Role(角色)

🧾 定義:

IAM Role 是一種 「可以被扮演的臨時身份」,不像 User 是人,Role 通常給AWS 服務、應用程式、或外部帳號來使用。

Role 沒有帳密,也不能直接登入 AWS 控制台,必須透過assume(扮演)的動作,才能獲得它的權限。

🧰 特性:

項目說明
登入方式❌ 無帳密,不能自己登入
使用方式其他主體(如 EC2、Lambda、外部帳號)來「扮演」這個 Role
授權方式對 Role 指派 IAM Policy,然後授權特定身份可以 assume 它
適用時間支援「臨時權限」,例如 STS 領取的憑證會自動過期

📘 適用情境:

  • EC2 實例要存取 S3:你可以建立一個具有寫入權限的 Role 並掛載給 EC2
  • Lambda 要寫入 DynamoDB,不需手動設定 Access Key
  • 第三方帳號(如合作夥伴)要暫時存取你的資源,可透過 Cross-account Role 授權

✅ 實作建議:

  • 儘量使用 Role,而非把 Access Key 寫死在程式中(這是重大安全風險)
  • Role 名稱應說明用途,例如:EC2-UploadToS3-Role
  • 需要跨帳號時,搭配 Resource-based Policy 一起設計

小結:三種身份的對比整理

身份類型是否能登入?是否有憑證?是否可套用 Policy?常見用途
User✅ 可登入控制台、CLI✅ 密碼、Access Key✅ Identity-based Policy人類使用者、工程師
Group❌ 無法登入❌ 無個別憑證✅ 套用後由 User 繼承整群使用者的權限控管
Role❌ 無法登入❌ 無帳密✅ 需被「扮演」後生效EC2、Lambda、跨帳號

Resource-based Policy 怎麼運作?

在 IAM 的世界裡,我們前面提到了一種常見的授權方式叫做 Identity-based Policy,意思是「我這個人/服務,能做什麼事」。

但 AWS 中也有一種相反邏輯的授權方式,叫做 Resource-based Policy(資源型政策),意思是:

「我是某個資源,我要決定誰可以來使用我。」

也就是說,這種授權邏輯是從資源本身出發來設定的,它會寫在資源內部,例如某個 S3 Bucket、Lambda Function、SNS Topic、SQS Queue 等。

資源透過這份政策來對外開放或限制存取行為。

Resource-based Policy 的使用場景

這種 Policy 通常用在以下幾種情境:

使用情境說明
❗ 跨帳號存取讓來自其他 AWS 帳號的 User 或 Role 存取你的資源
📂 資源分享讓某些公開或合作對象能存取特定資源(例如某個 S3 路徑)
🌍 建立開放式資源將特定資源(如 CDN 檔案、圖片)開放給匿名使用者(Public Access)
🔄 跨服務觸發Lambda 可以由 SNS 觸發、S3 可以觸發 Lambda,需要資源之間互相授權

Resource-based Policy 的語法結構

一份 Resource-based Policy 的 JSON 通常會包含以下欄位:

欄位說明
Effect設定此規則是允許(Allow)或拒絕(Deny)
Action資源允許的操作行為(例如:讀取、寫入)
Principal被授權者,也就是「誰可以存取我」
Resource被操作的 AWS 資源
Condition(選用)限制條件,例如 IP 來源、請求時間、MFA 等

進一步解析 Principal

Resource-based Policy 跟 Identity-based Policy 最大的語法差異就是多了一個欄位:

"Principal": {
  "AWS": "arn:aws:iam::123456789012:user/partner"
}

這行代表的是:「我這個資源允許帳號 123456789012 下的 partner 使用者來存取我。」

Principal 的值可以是:

類型寫法範例
IAM 使用者arn:aws:iam::123456789012:user/Alice
IAM Rolearn:aws:iam::123456789012:role/MyRole
AWS 帳號123456789012(代表帳號內的所有身份)
匿名使用者"*"(表示任何人,包括未登入者,例如 S3 公開資源)

📘 實際範例:S3 公開讀取設定

假設你想要讓「全世界」都可以讀取某個圖片資料夾:

{
  "Effect": "Allow",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::my-bucket/public/*"
}

這段代表:

  • 任何人("*")都可以對 my-bucket/public/ 資料夾下的物件執行 s3:GetObject(讀取)行為
  • 常用於放置公開圖片、影片或前端靜態檔案(如網站 HTML、JS)

⚠️ 注意:這會讓任何人都可以不登入就存取該路徑,因此要謹慎使用!

語法小技巧:允許跨帳號使用你的資源

假設你擁有一個帳號 A,要讓帳號 B 下的 Lambda 可以觸發你帳號 A 的 SNS Topic,就需要寫一份 Resource-based Policy 在 SNS 上:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::987654321000:role/LambdaInvoker"
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:ap-northeast-1:123456789012:MyTopic"
}

這樣帳號 B 的 LambdaInvoker 角色就可以「發訊息」到你的 SNS Topic。

🔒 安全建議與注意事項

項目建議
匿名授權(Principal: “*”)只應用於必要的公開資源,並搭配 Condition 強化限制
設定跨帳號時儘量精準設定 Principal,避免授權整個帳號
檢查資源支援並非所有 AWS 服務都支援 Resource-based Policy,例如 RDS、EC2 就不支援
搭配 IAM Roles 使用Resource-based Policy 通常搭配角色使用,以保證彈性與安全性

如果把 IAM Identity-based Policy 想像成「主動請求的能力」,那麼 Resource-based Policy 就像是「資源開門的許可」。

兩者常常需要同時搭配使用,才能完成一個完整的跨帳號或跨服務授權流程。

IAM 權限評估是如何進行的?

當你透過 AWS CLI、SDK 或控制台發出一個操作請求(例如上傳檔案到 S3),AWS 背後會經過一套嚴謹的「權限判斷流程」來決定是否允許這個行為。

這套流程會根據 IAM 中的各種政策(Policy)來進行評估,遵守一個核心原則:

預設拒絕(Implicit Deny),明確允許(Explicit Allow),明確拒絕優先(Explicit Deny)。

以下是完整的判斷流程,讓我們一步步來看:

先檢查 Identity-based Policy(身份型政策)

AWS 首先會檢查這個執行操作的身份(User、Group、Role)本身有沒有被賦予相應的權限。

如果該身份的 IAM Policy 中有明確允許這個動作,就進入下一步;

如果找不到任何允許的規則,則預設是「不允許」。

接著檢查 Resource-based Policy(資源型政策)

如果你操作的資源支援 Resource-based Policy(如 S3、Lambda、SNS…),AWS 會同時檢查這個資源有沒有開放權限給你這個「Principal」。

如果資源本身也允許你做這件事,才算完整授權。

📌 補充:兩邊都可以授權,只要有一方允許,就有可能成功。

若有任何一個明確的 Deny,就直接拒絕

這是 IAM 的安全原則之一:Explicit Deny(明確拒絕)優先級最高。

只要在任一條 Policy(無論是身份型還是資源型)中有寫明 Effect: "Deny",AWS 就會無條件拒絕這次請求,即使其他地方寫了 Allow

🧠 這可以用來蓋掉某些不應該開放的權限,例如:

{
  "Effect": "Deny",
  "Action": "s3:DeleteObject",
  "Resource": "*"
}

這條會讓你無法刪除任何 S3 物件,即使別的 Policy 說可以。

如果找不到任何 Allow,則預設為拒絕

IAM 採取的是「白名單」原則,意思是:

❌「如果沒有明確說你可以做這件事,那你就是不能做。」

這種「預設禁止」的策略,雖然限制比較嚴格,但可以大幅降低錯誤授權的風險,是大型雲端平台的標準做法。

實際評估流程小例子

假設你是一個 IAM 使用者 Alice,你發出一個動作:想從 my-bucket/public/file.txt 讀取資料(s3:GetObject):

Policy 類型有設定嗎?有授權嗎?結果
Alice 的 IAM Policy(身份型)✅ 有設定❌ 沒有允許這個 S3 Bucket繼續檢查
S3 Bucket 的 Bucket Policy(資源型)✅ 有設定✅ 有開放讀取給 Alice通過 ✅
是否有任何 Deny?❌ 沒有OK ✅
最終結果允許存取 🎉

若反過來,如果 Bucket Policy 有明確 Deny:

{
  "Effect": "Deny",
  "Action": "s3:GetObject",
  "Principal": "*",
  "Resource": "arn:aws:s3:::my-bucket/*"
}

即使你有被 Allow,結果仍然是 ❌ 拒絕。

IAM 整體架構邏輯總覽

以下是 IAM 相關元件的角色說明與定位整理表:

元件定義套用位置常見用途
Policy權限說明書,定義誰能對什麼做什麼套用在身份或資源上控制「誰能做什麼事」
User真實使用者身份(有帳密)被授權身份工程師、管理員登入 AWS 操作
Group使用者集合協助統一設定使用者權限團隊分組(如開發、財務)
Role可被扮演的虛擬身份被 EC2、Lambda 等扮演系統間存取、跨帳號授權
Identity-based Policy授權給 User / Group / Role綁定在身份上團隊內部操作資源
Resource-based Policy授權誰可以存取某資源綁定在資源本身(如 S3、SNS)跨帳號或公開使用資源

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *