身分、資源與邊界

AWS Security 開發者實務

Rahul Singh

Technical Product Manager

哪個政策說了算?

改了但沒改變

  • 第 1 章:明確拒絕,或未允許
  • 這裡:第三種原因

一個請求面對三層政策檢查,決策處以問號表示。

AWS Security 開發者實務

哪個政策說了算?

最多三層

  1. 呼叫者的身分政策
  2. 資源本身的資源政策
  3. 往上的邊界,只會減不會加

在你自己的帳號中,任一政策允許即可

遇到任何一層拒絕即被拒

一個請求自上而下依序通過三個檢查:身分政策、資源政策、權限邊界,最後獲准。

AWS Security 開發者實務

政策可以放的兩個位置

身分型政策(Identity-based)

  • 附加在呼叫者上
  • 規範該身分可做什麼
  • 像你佩帶的通行證

頂端的角色帶有身分型政策,下方保留相同請求的資源端空間。

AWS Security 開發者實務

政策可以放的兩個位置

身分型政策(Identity-based)

  • 附加在呼叫者上
  • 規範該身分可做什麼
  • 像你佩帶的通行證

資源型政策(Resource-based)

  • 附加在資源上
  • 誰可存取它
  • 跨帳號呼叫需要它

頂端角色帶有身分型政策,下方 S3 bucket 帶有資源型政策,請求在兩者之間往下傳遞。

AWS Security 開發者實務

由 AWS 代管,或由你自管

兩種身分型政策

  • AWS 代管:由 AWS 擁有
  • 客戶自管:由你擁有

兩張卡片比較 AWS 代管政策(AWS 擁有、預設範圍較廣)與客戶自管政策(你擁有、依任務範圍化)。

AWS Security 開發者實務

由 AWS 代管,或由你自管

兩種身分型政策

  • AWS 代管:由 AWS 擁有
  • 客戶自管:由你擁有

 

便利或精準

  • AWS 代管:動得快
  • 客戶自管:最小必要權限

兩張卡片比較 AWS 代管政策(AWS 擁有、預設範圍較廣)與客戶自管政策(你擁有、依任務範圍化)。

AWS Security 開發者實務

邊界為政策授與設上限

為何帳號會套用它

  • 開發者可建立角色,但無人能升權

權限邊界(Permissions boundary)

  • 對政策授與設上限
  • 實際生效:需同時被兩者允許

身分政策授與的三個權限往下進入僅允許 S3 動作的權限邊界,`iam:CreateUser` 被擋下,另外兩個通過,形成下方的有效權限。

AWS Security 開發者實務

邊界為政策授與設上限

為何帳號會套用它

  • 開發者可建立角色,但無人能升權

權限邊界

  • 對政策授與設上限
  • 實際生效:需同時被兩者允許

為什麼 iam:CreateUser 沒有作用

  • 只會減少,從不授與

身分政策授與的三個權限往下進入僅允許 S3 動作的權限邊界,`iam:CreateUser` 被擋下,另外兩個通過,形成下方的有效權限。

AWS Security 開發者實務

邊界為政策授與設上限

為何帳號會套用它

  • 開發者可建立角色,但無人能升權

權限邊界

  • 對政策授與設上限
  • 實際生效:需同時被兩者允許

為什麼 iam:CreateUser 沒有作用

  • 只會減少,從不授與

工作階段政策:一次 AssumeRole 工作階段

身分政策授與的三個權限往下進入僅允許 S3 動作的權限邊界,`iam:CreateUser` 被擋下,另外兩個通過,形成下方的有效權限。

AWS Security 開發者實務

條件會縮限允許範圍

條件鍵(Condition key)

  • 將允許縮限到請求脈絡

  • aws:SourceIp:來自哪個網路

讀取 S3 物件的一個允許通過條件帶,列出來源網路鍵與呼叫者標籤鍵;符合脈絡時走允許路徑,否則被拒。

AWS Security 開發者實務

條件會縮限允許範圍

條件鍵(Condition key)

  • 將允許縮限到請求脈絡

  • aws:SourceIp:來自哪個網路

  • aws:PrincipalTag:呼叫者的標籤

ABAC:屬性式存取控制

  • 一份政策,套用多個主體

讀取 S3 物件的一個允許通過條件帶,列出來源網路鍵與呼叫者標籤鍵;符合脈絡時走允許路徑,否則被拒。

AWS Security 開發者實務

同表使用,一次一個租戶

共用一張表

  • DynamoDB,每個租戶一個分割鍵
  • 本身不具隔離

租戶 A 的呼叫者通過前置鍵條件進入共用的 DynamoDB 資料表,只回傳租戶 A 的列,租戶 B 與 C 的列被擋。

AWS Security 開發者實務

同表使用,一次一個租戶

"Condition": {
  "ForAllValues:StringEquals": {
    "dynamodb:LeadingKeys": ["${aws:PrincipalTag/tenant}"]
  }
}

共用一張表

  • DynamoDB,每個租戶一個分割鍵
  • 本身不具隔離

用一個條件來縮限

  • ForAllValues:所有提供的鍵都必須相符
AWS Security 開發者實務

同表使用,一次一個租戶

"Action": ["dynamodb:Query", "dynamodb:GetItem", "dynamodb:Scan"],
"Condition": {
  "ForAllValues:StringEquals": {
    "dynamodb:LeadingKeys": ["${aws:PrincipalTag/tenant}"]
  }
}

共用一張表

  • DynamoDB,每個租戶一個分割鍵
  • 本身不具隔離

用一個條件來縮限

  • ForAllValues:所有提供的鍵都必須相符
留下的缺口:不是每個請求都會指定分割區
  • dynamodb:Scan 不提供鍵,因此不會觸發比對
AWS Security 開發者實務

一起來練習吧!

AWS Security 開發者實務

Preparing Video For Download...