角色、臨時認證與 SigV4

AWS Security 開發者實務

Rahul Singh

Technical Product Manager

任務結束後還活著的金鑰

為了加快作業,在腳本裡建立一把金鑰,並存入設定檔。

在檔案裡它會:

  • 從不輪替
  • 從不撤銷
  • 從不過期

一把存取金鑰散落到 6 個儲存位置,右側時間軸顯示到第 18 個月仍有效

AWS Security 開發者實務

任務結束後還活著的金鑰

為了加快作業,在腳本裡建立一把金鑰,並存入設定檔。

在檔案裡它會:

  • 從不輪替
  • 從不撤銷
  • 從不過期

 

18 個月後,它仍然有效

一把存取金鑰散落到 6 個儲存位置,右側時間軸顯示到第 18 個月仍有效

AWS Security 開發者實務

會自動到期的認證

用 AWS STS 讓到期成為預設

  1. 請求角色,取得內建時鐘的認證

  2. Security Token Service(STS):內含到期時間,預設 1 小時

應用程式呼叫 AWS STS 的 AssumeRole,STS 回傳帶內建時鐘的認證。

AWS Security 開發者實務

會自動到期的認證

用 AWS STS 讓到期成為預設

  1. 請求角色,取得內建時鐘的認證

  2. 臨時認證以 ASIA 開頭並帶有 session token

  3. Security Token Service(STS):內含到期時間,預設 1 小時

應用程式呼叫 AWS STS 的 AssumeRole 並取得帶內建時鐘的認證。下方並列兩種認證:長期金鑰以 AKIA 開頭、不帶 session token 且不會過期;臨時認證以 ASIA 開頭、帶 session token,並在 1 小時後到期。

AWS Security 開發者實務

會自動到期的認證

用 AWS STS 讓到期成為預設

  1. 請求角色,取得內建時鐘的認證

  2. 臨時認證以 ASIA 開頭並帶有 session token

  3. 同一次呼叫先被接受,之後不再接受

  4. Security Token Service(STS):內含到期時間,預設 1 小時

應用程式呼叫 AWS STS 的 AssumeRole 並取得帶內建時鐘的認證。下方為不會過期的 AKIA 長期金鑰,旁為 1 小時後到期且帶 session token 的 ASIA 臨時認證。再下方,同一個 GetObject 呼叫在 10:00 回應 200 OK,在 11:05 回應 ExpiredToken。

AWS Security 開發者實務

程式碼如何找到它們

檢查認證提供者鏈

  • AWS SDK(你程式碼用的函式庫)會負責搜尋
  • 依固定清單、照順序檢查
  • 先找到先用

認證查找順序:程式碼中傳入的金鑰在鏈上方被刪除線標示,搜尋依序經過環境變數、設定檔與容器認證,在第一個符合處停止,從未到達執行個體中繼資料

AWS Security 開發者實務

程式碼如何找到它們

檢查認證提供者鏈

  • AWS SDK(你程式碼用的函式庫)會負責搜尋
  • 依固定清單、照順序檢查
  • 先找到先用

 

硬編碼金鑰會最先被檢查,因此必須刪除

認證查找順序:程式碼中傳入的金鑰在鏈上方被刪除線標示,搜尋依序經過環境變數、設定檔與容器認證,在第一個符合處停止,從未到達執行個體中繼資料

AWS Security 開發者實務

一節一節看提供者鏈

1. explicit      a key passed in your code
2. environment   AWS_* variables, and on Lambda
                 that is the execution role
3. config file   ~/.aws/credentials
4. container     ECS or EKS task role
5. instance      EC2 instance profile, via IMDS
  • 先配對者勝出
  • 刪除已存金鑰,搜尋就會繼續到角色
AWS Security 開發者實務

在 AWS 外證明身分

部署管線常在 AWS 之外執行,無法掛上認證鏈

  • 跑在 GitHub 或 GitLab
  • 鏈上找不到任何東西

一個 CI 執行器與其平台畫在 AWS 邊界外,執行器標示無法附加角色,平台簽發一個 OIDC 權杖,內含單一儲存庫與單一工作流程名稱

AWS Security 開發者實務

在 AWS 外證明身分

部署管線常在 AWS 之外執行,無法掛上認證鏈

  • 跑在 GitHub 或 GitLab
  • 鏈上找不到任何東西

 

OIDC 權杖(OpenID Connect)

  • 已簽章且短效
  • 是身分聲明,不是認證

一個 CI 執行器與其平台畫在 AWS 邊界外,執行器標示無法附加角色,平台簽發一個 OIDC 權杖,內含單一儲存庫與單一工作流程名稱

AWS Security 開發者實務

用規則取代儲存金鑰

一個命名儲存庫的 OIDC 權杖,透過 AssumeRoleWithWebIdentity 交換為 1 小時後到期的臨時認證,因為角色的信任政策已事先指名該簽發者與該儲存庫

把權杖兌換成認證

AWS Security 開發者實務

用規則取代儲存金鑰

一個命名儲存庫的 OIDC 權杖,透過 AssumeRoleWithWebIdentity 交換為 1 小時後到期的臨時認證,因為角色的信任政策已事先指名該簽發者與該儲存庫

把權杖兌換成認證

  • AssumeRoleWithWebIdentity:AssumeRole,但用外部權杖作為證明
  • 信任政策:預先寫在角色上,不放在管線裡
  • Claim:權杖中的一個事實
  • 平台上所有儲存庫共享同一簽發者,因此也要固定儲存庫

儲存庫機密:現在是空的

AWS Security 開發者實務

每個請求都會簽章

Signature Version 4(SigV4)

  • 證明是哪個認證發出的請求
  • 證明請求在傳輸途中未被竄改
  • 每次呼叫都由 CLI 與 SDK 簽章

簽章流程:請求與你的認證產生簽章,放在 Authorization 標頭中;AWS 重新計算並比對,相符則接受,不符則回傳 SignatureDoesNotMatch

AWS Security 開發者實務

可轉交的簽章

臨時認證

  • 依角色範圍可執行多種動作
  • 由你的程式碼持有

你的程式碼以臨時認證呼叫四個不同的 AWS 服務:S3、DynamoDB、SQS 與 KMS

AWS Security 開發者實務

可轉交的簽章

臨時認證

  • 依角色範圍可執行多種動作
  • 由你的程式碼持有

Pre-signed URL(預先簽署 URL)

  • 一個物件、一個動作,持有連結者皆可用
  • 你自訂到期時間,之後即失效
  • 帶的是你的權限,不是持有者的

你的程式碼以臨時認證呼叫四個不同的 AWS 服務:S3、DynamoDB、SQS 與 KMS

別人的瀏覽器透過單一路徑存取唯一物件,中間以時鐘標示你設定的到期時間

AWS Security 開發者實務

一起來練習吧!

AWS Security 開發者實務

Preparing Video For Download...