Amazon-Web-Services

如何安全地將秘密傳遞給應用程序

  • January 29, 2021

我有一個公開 REST API 的應用程序,該 API 需要一些秘密才能啟動,例如數據庫密碼、p12 密鑰庫密碼或 HS512 密鑰以用於發布令牌。這些值是從應用程序環境中提取的。我將把應用程序部署到 AWS EC2。我想出了 4 個選項來傳遞這些值:

  1. 由於環境變數通過 switch 到java命令傳遞 - 這將非常不方便
  2. 創建一個 bash 腳本,其中儲存在純文字中的硬編碼密碼執行java命令 - 這將使連接到 EC2 實例的任何人都可以使用它們。
  3. 與上面相同,但不是以純文字形式儲存秘密,而是使用對稱密鑰對其進行加密,並讓腳本提示它並使用解密的值執行應用程序。
  4. AWS 秘密管理器——這對於一個簡單的 Web 應用程序來說似乎有點過頭了,而且還會帶來成本。

這樣做的正確方法是什麼?選項3甚至有意義嗎?

  • 選項 1 和 2 - 將任何秘密硬編碼或與您的應用程序捆綁在一起絕不是一個好主意。
  • 選項 3 - 好多了,但是您要如何處理解密的值?將它們儲存到屬性文件中?那麼,任何連接到 EC2 的人都可以訪問它們。即使您通過環境變數傳遞秘密/proc/$PID/environ,任何有足夠權限來打開該文件的人仍然可以讀取它們。
  • 選項 4 - 雖然它的成本很低(每月 0.40 美元),但它是最好的方法。該應用程序可以直接與Secrets Manager對話以使用EC2 實例角色檢索密鑰,並且可以使用它們而無需將它們儲存在任何中間文件或環境變數中。

問題是任何可以訪問實例的人也可以使用相同的 EC2 角色從 SSM 讀取 Secret。

底線是 - 不要讓任何不受信任的人訪問該實例。如果應用程序能夠以某種方式獲取秘密,那麼任何擁有該實例的管理員(root)訪問權限的人都可以。幾乎沒有辦法解決它。

引用自:https://serverfault.com/questions/1051017