EAP 6設定檔中密碼加密做法
主題: |
EAP 6設定檔中密碼加密做法 |
文章簡介: |
介紹EAP 6中的Password Vault功能,利用加密機制將密碼隱藏起來,並以masked string取代原密碼內容,這樣設定檔中就不會有明碼的密碼了。 |
作者: |
夏宏彰 |
版本/產出日期: |
V1.0/2016.8.2 |
1. 前言
• 在應用程式的配置檔中,我們常會看到許多的密碼設定在上面,這等於是直接將密碼提供給可以看到配置檔的所有人而平白增加安全上的風險。
• 本文件用來提供Java開發人員如何在EAP 6上安全的設定密碼欄位,將密碼洩漏的風險降到最低。
• 本文件適用於JBoss EAP 6.x設定。
2. 目的
• 了解EAP 6 Password Vault的機制與設定方法。
• 加強密碼的管理與安全。
3. 開始前準備
本架構建立於以下版本的環境:
• JDK 1.7以上
• EAP 6.4
4. EAP 6 Password Vault的機制
EAP6中有一個Password Vault的功能,解說如下圖所示:
我們首先用Java Keytool建立一加密用的Secret Key,存放在Java Keystore中,此即是我們用來加密密碼用的的密鑰。
之後用Vault script將我們的密碼(一組字串)用Keytool產生的密鑰加密存放在Vault Storage中; 若我們有多組密碼,則分別用Vault script依序將每一組密碼存入Vault Storage中。(當然,除了密碼外,任何你覺得敏感的字串皆可以用此方法存入Vault Storage中。) 存入後,Vault script會顯示一組對應該密碼的字串,功能如同主鍵一樣,例如" VAULT::sslvb::pwd::1",可以對到原密碼。
我們將此Masked字串貼到standalone.xml (domain.xml)中,取代原來該密碼的位置即可。之後EAP 6只要取到這字串,就會到Vault Storage將對應的密碼取出使用,而我們的設定檔就只會有Masked字串,不會再有明碼了。
5. Password Vault的做法
5.1、 建立vault目錄: [EAP_HOME]/vault
例如C:\EAP-6.4.0>mdkir vault
5.2、 產生密鑰
用Java Keytool建立此密鑰,例如
>keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault123 -keypass vault123 -validity 4000 -keystore C:\EAP-6.4.0\vault\vault.keystore
• Keystore: "vault.keystore" //Java Keystore名稱
• Storetype: "jceks" //建議使用的JCE Key Store; 用JKS亦可
• Keyalg: "AES" //建議使用的加密演算法
• Alias: "vault" //一個好記的名稱給這把Secret Key用
• Validity: 4000 //Secret Key的有效天數,時間長一點比較好。到時Secret所Key將失效,所有加密的密碼將會無法解密。
列出Java Keystore中的密鑰
>keytool -list -keystore vault.keystore -storepass vault123 -storetype JCEKS -v
範例使用的JDK版本
5.3、 Password Vault初始化
初始化建立Vault Storage,可以將參數直接加在vault script後面執行:
>vault --keystore C:\EAP-6.4.0\vault\vault.keystore --keystore-password vault123 --alias vault --enc-dir C:\EAP-6.4.0\vault\ --iteration 120 --salt 1234abcd
或是依指示依序輸入參數: (如此則沒有password顯示問題)
• directory to store encrypted files: 存放Vault Storage檔案的位置
• Keystore URL: 上一步Keystore檔案的位置
• Keystore password: 上一步Keystore設定的密碼
• 8 character salt: 加密用八個字元長的salt
• iteration count: 疊代次數
• Keystore Alias: 上一步密鑰的名稱
完成後按下3 (Exit)。此時我們會看到一組Vault Configuration,可以直接將此配置剪貼到standalone.xml (或domain.xml)中如上顯示的位置中; 或是往下看步驟4,用CLI建立<vault>節點。
5.4、 在JBoss EAP 6中配置Password Vault
用CLI的執行方式如下:
(注意: windows的目錄格式)
完成後可以在standalone.xml (或domain.xml)看到如下配置:
5.5、 將Password存進 Vault - 取得Masked字串
再次使用vault script,將我們的password加密後存入Vault Storage中。使用方式如下
EAP_HOME/bin/vault.bat --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
例如:
>vault --keystore c:\EAP-6.4.0\vault\vault.keystore --keystore-password vault123 --alias vault --vault-block sslvb --attribute pwd --sec-attr xxxxxxxx --enc-dir c:\EAP-6.4.0\vault\ --iteration 120 --salt 1234abcd
同樣,我們亦可照指示依序輸入參數:
//注意: 前面初始化的設定內容需要重複輸入,最後選擇0 (Store a secured attribute)進行以下動作。
• secured attribute value: 輸入我們的要加密的密碼
• Vault Block: 一個名稱空間,方便分類使用
• Attribute Name: 此密碼的名稱
完成! 取得的Masked字串,將" VAULT::sslvb::pwd::1"記錄下來。
接著我們可直接選擇1 (Check whether a secured attribute exists),或是之後用--check-sec-attr來檢查該密碼是否已存入Vault Storage。
>vault --keystore c:\EAP-6.4.0\vault\vault.keystore --keystore-password vault123 --alias vault --check-sec-attr --vault-block sslvb --attribute pwd --enc-dir c:\EAP-6.4.0\vault\ --iteration 120 --salt 1234abcd
存在時:
不存在時:
5.6、 在standalone.xml (或是domain.xml)中貼上VAULT字串
字串的格式如下,用${…}表示是standalone.xml中的變數值:
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
將上例的VAULT字串貼到standalone.xml (或domain.xml)中,如下所示:
再啟動JBoss即可生效,我們在Server log中會看到Password Vault生效的內容:
若VAULT字串不存在時,則Vault Storage返回NULL,出現以下錯誤:
若存入Vault Storage的Password不對時 (可能用錯名稱,或輸入時就打錯了!),則出現以下錯誤:
6. 參考來源
• SECURE PASSWORDS
• Java Keytool
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#keytool_option_genseckey