使用 IAM 授權服務存取

在 AWS 上部署應用程式

Dunieski Otano

Amazon Web Services Solutions Architect

Commit 裡的金鑰

  • 長期存活的存取金鑰被提交到 repo
  • 掃描機器人發現並刷爆帳單
  • 透過角色與最小權限可避免此事

在程式提交中不小心外洩的 AWS 存取金鑰,被標記為安全風險

在 AWS 上部署應用程式

IAM 主體:使用者、角色與政策

IAM 三欄示意圖:左側為 Principal(使用者、服務或角色),中間為具有 Allow/Deny 動作的 Policy 文件,右側為具短期憑證的 IAM 角色

  • Principal:誰在提出請求
  • Policy:授權的 JSON 文件
  • Role:可被實體承擔的一組權限
  • 角色是被承擔;使用者持有長期憑證
在 AWS 上部署應用程式

正確使用程式憑證

  • Lambda:執行角色授與權限
  • EC2:執行個體設定檔提供角色憑證
  • ECS:工作角色以工作為範圍指派權限
  • 代碼或設定中不放長期金鑰

三種 AWS 運算服務以角色取代長期金鑰:Lambda 執行角色、EC2 執行個體設定檔、ECS 工作角色,皆顯示自動輪替憑證

在 AWS 上部署應用程式

AssumeRole 與 STS

  • STS AssumeRole:取得角色的臨時憑證
  • 用於跨帳號存取
  • 信任政策決定誰可承擔該角色
  • 憑證短期有效且自動失效

STS AssumeRole 跨帳號流程:Account A 呼叫者向 STS 請求憑證,Account B 角色的信任政策允許後,STS 回傳自動失效的短期憑證

在 AWS 上部署應用程式

最小權限與政策結構

一個政策陳述包含 3 個必要部分(EffectActionResource),以及可選的 Condition

{
  "Effect": "Allow",
  "Action": "dynamodb:PutItem",
  "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/Orders",
  "Condition": {
    "Bool": { "aws:SecureTransport": "true" }
  }
}
在 AWS 上部署應用程式

IAM 的邊界與你的程式碼


IAM:服務層

  • 授權 AWS API 呼叫:此角色能呼叫這個操作嗎?
  • 無法強制 每租戶每筆紀錄 的規則

你的程式碼:資料層

  • 依請求資料檢查已驗證使用者
  • 兩者並用:IAM 管服務,你的程式碼管資料
在 AWS 上部署應用程式

最小權限執行角色的實作

精簡的 Lambda 執行角色:只授與單一 DynamoDB 表的 PutItem 權限,Action 與 Resource 均無萬用字元

  • 某個 Lambda 只需寫入一個 DynamoDB 表
  • 僅對該表的 ARN 授與 dynamodb:PutItem
  • Action 與 Resource 皆不使用萬用字元
  • 僅在實際呼叫被拒時再補權
在 AWS 上部署應用程式

一起來練習吧!

在 AWS 上部署應用程式

Preparing Video For Download...