文档编写目的
默认情况下, CentOS和RedHat5.5或更高的版本中,对Kerberos 票证使用AES-256加密,因此必须在集群所有节点的JDK中安装Java Cryptography Extension(JCE)无限制强度加密策略文件。在安装JCE文件的Kerberos集群中,服务启动时会报“java.security.InvalidKeyException: Illegal key size”异常。本篇文章Fayson主要介绍使用不同方式安装JCE加密策略文件以及如何禁用Kerberos的AES-256加密。
注意:使用JDK 1.8.0_161或更高版本时,不需要再安装JCE Policy File。JDK 1.8.0_161默认启用无限强度加密。
- 测试环境:
1.Redhat7.2
2.采用root用户操作
3.CM/CDH6.2.0
手动安装JCE Policy File
1.确认当前CDH集群使用的JDK路径
可以使用“ps -ef”命令查看启动的java服务使用的JDK版本的路径
[root@cdh01 ~]# ps -ef |grep java
![7dfbb038cd750ee96622487a3921bc6c.png](https://i-blog.csdnimg.cn/blog_migrate/c243408a3c046322483842e5fa587e01.jpeg)
从截图中可以看到当前使用的JDK路径为/usr/java/jdk1.8.0_181-cloudera
也可以进入CM主页→主机→主机配置,通过搜索java查看集群配置的JDK目录,如果未配置则说明集群使用CM自带的JDK版本。
![9ea3d616cb0f1472ca0d62ef19001071.png](https://i-blog.csdnimg.cn/blog_migrate/35237d90daa0027b46a45433d5f565a6.jpeg)
![4c7ba76e75b959934131c387df00d174.png](https://i-blog.csdnimg.cn/blog_migrate/8836b62a29f72edabb1b205b31bf4c96.jpeg)
2.在Oracle官网下载JCE安装包,地址如下
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
![e250fbfc643d0afa3a114d0027a7f06a.png](https://i-blog.csdnimg.cn/blog_migrate/fb7dfd2942afb7f30edb20a81ad04133.jpeg)
3.将下载的jce_policy-8.zip文件上传集群的任意节点并解压
[root@cdh01 ~]# unzip jce_policy-8.zip
![7a5059c98cd10a8ae1e22d3f7a253dea.png](https://i-blog.csdnimg.cn/blog_migrate/5a0ad68f28f6da8c7c23c0729f4cc664.jpeg)
4.把UnlimitedJCEPolicyJDK8目录下的所有jar包拷贝至集群所有节点的${JAVA_HOME}/jre/lib/security目录下
[root@cdh01 UnlimitedJCEPolicyJDK8]# cp *.jar /usr/java/jdk1.8.0_181-cloudera/jre/lib/security
![9832c0eff7b646a67cde38ffaa5a4792.png](https://i-blog.csdnimg.cn/blog_migrate/dcddcb4a66258736a58ac23f5642162f.jpeg)
[root@cdh01 UnlimitedJCEPolicyJDK8]# scp *.jar cdh02.hadoop.com:/usr/java/jdk1.8.0_181-cloudera/jre/lib/security[root@cdh01 UnlimitedJCEPolicyJDK8]# scp *.jar cdh03.hadoop.com:/usr/java/jdk1.8.0_181-cloudera/jre/lib/security
![30e90c88f55d5e540db11e27d173184c.png](https://i-blog.csdnimg.cn/blog_migrate/463e83d7d7e6ef04eccfb60874928578.jpeg)
至此完成集群所有节点JDK的JCE加密策略文件。
使用CM安装JCE Policy File
1.登陆CM,在浏览器输入http://192.168.0.204:7180/cmf/upgrade-wizard/wizard进入升级界面
![d59303e42974aa82fc602c75f6d996f5.png](https://i-blog.csdnimg.cn/blog_migrate/07f7785b750c8fe2be59283c27efaec6.jpeg)
输入与当前集群CM版本匹配的私有源地址
![5ce2f5b1d677b528a3abef32f110de43.png](https://i-blog.csdnimg.cn/blog_migrate/1d648acdb72ad59173e0c5ef229bc22f.jpeg)
2.完成CM私有源配置后,点击“继续”,勾选安装JDK和Java无限制强度界面策略文件
![be31684d382d598e67af36f81eed0cd9.png](https://i-blog.csdnimg.cn/blog_migrate/3471e826be0592ffa58a7bd79e18280e.jpeg)
3.点击“继续”,一直继续直到提示完成升级
![026dcbde5444103a4f96fc6268abf016.png](https://i-blog.csdnimg.cn/blog_migrate/75620608168f11415cf256e806597386.jpeg)
如上图所示,通过Cloudera Manager引导界面的方式安装JCE加密策略文件就完成了。
4.由于通过CM安装JCE是需要勾选了安装JDK才能复选JCE安装。这里我们把当前安装的Oracle JDK迁移到Open JDK,再通过CM安装JCE来验证JCE是安装到了我自定义的Open JDK中还是安装到了Oracle JDK中。
现在把Oracle JDK迁移到Open JDK,过程省略。迁移后如下图
![672c611d8d4ebafc714e6489ff2e28dd.png](https://i-blog.csdnimg.cn/blog_migrate/37782238a71ddabcfecdaa30a7437f76.jpeg)
将集群所有节点的OpenJDK安装目录jre/lib/security下,可以看到JCE安装包都存在,手动把所有节点上的JCE安装包删除。
![1d83926fa053f9ecd9551f9c7193b6d8.png](https://i-blog.csdnimg.cn/blog_migrate/a5364b4697771d0a8ea2ba568d8431d3.jpeg)
所有节点的Open JDK的security目录下的JCE安装包删除后如下图
![9a203013b7df16be41603a96ab7d071d.png](https://i-blog.csdnimg.cn/blog_migrate/3dd0cf202f7a3046414282becdaf3e61.jpeg)
同时也删除/usr/java/jdk1.8.0_181-cloudera/jre/lib/security目录下的JCE策略文件,是CM安装Oracle JDK的默认目录,删除后如下图
![89798a095d237b707ba893c6c9a6c7f4.png](https://i-blog.csdnimg.cn/blog_migrate/39d88fce5374a249c5e3380b67c26782.jpeg)
再次通过CM的引导界面安装JDK的JCE策略文件,安装完成后,发现Oracle JDK和Open JDK的${JAVA_HOME}/jre/lib/security目录下都没有JCE的策略文件,因为这两个版本的JDK都是默认启用JCE加密的。
这里我继续创建了一个Kerberos账号ace1,可以看到是用的AES-256加密,且集群的服务是可以正常运行。
![10bff407beda72d138185035840b7777.png](https://i-blog.csdnimg.cn/blog_migrate/097f984f219ee02dd1d15ab17bb56a51.jpeg)
5.上面的验证并没有将JCE策略文件安装到我们预想的目录下,接着在CDH5.16.2环境下再次测试
删除集群所有节点JDK里面的JCE策略文件,删除后重启CMS出现异常“Cannot locate policy or framework files!”
![e45cdb941ce98fe3811a90aa9f440ce1.png](https://i-blog.csdnimg.cn/blog_migrate/0654c8c9702bff199f0be1b6ecc21e48.jpeg)
![736c3d0af3b699d18fd84ff681e315ee.png](https://i-blog.csdnimg.cn/blog_migrate/0b730d918fb9465c2248ad25cf2ddfc0.jpeg)
当前CDH5集群只有这一个JDK安装包
![84ad9f0d1421225cd8b481dcb13f8100.png](https://i-blog.csdnimg.cn/blog_migrate/9c1db6112cecfca884f10c6ca8dec04d.jpeg)
再通过CM引导界面为JDK安装JCE
![11fcde27f02d3ab84ae797cd0c38bfbc.png](https://i-blog.csdnimg.cn/blog_migrate/56eddc40907977bb6e716ac6b70f6c0c.jpeg)
![23ea1cfbbdf346cd72b4ccd827574fcf.png](https://i-blog.csdnimg.cn/blog_migrate/3947adb4840185801a627d045c9dae63.jpeg)
安装完成后,可以看到集群所有节点都新安装了Oracle JDK 1.7
![cf118c4eddb674a7179e5dec8401e6fd.png](https://i-blog.csdnimg.cn/blog_migrate/029f23ffd810c7e8d98e37df722bcb0a.jpeg)
查看/usr/java/jdk1.8.0_144-cloudera/jre/lib/security目录,依然是跟安装前一样,并未将JCE策略文件安装到指定的JDK8的相应目录下。
![d4ad8ae85b76d0b4003e3f7aa5c1827c.png](https://i-blog.csdnimg.cn/blog_migrate/d8f378df06022c52d8d4f4b337cc5f93.jpeg)
根据上面的测试,可以确认通过CM的方式来安装JCE的话,JCE不会安装到当前集群使用的JDK目录下,而是安装在同时勾选的JDK安装目录下(即CM默认自带的JDK目录下)。
禁用Kerberos的AES-256加密
1.使用klist -e查看当前Kerberos账号的加密方式,如下图,可以看到默认使用的是AES-256的加密方式
![2ebe62044896b289bab536c9f584c83b.png](https://i-blog.csdnimg.cn/blog_migrate/841c0137e11d76b1706df7622699edb3.jpeg)
2.接下来修改/var/kerberos/krb5kdc/kdc.conf文件将AES-256加密类型删除
[root@cdh01 krb5kdc]# vim /var/kerberos/krb5kdc/kdc.conf
![442a4eeda40a10749a4e0b1da381e198.png](https://i-blog.csdnimg.cn/blog_migrate/35001ec5d4989b99ece7631c474dfd97.jpeg)
3.修改完成kdc.conf文件配置后,需要重启kadmin和krb5kdc服务使其生效
[root@cdh01 krb5kdc]# systemctl restart krb5kdc[root@cdh01 krb5kdc]# systemctl restart kadmin
4.重启完krb5kdc和kadmin服务后,在命令行验证Kerberos账号
kadmin.local: addprinc enpop1[root@cdh01 krb5kdc]# kinit enpop1Password for enpop1@HADOOP.COM: [root@cdh01 krb5kdc]# klist -eTicket cache: FILE:/tmp/krb5cc_0Default principal: enpop1@HADOOP.COMValid starting Expires Service principal07/03/2019 17:49:56 07/04/2019 17:49:56 krbtgt/HADOOP.COM@HADOOP.COM renew until 07/10/2019 17:49:56, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
![a9d8ad5871d3bfb6a92a376ecddac12f.png](https://i-blog.csdnimg.cn/blog_migrate/c01ac27225d3dc8189f9bc94f5b6b067.jpeg)
注意:通过测试发现,修改配置并未生效显示Principal仍然支持AES-256。因为这个配置是数据库生成的时候配置的,导致修改了kdc配置文件后不能及时生效,需要重建KDC数据库。
5.删除KDC数据库的数据文件,通过如下命令重新生成数据库文件,并重启kadmin和krb5kdc服务,再次添加一个Principal账号,可以看到加密方式中已不支持AES-256
[root@hadoop1 ~]# rm -rf /var/Kerberos/krb5kdc/principal*[root@hadoop1 ~]# kdb5_util create -r MACRO.COM -s[root@hadoop1 ~]# systemctl restart kadmin[root@hadoop1 ~]# systemctl restart krb5kdckadmin.local: addprinc admin/admin@MACRO.COM[root@hadoop1 krb5kdc]# kinit admin/admin[root@hadoop1 krb5kdc]# klist -e
![188f3860f401bd3089e345b385eb26c0.png](https://i-blog.csdnimg.cn/blog_migrate/ce4c1e578d1570dd1cc572db8cb6f5fe.jpeg)
总结
1.JDK 1.8.0_161之前版本的Java默认的AES最大支持128bit的秘钥,如果使用256bit的秘钥则需要为Java安装JCE Policy File。
2.JDK 1.8.0_161或更高版本的JDK是不需要再安装JCE Policy File,默认已默认启用无限强度加密。
3.可以通过手动或CM引导的方式为CDH集群的JDK安装JCE策略文件。
4.可以使用ps -ef命令查看当前集群使用的JDK路径,也可以通过CM的配置界面查看JDK的HOME目录(CM默认的JDK配置目录为/usr/java/jdk1.xxx-cloudera),C5默认使用JDK7,C6默认使用的JDK8。
5.通过前面的测试发现通过CM的引导界面来为CDH集群的JDK安装JCE策略文件,只能为升级向导中同时安装的JDK(即CM默认自带的JDK)添加JCE策略文件,如果集群使用自定义的JDK版本则需要通过手动的方式安装JCE。
6.要禁用Kerberos的AES-256加密类型时,只是修改kdc.conf配置文件,重启服务后是不会生效的,必须重建KDC数据库。