Lambda 輪換函數 - AWS Secrets Manager

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Lambda 輪換函數

在 中依 Lambda 函數輪換,Lambda 函數會執行輪換秘密的工作。輪換期間,Secrets Manager 會使用預備標籤標示秘密版本。

如果 Secrets Manager 未提供秘密類型的輪換函數範本,您可以建立輪換函數。寫入輪換函數時,請遵循每個步驟的指引。

撰寫您自己的輪換函數的提示
  • 使用一般輪換範本作為起點,以寫入您自己的輪換函數。

  • 撰寫函數時,請謹慎納入偵錯或記錄陳述式。這些陳述式可能會導致函數中的資訊寫入 Amazon CloudWatch,因此您需要確保日誌不包含開發期間收集的任何敏感資訊。

    如需日誌陳述式的範例,請參閱AWS Secrets Manager 輪換函數範本原始程式碼。

  • 為了安全起見,Secrets Manager 僅允許 Lambda 輪換函數直接輪換機密。輪換函數無法呼叫第二個 Lambda 函數來輪換機密。

  • 如需偵錯建議,請參閱 Testing and debugging serverless applications (測試與偵錯無伺服器應用程式)。

  • 如果您使用外部二進位檔和程式庫來連線到資源,則必須管理修補並保留它們 up-to-date。

  • 將輪換函數儲存在ZIP檔案中 my-function.zip 以及任何必要的相依性。

輪換函數中的四個步驟

create_secret:建立新的秘密版本

方法create_secret會先透過get_secret_value呼叫傳入 來檢查是否存在秘密ClientRequestToken。如果沒有秘密,它會使用 建立新的秘密,create_secret並將權杖作為 VersionId。然後,它會使用 產生新的秘密值get_random_password。接下來,它會呼叫 put_secret_value,將其與預備標籤一起存放AWSPENDING。將新的秘密值儲存在 AWSPENDING 中,有助於確保等冪性。如果輪換因任何原因而失敗,您可以在後續呼叫中參考該秘密值。請參閱 How do I make my Lambda function idempotent (如何讓 Lambda 函數等冪)。

撰寫您自己的輪換函數的提示
  • 確保新的秘密值僅包含對資料庫或服務有效的字元。使用 ExcludeCharacters 參數排除字元。

  • 當您測試函數時,請使用 AWS CLI 來查看版本階段:呼叫describe-secret並查看 VersionIdsToStages

  • 對於 Amazon RDS My SQL,在交替使用者輪換時,Secrets Manager 會建立名稱不超過 16 個字元的複製使用者。您可以修改旋轉功能以允許更長的用戶名。我的SQL 5.7 版和更新版本支援最多 32 個字元的使用者名稱,但 Secrets Manager 會將 "_clone" (六個字元) 附加到使用者名稱的結尾,因此您必須將使用者名稱保留為最多 26 個字元。

set_secret:變更資料庫或服務中的憑證

方法會set_secret變更資料庫或服務中的憑證,以符合秘密AWSPENDING版本中的新秘密值。

撰寫您自己的輪換函數的提示
  • 如果您將陳述式傳遞給解譯陳述式的服務,例如資料庫,請使用查詢參數化。如需詳細資訊,請參閱 OWASP 網站上的查詢參數化備忘單

  • 輪換函數是具有特殊權限的代理人,有權存取和修改 Secrets Manager 秘密和目標資源中的客戶憑證。為了防止潛在的混淆代理人攻擊,您必須確保攻擊者無法使用該函數存取其他資源。在您更新憑證之前:

    • 查看 AWSCURRENT 版本秘密中的憑證是否有效。如果 AWSCURRENT 憑證無效,請放棄輪換嘗試。

    • 查看 AWSCURRENTAWSPENDING 秘密值是否針對相同的資源。對於使用者名稱和密碼,請查看 AWSCURRENTAWSPENDING 使用者名稱是否相同。

    • 檢查目的地服務資源是否相同。對於資料庫,請查看 AWSCURRENTAWSPENDING 主機名稱是否相同。

  • 在極少數情況下,您可能想要自訂資料庫的現有輪換函數。例如,使用者交替輪換時,Secrets Manager 會複製第一個使用者的執行期組態參數來建立複製的使用者。如果您想要包含更多屬性,或變更哪些屬性以授予複製的使用者,則需要更新 set_secret 函數中的程式碼。

test_secret:測試新的秘密版本

接下來,Lambda 輪換函數會使用 AWSPENDING 版本的秘密存取資料庫或服務,以進行測試。根據 輪換函數範本 建立的輪換函數會使用讀取權限測試新的秘密。

finish_secret:完成輪換

最後,Lambda 輪換函數會將標籤AWSCURRENT從先前的秘密版本移至此版本,這也會在相同的API呼叫中移除AWSPENDING標籤。Secrets Manager 會將 AWSPREVIOUS 預備標籤新增至先前版本,以便您保留上一個已知良好的秘密版本。

此方法finish_secret使用 將預備標籤AWSCURRENT從先前的秘密版本update_secret_version_stage移至新的秘密版本。Secrets Manager 會自動將 AWSPREVIOUS 預備標籤新增至先前版本,以便您保留上一個已知良好的秘密版本。

撰寫您自己的輪換函數的提示
  • 在此AWSPENDING之前,請勿移除 ,也不要使用個別的API呼叫來移除它,因為這可能會向 Secrets Manager 指出輪換未成功完成。Secrets Manager 會將 AWSPREVIOUS 預備標籤新增至先前版本,以便您保留上一個已知良好的秘密版本。

輪換成功時,AWSPENDING 預備標籤可能會連接至與 AWSCURRENT 版本相同的版本,或者可能未連接至任何版本。如果 AWSPENDING 預備標籤存在,但未連接至與 AWSCURRENT 相同的版本,則任何以後的輪換調用都會假定之前的輪換請求仍在進行中並傳回錯誤。輪換不成功時,AWSPENDING 預備標籤可能會連接至空的機密版本。如需詳細資訊,請參閱輪換疑難排解