##前言 KMS
是Hadoop下的一个密钥管理服务,它实际是与Hadoop结合,提供HDFS文件做AES加密用的。所以它是用来存储AES秘钥的,AES提供三种位数的秘钥,分别是128
, 192
, 256
,所以KMS只能存储这三种位数的byte
数组。
如果你是为了给HDFS文件加密,那么直接通过配置就可以完成,它与Hadoop能够完美契合,由Hadoop调用自动产生秘钥并管理秘钥。但是HDFS文件加密粒度太粗,我们的数据并非要全部加密,而当前针对Hive表列的加密并没有集成方案,官方提供了AES的encrypt函数,但是秘钥key还需明文传入。这样对集群来说其实很不安全。
如果我们自己实现加密UDF,然后借用KMS来做密钥管理,在KMS上加上Kerberos认证,秘钥的处理就可以都封装在UDF内部,不对外暴露,而且可以实现身份认证。
KMS本身提供了一系列API来创建,获取和维护密钥,官网介绍中主要以RESTFUL的形式提供,但如果集群上了Kerberos,请求的认证在RESTFULL里就不好做(具体没操作过)。在Hadoop源码里,提供了KMSClientProvider
用于Hadoop的加密,所以我们可以利用这个接口来获取KMS服务,实现创建管理密钥。
##配置
-
KMS是一个Web服务,只需要在一台机器上配置即可,其主要配置文件是
kms-site.xml
,主要配置项是hadoop.kms.key.provider.uri
,配置值是KMS的key以文件形式存在哪个keystore
文件里,配置格式是jceks://file@/path/to/kms.keystore
,如jceks://file@/home/kms/kms.keystore
,当然,服务最好以kms
用户来起。这个文件会在KMS起来后生成。之后在kms-env.sh
里配置export KMS_LOG=/path/to/log
和export KMS_TEMP=/path/to/log
。kms.keystore
文件本身和里面的存储密钥都有密码保护,默认配置项为hadoop.security.keystore.java-keystore-provider.password-file
,密码存储在文件里,不可换行,由于KMS是通过ClassLoader.getResource
来加载该文件,所以该配置必须配在KMS Web服务启动对应的conf目录下。此外也可通过环境变量设置,为HADOOP_KEYSTORE_PASSWORD
,可将其配置在kms-env.sh
里,环境变量的设置优先级最高! -
然后在hadoop的
core-site.xml
里配上hadoop.security.key.provider.path
,未启用https,其值为kms://http@${hostname}:16000/kms
,如果启用了https,则应为kms://https@${hostname}:16000/kms
。 -
以上两步配完后,重启HDFS,然后以
kms
身份,启动KMS(/path/to/hadoop/sbin/kms.sh start
),启动完后,就可以用/path/to/hadoop/bin/hadoop key list -metadata
来查看KMS里存储的Key了,当然,还没有创建key,所以没有key信息,但是可以验证KMS服务是否配置正确。其次,这个命令虽然可以创建key,但是只能创建随机key,不能创建指定key。 -
配置SSL(https),确保传输过程加密。SSL需要用到证书,可以去CA官网下载一个证书作为网站根证书和信任证书,也可以用Java生成一个自签名证书并添加它为受信任证书。详细介绍可以参考CDH官网,我们这里采用自签名证书。
- 以
kms
用户生成tomcat根证书(此根证书只能为当前机器上的Web服务所用,其他机器上的web服务如果需要SSL,也需要像这个一样单独生成该服务器的根证书。其次,该证书只是做SSL通信安全加密所用,并不具备可信任性,因为不是权威机构颁发),执行/usr/java/default/bin/keytool -genkey -alias tomcat -keyalg RSA