在tomcat的配置文件中,用户名和密码是明文保存的:
从上图中可以看到,tomcat的配置文件中的password是明文保存的:
<user username="tomcat" password="tomcat" roles="tomcat"/>
为了解决这个问题,JBoss社区推出了tomcat-vault[1],通过Java的KeyStore机制来保存秘钥,并通过秘钥对Tomcat配置文件中明文的密码进行加密。本文简单介绍tomcat-vault的使用方法。
下载tomcat-vault
首先从tomcat-vault的网站下载最新版本:https://github.com/picketbox/tomcat-vault/releases
我在写这篇文章的时候,最新版本是1.0.8。下载完成后将压缩包解压:
cute:Downloads weli$ unzip tomcat-vault-1.0.8.Final.zip
Archive: tomcat-vault-1.0.8.Final.zip
5d8b74bb5e8e8fe636194bb6ab4633db9e09ba7a
creating: tomcat-vault-1.0.8.Final/
inflating: tomcat-vault-1.0.8.Final/INSTALL
inflating: tomcat-vault-1.0.8.Final/LICENSE
inflating: tomcat-vault-1.0.8.Final/README.md
...
然后使用maven将项目编译:
cute:tomcat-vault-1.0.8.Final weli$ mvn install
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Tomcat Vault extension 1.0.8.Final
[INFO] ------------------------------------------------------------------------
Downloading: http://maven.repository.redhat.com/earlyaccess/all/org/apache/tomcat/tomcat-util/8.0.15/tomcat-util-8.0.15.pom
Downloading: http://maven.repository.redhat.com/techpreview/all/org/apache/tomcat/tomcat-util/8.0.15/tomcat-util-8.0.15.pom
Downloading: https://repository.jboss.org/nexus/content/repositories/releases/org/apache/tomcat/tomcat-util/8.0.15/tomcat-util-8.0.15.pom
...
[INFO] Installing /Users/weli/Downloads/tomcat-vault-1.0.8.Final/target/vault-tomcat-1.0.8.Final-jar-with-dependencies.jar to /Users/weli/.m2/repository/org/apache/tomcat/vault-tomcat/1.0.8.Final/vault-tomcat-1.0.8.Final-jar-with-dependencies.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:16 min
[INFO] Finished at: 2015-10-24T11:33:30+08:00
[INFO] Final Memory: 22M/198M
[INFO] ------------------------------------------------------------------------
编译完成后,可以看到项目中多了一个modules目录:
这个目录是为了匹配bin目录中的vault.sh的:
我们现在可以运行一下vault.sh玩玩看:
如上图所示,如果编译成功,vault.sh就可以正确运行了。我们之后会用到vault.sh,先按CTRL-C退出程序,然后看一下target目录中的内容:
如上图所示,可以看到target目录中有vault-tomcat-1.0.8.Final-jar-with-dependencies.jar,我们之后要用到这个jar,把它copy到tomcat的lib目录中。在此之前,我们先下载tomcat。
下载tomcat
我们等下要把vault-tomcat-1.0.8.Final-jar-with-dependencies.jar放进tomcat的目录。接下来我们要下载tomcat[2],我下载的时候最新版本是tomcat 8.0.28。下载完成后将其解压:
试着启动一下tomcat看看:
没什么问题的话,关掉tomcat:
接下来是把编译好的,包含了所有依赖库的tomcat-vault拷贝到tomcat:
然后就是配置tomcat-vault的阶段了。
配置tomcat-vault
tomcat-vault使用java提供的keystore来管理秘钥,所以需要用keystore来生成一个keystore,并往里面加入一个加解密用的秘钥。为了方便管理,我把keystore保存在tomcat的conf目录当中,因此在conf目录中生成keystore:
从上图中可以看到,我们在tomcat的conf目录中用JDK提供的keytool命令生成了keystore,文件名为vault.keystore。在这个keystore当中,我们保存了一个磨人的秘钥,名为my_vault。可以用keytool命令来查看:
从上面的图中可以看到,在keystore中保存了一个名为my_vault的秘钥,它的类型是SecrectKeyEntry,是一个对称加密的秘钥。稍后我们会配置tomcat-vault使用这个秘钥来对tomcat配置文件中的用户密码进行加解密。
接下来我们要做的是使用tomcat-vault.sh生成配置文件,全过程如下:
上图所示的是一个tomcat-vault.sh的完整运行过程,这里面的配置说明如下:
Enter directory to store encrypted files:/Users/weli/projs/apache-tomcat-8.0.28/conf
这行配置保存tomcat的密码的加密文件的位置,我给配置到了tomcat的conf目录中。
Enter Keystore URL:/Users/weli/projs/apache-tomcat-8.0.28/conf/vault.keystore
这行是指定keystore的所在地,我们之前把vault.keystore生成在tomcat的conf目录中,因此指定相应路径即可。
Enter Keystore password: my_password123
Enter Keystore password again: my_password123
这两行是输入keystore的密码,我们之前用keytool生成时,使用的是my_password123。因为tomcat需要这个密码来访问keystore中的秘钥,所以需要知道这个密码。
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
这两行配置用于加密上面keystore的密码,因为我们不能在tomcat的配置文件中使用明文保存keystore的密码,否则就毫无意义了。
Enter Keystore Alias:my_vault
这行配置是告诉tomcat在keystore中可以使用的秘钥名称。通过以上内容,tomcat-vault.sh最后帮我们生成了给tomcat使用的配置文件内容:
KEYSTORE_URL=/Users/weli/projs/apache-tomcat-8.0.28/conf/vault.keystore
KEYSTORE_PASSWORD=MASK-3CuP21KMHn7G6iH/A3YpM/
KEYSTORE_ALIAS=my_vault
SALT=1234abcd
ITERATION_COUNT=120
ENC_FILE_DIR=/Users/weli/projs/apache-tomcat-8.0.28/conf/
把上面的配置保存在tomcat的conf目录中,把文件名命名为vault.properties:
接下来我们还要在conf目录中的catalina.properties这个配置文件中添加一行:
org.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.vault.util.PropertySourceVault
这样,tomcat这边的配置工作就算完成了。我们接下来用tomcat-vault.sh来生成一个密码:
从上图中使用的命令里面,我们可以看到我们要加密的密码是P@SSW0#D,把它命名为manager_password:
--attribute manager_password --sec-attr P@SSW0#D
从输出的结果中我们可以看到vault使用keystore中的秘钥对密码进行了加密病保存在了配置的目录当中:
KEYSTORE_URL=/Users/weli/projs/apache-tomcat-8.0.28/conf/vault.keystore
KEYSTORE_PASSWORD=MASK-3CuP21KMHn7G6iH/A3YpM/
KEYSTORE_ALIAS=my_vault
SALT=1234abcd
ITERATION_COUNT=120
ENC_FILE_DIR=/Users/weli/projs/apache-tomcat-8.0.28/conf/
我们查看tomcat的目录可以看到加密文件:
接下来是在tomcat的配置文件中使用manager_password这个密码:
可以从上图中看到,在tomcat-users.xml中,我们没有使用明文的密码P@SSW0#D,而是引用加密后的:
${VAULT::my_block::manager_password::}
为了测试配置是否工作,我们启动tomcat:
接下来访问tomcat的管理端:
根据tomcat-users.xml中的配置,我们输入用户名为manager,密码为P@SSW0#D
如果tomcat-vault正常工作,那么会接受这个密码,用keystore中的秘钥解密tomcat-users.xml中的${VAULT::my_block::manager_password::},并且比对成功。从结果上来看,就是成功登录了管理端:
小结
本文简单介绍了tomcat-vault的使用方法。tomcat-vault通过JCE标准的keytool来生成keystore,并使用keystore来保存对称加解密秘钥,再通过秘钥来加解密tomcat配置中不想用明文保存的数据。
[1] https://github.com/picketbox/tomcat-vault
[2] https://tomcat.apache.org/download-80.cgi
已有
0 人发表留言,猛击->>
这里<<-参与讨论
ITeye推荐