讓祕密遠離程式碼與日誌

AWS Security 開發者實務

Rahul Singh

Technical Product Manager

敏感不等於祕密

三種字串

  • Secret(祕密): 陌生人可冒充你
  • Sensitive data(敏感資料): 會暴露個資
  • Config(設定): 無利可圖

三列並排比較 secret、sensitive data 與 config。每列顯示兩個範例值,以及陌生人能做什麼:從冒充你到毫無可圖。

AWS Security 開發者實務

敏感不等於祕密

三種字串

  • Secret(祕密): 陌生人可冒充你
  • Sensitive data(敏感資料): 會暴露個資
  • Config(設定): 無利可圖

個人資料的兩個名稱

  • PII: personally identifiable information(可識別個人資訊)
  • PHI: protected health information(受保護健康資訊)

三列並排比較 secret、sensitive data 與 config。每列顯示兩個範例值,以及陌生人能做什麼:從冒充你到毫無可圖。

AWS Security 開發者實務

祕密外洩的四條路

執行中的系統裡,一個祕密向外分出四條編號路徑:1 程式碼與其歷史;2 環境變數;3 應用程式日誌;4 錯誤輸出與追蹤。四條路最後匯入「某人可讀取」。

  1. 原始碼與其歷史
  2. 環境變數
AWS Security 開發者實務

祕密外洩的四條路

執行中的系統裡,一個祕密向外分出四條編號路徑:1 程式碼與其歷史;2 環境變數;3 應用程式日誌;4 錯誤輸出與追蹤。四條路最後匯入「某人可讀取」。

  1. 原始碼與其歷史
  2. 環境變數
  3. 應用程式日誌
  4. 錯誤輸出與追蹤
AWS Security 開發者實務

靜態加密不等於隱藏

看似安全的選項

  • 永遠「保存加密」
  • AWS KMS 金鑰,預設由 AWS 管理

一個持有環境變數的 Lambda 函式分成兩條路:磁碟上以 AWS KMS 金鑰靜態加密(綠色),透過 API 呼叫 GetFunctionConfiguration 則回傳明文(紅色)。註記指出僅一條路受保護。

AWS Security 開發者實務

靜態加密不等於隱藏

看似安全的選項

  • 永遠「保存加密」
  • AWS KMS 金鑰,預設由 AWS 管理

GetFunctionConfiguration 會回傳

  • 明文值

用儲存回答存取問題

一個持有環境變數的 Lambda 函式分成兩條路:磁碟上以 AWS KMS 金鑰靜態加密(綠色),透過 API 呼叫 GetFunctionConfiguration 則回傳明文(紅色)。註記指出僅一條路受保護。

AWS Security 開發者實務

選哪個存放,為什麼

兩個服務,各司其職

  • Secrets Manager: 為祕密而生
  • Parameter Store: 為設定而生,SecureString 參數以 KMS 金鑰加密

一張光譜圖。左為 Secrets Manager,右為 Systems Manager Parameter Store,中間有四條水平軌。每條軌上有一個編號標記:1 靠左、2 左偏中、3 正中、4 靠右;第 4 軌兩端有成本數字並註記「由輪換決定」。

AWS Security 開發者實務

選哪個存放,為什麼

兩個服務,各司其職

  • Secrets Manager: 為祕密而生
  • Parameter Store: 為設定而生,SecureString 參數以 KMS 金鑰加密

四件事決定選擇

  1. 受管輪換
  2. 跨帳號分享
  3. 版本管理
  4. 成本

一張光譜圖。左為 Secrets Manager,右為 Systems Manager Parameter Store,中間有四條水平軌。每條軌上有一個編號標記:1 靠左、2 左偏中、3 正中、4 靠右;第 4 軌兩端有成本數字並註記「由輪換決定」。

AWS Security 開發者實務

即取即用,短暫快取

你的執行中程序在標記 1 於祕密存放呼叫 GetSecretValue,並以標記 2 的限縮角色僅允許一個 secret ARN 加上 kms:Decrypt,然後在標記 3 把回傳值暫存在記憶體快取,再去呼叫資料庫或合作夥伴 API。

  1. 啟動時呼叫 GetSecretValue
  2. 角色僅限一個 secret ARN 加上 kms:Decrypt
