Shell-Script

在 Shell 腳本中隱藏密碼

  • October 20, 2020

如何在 shell 腳本中隱藏密碼?有許多腳本正在訪問數據庫。如果我們打開腳本,其他人也會知道使用者名和密碼。所以如果有人知道如何隱藏,請告訴我。

我有一種方法:將密碼放在一個文件中並將該文件設置為隱藏文件,並且沒有人會訪問該文件(更改權限並在訪問數據庫時在腳本中使用該文件)。

首先,正如一些人已經說過的,將憑據與腳本分開是必不可少的。(除了提高安全性之外,這還意味著您可以為具有不同憑據的多個系統重複使用相同的腳本。)

其次,您不僅應該考慮​​憑證的安全性,還應該考慮這些憑證是否/何時受到損害的影響。你不應該只有一個密碼來訪問數據庫,你應該有不同的憑據和不同的訪問級別。例如,您可以擁有一個能夠在數據庫中執行搜尋的數據庫使用者——該使用者應該具有隻讀訪問權限。另一個使用者可能有權插入新記錄,但不能刪除它們。第三個人可能有權刪除記錄。

除了限制每個帳戶的權限外,您還應該限制每個帳戶的使用位置。例如,您的網路伺服器使用的帳戶不應被允許從網路伺服器以外的任何其他 IP 地址進行連接。對數據庫具有完全 root 權限的帳戶在可以連接的位置方面確實應該受到非常嚴格的限制,並且不應該以互動方式使用。此外,考慮使用數據庫中的儲存過程來精確限制每個帳戶可以執行的操作。

這些限制需要在系統的數據庫伺服器端實施,這樣即使客戶端受到威脅,也無法從它更改限制。(而且,顯然,除了數據庫配置之外,數據庫伺服器還需要使用防火牆等進行保護……)

對於僅允許有限只讀訪問且僅來自特定 IP 地址的數據庫帳戶,您可能不需要任何其他憑據,具體取決於數據的敏感性和腳本主機的安全性正在執行。一個範例可能是您網站上的搜尋表單,該表單可以由僅允許使用儲存過程的使用者執行,該儲存過程僅提取將在網頁上顯示的資訊。在這種情況下,添加密碼並不能真正賦予任何額外的安全性,因為該資訊已經是公開的,並且使用者無法訪問任何其他更敏感的數據。

此外,請確保使用 TLS 建立與數據庫的連接,否則任何在網路上監聽的人都可以獲取您的憑據。

第三,考慮使用什麼樣的憑證。密碼只是一種形式,並不是最安全的。您可以改為使用某種形式的公鑰/私鑰對或 AD/PAM 等。

第四,考慮腳本執行的條件:

如果它以互動方式執行,那麼當你執行它時,你應該輸入密碼,或者私鑰的密碼,或者私鑰,或者使用有效的 Kerberos 票證登錄 - 換句話說,腳本應該得到它的在您執行它時直接從您那裡獲取憑據,而不是從某個文件中讀取它們。

如果它是從網路伺服器執行的,請考慮在啟動網路伺服器時設置憑據。SSL 證書就是一個很好的例子——它們有一個公共證書和一個私鑰,而私鑰有一個密碼。您可以將私鑰儲存在 Web 伺服器上,但在啟動 Apache 時仍需要輸入密碼。您還可以在某種硬體上擁有憑據,例如物理卡或 HSM,一旦伺服器啟動就可以刪除或鎖定這些憑據。(當然,這種方法的缺點是如果發生某些事情,伺服器無法自行重新啟動。我寧願這樣做,而不是冒著讓我的系統受損的風險,但你的里程可能會有所不同……)

如果腳本是從 cron 執行的,這是困難的部分。您不希望將憑據放在系統上任何人可以訪問它們的任何地方 - 但您確實希望將它們放在周圍以便您的腳本可以訪問它們,對嗎?嗯,不太對。仔細考慮腳本在做什麼。它需要對數據庫的什麼權限?是否可以對其進行限制,以使錯誤的人與這些權限連接無關緊要?您可以直接在其他人無權訪問的數據庫伺服器上執行腳本,而不是從有其他使用者的伺服器上執行腳本嗎?如果出於某種我想不出的原因,您絕對必須讓腳本在不安全的伺服器上執行,並且它必須能夠做一些危險/破壞性的事情……現在是重新思考你的架構的好時機。

第五,如果您重視數據庫的安全性,則不應在其他人可以訪問的伺服器上執行這些腳本。如果有人登錄您的系統,那麼他們有可能獲取您的憑據。例如,對於具有 SSL 證書的 Web 伺服器,理論上至少有可能有人能夠獲得 root 權限並訪問 httpd 程序的記憶體區域並提取憑據。最近至少有一個漏洞可以通過 SSL 完成,甚至不需要攻擊者登錄。

此外,考慮使用 SELinux 或 AppArmor 或任何可用於您的系統的東西來限制哪些使用者可以做什麼。它們將使您可以禁止使用者甚至嘗試連接到數據庫,即使他們確實設法獲得了對憑據的訪問權限。

如果這一切對你來說聽起來有點矯枉過正,而你負擔不起或沒有時間去做——那麼,在我(傲慢和精英主義者)看來,你不應該在數據庫中儲存任何重要或敏感的東西。如果你沒有儲存任何重要或敏感的東西,那麼你儲存憑據的位置也不重要——在這種情況下,為什麼要使用密碼呢?

最後,如果您絕對無法避免儲存某種憑證,您可以將憑證設為只讀並由 root 擁有,並且 root 可以在腳本請求時臨時授予所有權(因為您的腳本應該是除非絕對必要,否則以 root 身份執行,並且連接到數據庫並不需要)。但這仍然不是一個好主意。

引用自:https://unix.stackexchange.com/questions/212329