加密密碼
自 ActiveMQ Classic 5.4.1 起,您可以加密您的密碼並安全地將其儲存在設定檔中。要加密密碼,您可以使用新加入的 encrypt
命令,如下所示:
$ bin/activemq encrypt --password activemq --input mypassword
...
Encrypted text: eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp
您要加密的密碼透過 input
參數傳遞,而 password
參數則是加密器使用的密鑰。同樣地,您可以像這樣測試您的密碼:
$ bin/activemq decrypt --password activemq --input eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp
...
Decrypted text: mypassword
注意:建議您僅使用字母數字字符作為密碼。不支援特殊字元,例如 $/^&
。
自 5.16.0 版本起,已新增支援在 “encrypt” 和 “decrypt” 命令中指定演算法參數。預設情況下,使用的演算法是 “PBEWithMD5AndDES”。要使用更現代的加密演算法,您可以指定:
$ bin/activemq encrypt --password activemq --input mypassword --algorithm PBEWITHHMACSHA256ANDAES_256
...
Encrypted text: h/cWj/ZZelMt3Y7NSzUG2vHYSnfWK561qjNg9Ywyr9yT72ru7pR4IEUnHLIdLSOb
下一步是將密碼加入適當的設定檔,預設為 $ACTIVEMQ_HOME/conf/credentials-enc.properties
。
activemq.username=system
activemq.password=ENC(mYRkg+4Q4hua1kvpCCI2hg==)
guest.password=ENC(Cf3Jf3tM+UrSOoaKU50od5CuBa8rxjoL)
...
jdbc.password=ENC(eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp)
請注意,我們使用 ENC()
包裹我們的加密密碼。您可以在屬性檔案中混合使用純文字和加密密碼,因此加密的密碼必須以這種方式包裹。
最後,您需要指示您的屬性載入器在將屬性載入記憶體時解密變數。我們將使用特殊的載入器(請參閱 \$ACTIVEMQ_HOME/conf/activemq-security.xml
)來實現這一點,而不是標準的屬性載入器。
<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
<property name="passwordEnvName" value="ACTIVEMQ\_ENCRYPTION\_PASSWORD" />
</bean>
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="environmentVariablesConfiguration" />
</bean>
<bean id="propertyConfigurer" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="configurationEncryptor" />
<property name="location" value="file:${activemq.base}/conf/credentials-enc.properties"/>
</bean>
透過此設定,ActiveMQ Classic 將嘗試從 ACTIVEMQ_ENCRYPTION_PASSWORD
環境變數載入您的加密器密碼,然後使用它來解密 credential-enc.properties
檔案中的密碼。
另一種方法是使用簡單的變體,並將加密器密碼儲存在 XML 檔案中,如下所示:
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="algorithm" value="PBEWithMD5AndDES"/>
<property name="password" value="activemq"/>
</bean>
但是這樣您將失去加密器密鑰的機密性。您也可以查閱 http://www.jasypt.org/advancedCommunity/FAQ/configuration.md,以取得更多關於如何設定 Jasypt 的想法。
最後,我們可以像平常一樣使用屬性:
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="system" password="${activemq.password}"
groups="users,admins"/>
<authenticationUser username="user" password="${guest.password}"
groups="users"/>
<authenticationUser username="guest" password="${guest.password}" groups="guests"/>
</users>
</simpleAuthenticationPlugin>
或
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
如果您想使用此設定執行代理程式,您需要執行以下操作:
- 設定環境變數
$ export ACTIVEMQ\_ENCRYPTION\_PASSWORD=activemq
- 啟動代理程式
$ bin/activemq start xbean:conf/activemq-security.xml
- 取消設定環境變數
$ unset ACTIVEMQ\_ENCRYPTION\_PASSWORD
這樣,您的加密器密鑰永遠不會儲存在您的系統上,並且您的加密密碼會安全地儲存在設定檔中。