如何安全地儲存環境變數並使其在我的電腦中實際上不可見?

如何安全地儲存環境變數並使其在我的電腦中實際上不可見?

我正在學習環境變數。例如,我知道如果我有一個秘密密碼,我不應該將其編碼在我的程式碼中。

據我了解,一個.env文件應該用於載入機密和環境變數。

儲存變數的一種更安全的方法是使用 CLI 變數來存儲命令。

所有這一切的原因是為了避免您的密碼和敏感資料不暴露給未經授權的人。

現在假設我創建了一個網站,其中存儲了一些 API 秘密作為 CLI 變量,並且黑客能夠訪問我的伺服器,他只需鍵入命令就可以輕鬆找到 API 秘密和密碼列印環境在 CLI 上。

與將 CLI 變數儲存在 .env 檔案中相比,使用 CLI 變數有什麼優勢?我如何確保這些變數即使對於陌生用戶也是隱藏的。

答案1

儲存變數的一種更安全的方法是使用 set 命令將其作為 CLI 變數來執行。

不,這不對。其一,該命令實際上並不店鋪他們在任何地方都堅持不懈;關於實際環境變數的另一個更重要的事情是它們與安全儲存完全相反。他們的整個功能都是基於每個過程獲得所有環境變數的免費副本 - 如果您要setx在 Windows 上使用例如來使變數持久存在,那麼實際上您運行的每個應用程式或工具此後都會自動獲得一個副本,無論它是否要求它們。

當您看到.env正在使用的檔案時,通常它們要么僅專門加載到web 應用程式的環境中,要么根本不用作環境變數(僅模仿熟悉的API,但實際上將變數加載到普通的舊字典/數組中)。在前一種情況下,這些變數仍然可用於由 web 應用程式直接產生的程序,但是絕不可供常規 SSH CLI 使用——儘管仍稱為“環境變數”,但這不是預期用途。


(應用程式本身當然仍然可以存取它們——畢竟,它需要知道 API 金鑰才能使用 API,所以這是不可避免的。遵循推薦的程式設計實踐,以降低攻擊者找到方法的可能性來運行它printenv;例如,不要將檔案名稱等外部輸入直接放入命令中。

根據您使用的 API,可能可以將您的應用程式分成兩部分(有點像微服務),這樣前端就不會直接存取 API,而是始終透過另一個知道 API 金鑰的服務,並且只允許前端執行非常具體的任務。

答案2

秘密/密碼/金鑰管理是一個複雜的遊戲,需要平衡您想要投入的精力與風險的大小。這裡有一些例子:

  • 透過命令列參數傳入的秘密:系統上的任何使用者都可以看到它們
  • 從 text/.env 檔案傳入的機密:任何具有該檔案讀取權限的使用者都可以竊取它們。如果您使用 CLI命令,預設情況下這些命令也會顯示在您的命令歷史記錄中
  • 從另一台伺服器載入的機密:存取該伺服器的憑證仍然儲存在本地
  • 僅儲存在記憶體中的機密:具有 root 存取權限的使用者可以從原始記憶體中存取和轉儲數據

如果有人控制了您的伺服器,他們只需更改您的程式碼即可向他們發送密碼(例如竊取信用卡資訊的常見方法)。


我建議不要在本地以純文字形式儲存主要機密,因為掃描文件中的密碼非常簡單。除此之外,這取決於你。提高安全性的一些不錯的方法是:

  • 使用某種加密金鑰庫來儲存本地機密:只需添加另一個步驟來存取真實密碼就可以阻止許多簡單的攻擊
  • 使用外部伺服器/服務來儲存機密,這樣只有本地存取權限的人就無法輕鬆取得所有內容

相關內容