2011-10-18 354 views
6

我們有一個運行在JBoss和Linux上的Java Web應用程序。生產環境數據庫連接參數來自只存在於生產環境應用程序服務器上的配置文件。該配置文件只能由運行應用程序的用戶ID讀取(我們稱之爲用戶appuser),唯一可以登錄到生產環境服務器的人員以及sudo to appuser是我們運營團隊的成員。生產環境本身在所有其他環境中被防火牆擋住。在生產環境中保護密碼

我們希望使這更安全。具體而言,我們希望阻止操作團隊讀取配置文件中當前的數據庫連接密碼和其他密鑰。

另一個需要記住的因素是操作團隊負責構建和部署應用程序。

我們有什麼選擇?該解決方案需要支持手動重新啓動應用程序,並在操作系統重新引導時自動啓動應用程序。

更新

我現在調查(尖亞當斯基對他的建議,大致翻譯成步驟1)解決方案:

  1. 寫一個包裝可執行是setuid用戶啓動/停止應用程序並擁有JBoss目錄樹中的配置文件和所有內容。

  2. 使用jarsigner在WAR生成後對其進行簽名。戰爭的建設將通過發展來完成。包裝將驗證簽名,驗證WAR沒有被篡改。

  3. 將部署過程更改爲僅部署帶符號的WAR。包裝器也可以將WAR移動到JBoss deploy目錄中。

+0

注意:任何簽名只有在使用真實證書而不是自簽名時纔有意義。此外,JVM仍然可能被篡改。 –

+0

對,JDK安裝也需要被鎖定,特別是'cacerts'目錄。 – sourcedelica

回答

3

爲什麼不只是爲操作團隊創建第二個用戶來申請,其中只有文件權限的子集與應用程序的用戶ID相比較?

無需更改代碼;很好,很簡單。

+0

他們如何啓動應用程序?使啓動腳本setuid? – sourcedelica

+0

是的,你可以這樣做。 – Adamski

+0

我不能讓腳本本身setuid(我忘記了這個限制),但我可以編寫一個運行腳本的包裝器可執行文件,並製作包裝setuid。 – sourcedelica

3

你會覺得很有趣,看看Jetty的人已接近這個問題:

http://wiki.eclipse.org/Jetty/Howto/Secure_Passwords

這至少保證了你不能直接讀取密碼,但需要一些認真的努力得到一個人性化的可讀版本。

如果Jetty許可證與您想要執行的操作兼容,則可以取消其代碼。

+0

您需要訪問碼頭解密代碼和加密密鑰,這兩者都將在源代碼管理中。嗯.. – sourcedelica

+0

讓我們知道你在找什麼。請記住,如果一臺電腦可以使用它,它可以被解碼。 –

+0

用建議的方法更新了問題。 – sourcedelica

0

簡單的方法是使用Unix權限來控制誰可以讀取這些文件。但是,密碼等敏感數據絕不能以純文本格式存儲。有幾個選擇。他們需要一些努力,但這是大多數商業產品所遵循的方法。

存儲在文件系統上加密的密碼。您可以使用Java加密或XML encryption這樣做。

OR

存儲敏感信息,如與其他配置細節一起在數據庫中的密碼,並使用數據庫工具加密。您仍然需要在文件系統的某處存儲數據庫密碼。 Oracle提供了一個錢包來存儲密碼。如果您的數據庫供應商沒有提供,也有一些第三方錢包可以做到這一點。