AWS Security 開發者實務

即取即用,短暫快取

你的執行中程序在標記 1 於祕密存放呼叫 GetSecretValue,並以標記 2 的限縮角色僅允許一個 secret ARN 加上 kms:Decrypt,然後在標記 3 把回傳值暫存在記憶體快取,再去呼叫資料庫或合作夥伴 API。

  1. 啟動時呼叫 GetSecretValue
  2. 角色僅限一個 secret ARN 加上 kms:Decrypt
  3. 將值快取在記憶體

快取太久,輪換就會害你壞掉

AWS Security 開發者實務

輪換會在你腳下換值

為何四步驟,而非一次換掉

  • 新值會在任何人使用前被驗證
  • 一次換掉會同時弄壞所有用戶端

頁面上三欄:輪換步驟、標籤、你的快取。Secrets Manager 依序執行 createSecret、setSecret、testSecret,虛線標示 finishSecret 移動標籤的時刻。虛線之上標籤為 AWSCURRENT=舊值且快取正確;之下標籤為 AWSCURRENT=新值,但同一份快取被標紅。圖末兩個修正:縮短快取存活時間、驗證失敗時重新讀取。

AWS Security 開發者實務

輪換會在你腳下換值

為何四步驟,而非一次換掉

  • 新值會在任何人使用前被驗證
  • 一次換掉會同時弄壞所有用戶端

四步驟,一次交接

  • AWSPENDING、AWSCURRENT、AWSPREVIOUS

頁面上三欄:輪換步驟、標籤、你的快取。Secrets Manager 依序執行 createSecret、setSecret、testSecret,虛線標示 finishSecret 移動標籤的時刻。虛線之上標籤為 AWSCURRENT=舊值且快取正確;之下標籤為 AWSCURRENT=新值,但同一份快取被標紅。圖末兩個修正:縮短快取存活時間、驗證失敗時重新讀取。

AWS Security 開發者實務

輪換會在你腳下換值

為何四步驟,而非一次換掉

  • 新值會在任何人使用前被驗證
  • 一次換掉會同時弄壞所有用戶端

四步驟,一次交接

  • AWSPENDING、AWSCURRENT、AWSPREVIOUS

沒有東西會通知你的快取

  • 存活幾分鐘,然後重讀
  • 驗證失敗時重新整理

頁面上三欄:輪換步驟、標籤、你的快取。Secrets Manager 依序執行 createSecret、setSecret、testSecret,虛線標示 finishSecret 移動標籤的時刻。虛線之上標籤為 AWSCURRENT=舊值且快取正確;之下標籤為 AWSCURRENT=新值,但同一份快取被標紅。圖末兩個修正:縮短快取存活時間、驗證失敗時重新讀取。

AWS Security 開發者實務

遮罩、編修,仍可除錯

一行原始日誌含請求 ID、完整卡號與權杖,以紅框標示。下方是處理後的三欄:請求 ID 保留、卡號僅留末 4 碼、權杖以「已編修」標記取代,並註記「保留足夠資訊可除錯」。

寫入前先淨化

  • Mask(遮罩): 保留結構,隱藏數值
AWS Security 開發者實務

遮罩、編修,仍可除錯

一行原始日誌含請求 ID、完整卡號與權杖,以紅框標示。下方是處理後的三欄:請求 ID 保留、卡號僅留末 4 碼、權杖以「已編修」標記取代,並註記「保留足夠資訊可除錯」。

寫入前先淨化

  • Mask(遮罩): 保留結構,隱藏數值
  • Redact(編修): 移除數值,留標記
AWS Security 開發者實務

遮罩、編修,仍可除錯

一行原始日誌含請求 ID、完整卡號與權杖,以紅框標示。下方是處理後的三欄:請求 ID 保留、卡號僅留末 4 碼、權杖以「已編修」標記取代,並註記「保留足夠資訊可除錯」。

寫入前先淨化

  • Mask(遮罩): 保留結構,隱藏數值
  • Redact(編修): 移除數值,留標記

值班要設定,陌生人其餘免看

AWS Security 開發者實務

一起來練習吧!

AWS Security 開發者實務

Preparing Video For Download...