Kerberos身份验证在ChunJun中的落地实践
发布时间:2025-05-20 19:41:17 发布人:远客网络
一、Kerberos身份验证在ChunJun中的落地实践
在古希腊神话中,Kerberos是一只三头犬,守护在地狱之门外,禁止人类进入。那么,在现实中,Kerberos又是什么呢?
Kerberos是一种计算机网络授权协议,用于在非安全网络中对个人通信进行安全的身份认证。它通过密钥加密技术为客户端/服务器应用程序提供身份验证,主要用在域环境下的身份验证。
在以往,只有服务器的运维管理人员在配置Active Directory等东西时才会接触到Kerberos。但随着大数据的流行,整个Hadoop生态圈在安全方面对Kerberos的依赖性越来越强。同时,由于Kerberos认证需要入侵式改造代码,使得越来越多的大数据开发人员开始接触Kerberos。
目前,用于身份密码验证的方式主要面临两个问题:一是人工记忆的密码混乱且易遗忘,一些简单的密码又容易被攻击;二是技术错觉,在计算机上输入密码时显示的是一串星号,大家误以为很安全,实际上计算机通过网络发送密码基本是发送“明文”密码,大部分密码都处于“裸奔”状态。Kerberos的出现很好地解决了这个问题,它减少了每个用户在使用整个网络时必须记住的密码数量——只需记住Kerberos密码,同时Kerberos结合了加密和消息完整性来确保敏感的身份验证数据不会在网络上透明地发送。通过提供安全的身份验证机制,Kerberos为最终用户和管理员提供了明显的好处。
principal是Kerberos世界的用户名,用于标识身份。每个用户都会有一个principal,如果principal失效或者不正确,那么这个用户将无法访问任何资源。principal主要由三部分构成:primary,instance(可选)和realm。
primary是主体,每个principal都会有的组成部分,代表用户名(username)或服务名(service name)。instance用于服务主体以及用来创建用于管理的特殊主体。realm是认证管理域名,用来创建认证的边界。每个域都会有一个与之对应的kdc服务用于提供域内的所有服务的认证服务。
接下来我们来介绍一下ChunJun任务提交中的Kerberos认证。我们可以参考ChunJun的readme文档中的yarn session部分:
首先,我们需要启动一个yarn session环境,进入Flink的bin目录下执行yarn-session脚本启动flink session并使用-t参数上传ChunJun的依赖包。
当我们执行yarn-session时,脚本内部会调用java命令运行FlinkYarnSessionCli这个类的main方法。在FlinkYarnSessionCli的main方法中,首先需要安装一个全过程的安全配置,然后获得一个安装后的上下文,并且在上下文中运行run方法。
在run方法中我们构建了一个YarnClusterDescripter对象,这个对象中封装了Flink所依赖的配置文件和jar包等。然后调用YarnClusterDescripter对象的DeploySessionClister方法将任务提交到yarn集群。至此完成了Flink session到Yarn的一个提交。
Flink需要将配置文件以及session所依赖的jar上传至HDFS,因此需要与HDFS进行通信。
Flink需要向Yarn申请资源,因此需要与Yarn进行通信。
如果Flink配置了基于Zookeeper的高可用,那么JobManager需要在Zookeeper注册leader节点,客户端还需要从Zookeeper上的leader节点获取webMonitorUrl,因此需要与Zookeeper通信。
接下来为大家介绍ChunJun Connector中的Kerberos认证。
以ChunJun HDFS Connector为例,插件在openInputFormat方法中会对任务的目标数据源HDFS是否开启了Kerberos进行判断,如果开启了Kerberos,则会根据配置的认证文件进行认证并获取认证后的ugi,ugi可以认为是之后插件与HDFS通信的用户凭证,里面保存着用户的认证信息。
对于每个算子实例来说,Kerberos认证只会进行一次(不包括认证过期后的刷新),因此Kerberos认证的代码应该在该方法中实现。
一般来说,Hadoop生态中的数据源组件如HDFS、HBase、Hive等都是用ugi(UserGroupInformation)进行Kerberos认证。ChunJun内部也提供了相关的工具类用于获取登录后的ugi:com.dtstack.ChunJun.util.FileSystemUtil#getUGI。
对于Zookeeper、Kafka等组件,开启Kerberos认证后,用户需要在插件端配置jaas.conf文件,再通过各个组件提供的参数配置项配置组件所选用的jaas.conf的entry,即可完成Kerberos配置。
如何排查Kerberos认证问题,可以通过以下方法:
$Flink_HOME/conf/Flink-conf.yaml
#jvm启动参数中增加“-Dsun.security.krb5.debug=true”
env.java.opts:用于配置启动所有Flink进程的JVM参数
env.java.opts.jobmanager:用来配置启动JobManager的JVM参数
env.java.opts.taskmanager:用来配置启动TaskManager的JVM参数
env.java.opts.historyserver:用来配置启动HistoryServer的JVM参数
env.java.opts.client:用来配置启动Flink Client的JVM参数
1.javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided(Mechanism level: Failed to find any Kerberos tgt)]
此消息表明一个操作尝试要求以Kerberos的user/host@realm身份认证的操作,但票据cache中没有用于user/host@realm的票据。
2.javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided(Mechanism level: Fail to create credential.(63)- No service creds)]
3.Found unsupported keytype(18)
确保正确安装了与JDK相匹配的无限强度策略文件的正确版本
4.GSSException: No valid credentials provided(Mechanism level: Server not found in Kerberos database(7)- UNKNOWN_SERVER)
hostname或要访问的URL与keytab中列出的主机之间发生主机名不匹配
二、【kerberos】Kerberos安装使用详解及遇到的问题
一、Kerberos协议:
Kerberos协议主要用于计算机网络的身份鉴别(Authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。
Kerberos协议主要用于计算机网络的身份鉴别(Authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。
节点信息:|?ip|主机名?|角色||--|--|--|| 10.12.24.209|dx-dev-test1029?| client|| 10.12.25.208|dx-dev-test1026?| client|| 10.12.25.209|dx-dev-test1030?| client|| 10.12.26.208|dx-dev-test1027?| client|| 10.12.27.208|dx-dev-test1028?| server|
注:server节点也是client节点,也是需要安装
/etc/krb5.conf:包含Kerberos的配置信息。例如,KDC的位置,Kerberos的admin的realms等。需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。注意修改:红色的标记
[logging]:表示server端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm= HADOOP.COM默认的realm,必须跟要配置的realm的名称一致。
udp_preference_limit= 1禁止使用udp可以防止一个Hadoop中的错误
oticket_lifetime表明凭证生效的时限,一般为24小时。
orenew_lifetime:表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
kdc:代表要kdc的位置。格式是机器:端口
admin_server:代表admin的位置。格式是机器:端口
default_domain:代表默认的域名
[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
udp_preference_limit= 1 kdc原生支持tcp/udp协议,客户端访问kdc服务时,默认先使用udp协议发起请求,如果数据包过大或者请求失败,然后再换用tcp协议请求。网络条件不好,如果使用udp容易出现丢包现象。
默认放在/var/kerberos/krb5kdc/kdc.conf。或者通过覆盖KRB5_KDC_PROFILE环境变量修改配置文件位置。文件内容如下:文件内容如下:
RONG360.COM:是设定的realms。名字随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。
max_renewable_life= 7d涉及到是否能进行ticket的renwe必须配置。
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用。
acl_file:标注了admin的用户权限。文件格式是
Kerberos_principal permissions [target_principal]?[restrictions]支持通配符等。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
编辑 Kerberos访问控制列表文件(kadm5.acl)文件应包含允许管理 KDC的所有主体名称。文件内容如下:
注:将上面修改的文件,进行全节点分发。
初始化并启动:完成上面三个配置文件后,就可以进行初始化并启动了。
其中,[-s]表示生成stash file,并在其中存储master server key(krb5kdc);还可以用[-r]来指定一个realm name——当krb5.conf中定义了多个realm时才是必要的。
在此过程中,我们会输入database的管理密码。这里设置的密码一定要记住,如果忘记了,就无法管理Kerberos server。
当Kerberos database创建好后,可以看到目录/var/kerberos/krb5kdc下生成了几个文件:
现在KDC已经在工作了。这两个daemons将会在后台运行,可以查看它们的日志文件(/var/log/krb5kdc.log和/var/log/kadmind.log)。
可以通过命令kinit来检查这两个daemons是否正常工作。
我们需要为Kerberos database添加administrative principals(即能够管理database的principals)——至少要添加1个principal来使得Kerberos的管理进程kadmind能够在网络上与程序kadmin进行通讯。
可以直接运行在master KDC上,而不需要首先通过Kerberos的认证,实际上它只需要对本地文件的读写权限。
将之前修改的/etc/krb5.conf拷贝到从节点。
登录到管理员账户:如果在本机上,可以通过yum install krb5-workstation krb5-libs krb5-auth-dialog0直接登录。其它机器的,先使用kinit进行验证。
在管理员的状态下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。
如果Valid starting的值与renew until的值相同,则表示该principal的ticket不是 renwable。
如果过了Expires,可以通过命令kinit–R来更新ticket但如果ticket无法更新
这是因为krbtgt/HADOOP.COM@ HADOOP.COM的[renewlife]被设置成了0,这一点可以通过[yum install krb5-workstation krb5-libs krb5-auth-dialog0=> getprinc krbtgt/ HADOOP.COM@ HADOOP.COM]看出来。
将krbtgt/HADOOP.COM@HADOOP.COM的[renewlife]修改为7days即可。
原因:因为系统采用的是Centos7.6,对于使用Centos5.6及以上西戎,默认采用 AES-256来加密;这就需要CDH集群所有的节点都安装 Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy File下载链接:
解决办法: 1.下载的文件是个zip包,解压 2.将解压后的 UnlimitedJCEPolicyJDK8文件下的两个jar包复制到$JAVA_HOME/jre/lib/security/
3.如果你的JAVA_HOME不是在/usr/java下,那么还需要进行一步操作 mkdir/usr/java
三、java se8的新特性有哪些
1、lambda expressions,一个新的语言特性,它可以将功能作为方法的参数or代码作为数据,它使你表达单一方法接口的实例更加简洁。
2、对已经有方法名的方法提供一个更加可读的lambda expressions为方法的引用。
3、默认方法使新的功能添加到库的接口,确保与旧版本的接口编写的代码的二进制兼容
4、重复注解提供不止一次应用同样的注解类型
5、类型注解提供应用注解的能力,任何一个类型的使用,不仅在声明上使用。用于一个可插拔式的系统,此功能提高你代码的类型检查。
1、新的java.util.stream包,提供了stream api支持流元素上的功能性操作。stream api集成到collections api中,使用批量操作,如串行or并行 map-reduce转换。
2、使用key collisions改进HashMap的性能
包含java SE平台预定义的子集和使不需要整个平台被部署和运行在小型设备中的应用
2、新的AccessController.doPrivileged,用代码断言它的privileges的子集,没有防止全栈遍历时检查其他权限
4、SSL/TLS SNI扩展在JSSE服务器中支持
5、支持AEAD算法:SunJCE提供增强的支持AES/ GCM/ nopadding密码的实现以及GCM算法参数,SunJSSE提供基于密码套件的AEAD模式增强
6、keystore增强,包含新的keystore类型java.security.DomainLoadStoreParameter,和新的命令行选项-importpassword
9、更好的支持High Entropy随机数生成
10、新的java.security.cert.PKIXRevocationChecker类为配置撤销X.509证书
12、新的rcache类型在Kerberos 5 Replay Caching
13、支持Kerberos 5协议转换和约束代理
14、默认禁用Kerberos 5弱的加密
15、未绑定SASL为GSS-API/Kerberos 5机制
17、在Mac OS X上JNI桥接到native JGSS
18、在sunjsse提供更强的实力,EDH键的支持
19、在JSSE支持服务器端密码套件个性设置
2、新SwingNode类容许开发者嵌套Swing内容到javaFX应用中
3、新UI Controls包含DatePicker和TreeTableView
4、javafx.print包为JavaFX提供公共printing API
5、三维图形特性,目前包含3D shapes、camera、lights、subscene、material、picking和antialiasing
6、WebView类提供的新功能和改进,支持更多关于HTML5的特性,Web Scokets,Web Workers和Web Fonts
10、新的ScheduledService类允许自动重启服务
4、jdeps命令行工具提供分析类文件
5、Java Management Extensions(JMX)提供远程诊断命令
6、jarsiger工具可选,从TSA请求签名时间抽
7.1、-parameters选项存储正式的参数名和反射API检索正式参数的名称
7.2、JLS 15.21相等操作的类型规则通过javac命令正确的执行
7.3、javac工具现在支持检查javadoc注释的内容,该特性通过-Xdoclint选项
7.4、javac工具现在提供生成native header的能力。移除javah工具,通过javac的-h选项使用
8.1、javadoc工具支持新DocTree API
8.2、javadoc工具支持新的javadoc访问API,允许在java应用直接调用javadoc工具,没有执行新的进程
8.3、javadoc工具现在支持检查javadoc注释的内容,该特性通过-Xdoclint选项
1、unicode增强,支持unicode6.2.0
2、采用unicode CLDR数据和java.locale.providers系统属性
4、安装一个自定义的资源包作为一个扩展的能力
1、对sandbox applet和 java web start app,URLPermission现在是用来允许连接到服务器从它们启动完成后。SocketPermission不再授权
2、在所有安全级别,在主要jar文件的jar文件的manifest中必须给定权限属性
一个新的软件包,提供更加全面的日期-时间模型
1、Pack200支持常量池条目和由JSR 292引入了新的字节码
2、JDK8支持由JSR-292, JSR-308 and JSR-335指定类文件的变化
1、基于Solaris在Solaris事件端口机制实现新的SelectorProvider。使用系统属性java.nio.channels.spi.Selector设置的值sun.nio.ch.EventPortSelectorProvder运行
2、减少<JDK_HOME>/jre/lib/charsets.jar文件中数量
3、提高java.lang.String(byte[],*)构造器和java.lang.String.getBytes()方法的性能
java.lang and java.util.Pack ages
1、添加java.net.URLPermission类
2、在java.net.HttpURLConnection中,如果安装安全管理,请求要求打开一个连接请求的权限
1、在java.util.concurrent包中新增类和接口
2、java.util.concurrent.ConcurrentHashMap类添加方法支持聚合操作,基于新的流设施和lambda expressions
3、java.util.concurrent.atomic包中添加类支持可扩展可更新的变量
4、 java.util.concurrent.ForkJoinPool类中添加方法支持通用池
5、 java.util.concurrent.locks.StampedLock类已经添加使用3种模式控制读/写访问的基于能力的锁
1、硬件特性增加了AES,UseAES和UseAESIntrinsics标签在打开基于硬件AES可用(Inter硬件),硬件必须是2010或更新Westmere硬件,如:打开硬件AES,使用下面标记
-XX:+UseAES-XX:+UseAESIntrinsics
-XX:-UseAES-XX:-UseAESIntrinsics
3、通过为方法调用引入字节码指令支持默认方法