一、概述 Kerberos是为TCPIP网络系统设计的可信的第三方认证协议,用于身份认证。网络上的Keberos服务基于DES对称加密算法,但也可以用其他算法替代。因此,Keberos是一个在许多系统中获得广泛应用的认证协议。Keberos最初是美国麻省理工学院(MIT)为Athena项目开发的。 官网:https:www。kerberos。org 官方文档:http:web。mit。edukerberoskrb5currentdoc1)应用场景 Kerberos采用客户端服务器(CS)结构与DES加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证,是一种应用对称密钥体制进行密钥管理的系统。可以用于防止窃听、防止replay攻击、保护数据完整性等场合。2)功能特性安全性 Kerberos提供双向认证,不仅Server可以对Client进行认证,Client也能对Server进行认证。Server对Client认证成功之后,通过返回Client发送的时间戳,向Client提供验证自己身份的手段。可靠性 认证服务是其他服务的基础,服务认证过程有助于提升整个系统的可用性和高可靠性。可扩展性 KDC(秘钥分配中心)是秘钥体系的重要部分,旨在减少密钥体制所固有的交换密钥时所面临的风险。用户可以根据需要扩展多个KDC。开放性 Kerberos已经成为计算机领域一个被广泛接受的标准,所以使用Kerberos可以轻松实现不同平台之间的互操作。二、Kerberos中的核心概念 Kerberos中有以下一些概念需要了解:KDC:密钥分发巾心,负责管理发放票据,记录授权。Realm:Kerberos管理领域的标识。principal:Kerberos下的用户可以称为Principal,当每添加一个用户或服务的时候都需要向kdc添加一条principal,principal的形式为:主名称实例名领域名。主名称:主名称可以是用户名或服务名,表示是用于提供各种网络服务(如hdfs、yam,、hive)的主体。实例名:实例名简单理解为主机名。keytab文件:存储了用户的加密密码。常用这种方式认证。1)用户principal 用户principal的形式: Name〔Instance〕REALM 其中Instance是可选的,通常用于更好地限定用户的类型。比如,一个管理员用户通常会有admininstance,即NameadminREALM。 下面是指代用户的一些principal的例子:pippoEXAMPLE。COMadminadminEXAMPLE。COMcnicetouppadminEXAMPLE。COM2)服务principal 用户principal的形式: ServiceHostnameREALM第一部分是service的名字,比如imap,AFS,ftp。通常host这个名字被用于指明对一台机器的通用的访问(telnent,rsh,ssh)。第二个component是提供这个服务的机器的全限定域名(FQDN)。这个component跟DNS对应用服务器的IP地址进行逆向解析后得到的主机名。 下面是指代服务principal的例子:imaphadoopnode1EXAMPLE。COMhosthadoopnode1EXAMPLE。COMafshadoopnode1EXAMPLE。COM3)Ticket Ticket分两种:TicketGrantingTicket,TGT:这是KDC中的AuthenticationServer(简称AS)产生的,TGT是向TicketGrantingServer(TGS)用于表明自己真实身份的东西。ServiceTicket:这是KDC中的TicketGrantingServer(简称TGS)产生的,ServiceTicket是用于向应用服务器表明自己身份的东西三、Kerberos架构与工作原理ASREQ是在初始化一个用户(kinit)的时候发出的用户认证请求,这个请求是发给KDC中的AuthenticationServer(AS);ASREP是AS回复给client的信息,其中包括TGT(用TGSsecretkey加密过的)andthesessionkey(用发请求的用户的secretkey加密过的);TGSREQ是client为了一个serviceticket向TicketGrantingServer(TGS)的信息。其中包括上一条信息中获得的TGT(用TGSsecretkey加密过的),一个客户端产生的一个authenticator(用sessionkey加密过的)。TGSREP是TGS回复给TGSREQ的信息。其中包括serviceticket(用appservice的secretkey加密过),和一个TGS产生的servicesessinonkey(之前AS产生的一条sessionkey给加密过的)APREQ是一条客户端发给appserver的访问服务的请求,其中包括serviceticket和一个authenticator(使用TGS产生的servicesessionkey加密过的)APREP是appserver回复给client的一条信息,证明这个appserver确实是客户端希望访问的server。不过这条信息也不一定总是要回复的。比如当客户端和appserver需要相互认证的时候,客户端向appserver发出请求,这个时候就不需要回复信息。 Kerberos认证时序图: 四、Kerberos安装 官方文档:https:kerberos。orgdistindex。html 【温馨提示】这里主机名和域名都在配置etchosts192。168。0。113hadoopnode1server。kerberos。com192。168。0。114hadoopnode2client1。kerberos。com192。168。0。115hadoopnode3client2。kerberos。com 主机名 IP 角色 hadoopnode1 server。kerberos。com 192。168。0。113 KDC(KerberosServer、kadmin) hadoopnode2 client1。kerberos。com 192。168。0。114 KerberosClient hadoopnode3 client1。kerberos。com 192。168。0。115 KerberosClient1)KerberosServer安装 在hadoopnode1节点上执行如下命令安装KerberosServer1、yum安装krb5server:Kerberos服务端程序,KDC所在节点。krb5workstation:包含一些基本Kerberos程序,比如(kinit,klist,kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。krb5libs:包含Kerberos程序的各种支持类库等。yuminstallkrb5serverkrb5workstationkrb5libs2、配置krb5。conf 【温馨提示】etckrb5。conf:客户端根据该文件中的信息取访问KDCTooptoutofthesystemcryptopoliciesconfigurationofkrb5,removethesymlinkatetckrb5。conf。dcryptopolicieswhichwillnotberecreated。includediretckrb5。conf。dKerberos守护进程的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a记录方式。换句话说,表示server端的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的打印位置。〔logging〕默认的krb5libs。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径defaultFILE:varlogkrb5libs。log默认的krb5kdc。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径kdcFILE:varlogkrb5kdc。log默认的kadmind。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径adminserverFILE:varlogkadmind。logKerberos使用的默认值,当进行身份验证而未指定Kerberos域时,则使用defaultrealm参数指定的Kerberos域。即每种连接的默认配置,需要注意以下几个关键的配置:〔libdefaults〕DNS查找域名,我们可以理解为DNS的正向解析,该功能我没有去验证过,默认禁用。(我猜测该功能和domainrealm配置有关)dnslookuprealmfalse凭证生效的时限,设置为24h。ticketlifetime24h凭证最长可以被延期的时限,一般为7天。当凭证过期之后,对安全认证的服务的后续访问则会失败。renewlifetime7d如果此参数被设置为true,则可以转发票据,这意味着如果具有TGT的用户登陆到远程系统,则KDC可以颁发新的TGT,而不需要用户再次进行身份验证。forwardabletrue我理解是和dnslookuprealm相反,即反向解析技术,该功能我也没有去验证过,默认禁用即可。rdnsfalse在KDC中配置pkinit的位置,该参数的具体功能我没有做进一步验证。pkinitanchorsetcpkitlscertscabundle。crt设置Kerberos应用程序的默认领域。如果您有多个领域,只需向〔realms〕节添加其他的语句。其中默认EXAMPLE。COM可以为任意名字,推荐为大写,这里我改成了HADOOP。COM。必须跟要配置的realm的名称一致。defaultrealmHADOOP。COM顾名思义,默认的缓存名称,不推荐使用该参数。defaultccachenameKEYRING:persistent:{uid}〔realms〕HADOOP。COM{kdc服务器地址。格式〔主机名或域名〕:端口,默认端口是88,默认端口可不写kdcserver。kerberos。com:88admin服务地址格式〔主机名或域名〕:端口,默认端口749,默认端口可不写adminserverserver。kerberos。com:749代表默认的域名,设置Server主机所对应的域名defaultdomainkerberos。com}指定DNS域名和Kerberos域名之间映射关系。指定服务器的FQDN,对应的domainrealm值决定了主机所属的域。〔domainrealm〕。kerberos。comHADOOP。COMkerberos。comHADOOP。COMkdc的配置信息。即指定kdc。conf的位置。〔kdc〕kdc的配置文件路径,默认没有配置,如果是默认路径,可以不写profilevarkerberoskrb5kdckdc。conf3、配置kdc。conf 【温馨提示】varkerberoskrb5kdckdc。conf:kdc的专属配置,可以根据自己的需求修改下kdc数据库的存放目录。〔kdcdefaults〕指定KDC的默认端口kdcports88指定KDC的TCP协议默认端口。kdctcpports88〔realms〕该部分列出每个领域的配置。HADOOP。COM{和supportedenctypes默认使用aes256cts。由于,JAVA使用aes256cts验证方式需要安装额外的jar包(后面再做说明)。推荐不使用,并且删除aes256cts。(建议注释掉,默认也是注释掉的)masterkeytypeaes256cts标注了admin的用户权限的文件,若文件不存在,需要用户自己创建。即该参数允许为具有对Kerberos数据库的管理访问权限的UPN指定ACL。aclfilevarkerberoskrb5kdckadm5。acl该参数指向包含潜在可猜测或可破解密码的文件。dictfileusrsharedictwordsKDC进行校验的keytab。adminkeytabvarkerberoskrb5kdckadm5。keytabticket的默认生命周期为24hmaxfile24h该参数指定在多长时间内可重获取票据,默认为0maxrenewablelife7d指定此KDC支持的各种加密类型。supportedenctypesaes256cts:normalaes128cts:normaldes3hmacsha1:normalarcfourhmac:normalcamellia256cts:normalcamellia128cts:normaldeshmacsha1:normaldescbcmd5:normaldescbccrc:normal}4、配置kadm5。acl 【温馨提示】varkerberoskrb5kdckadm5。acl:权限相关配置 其中前一个号是通配符,表示像名为abcadmin或xxxadmin的人都可以使用此工具(远程或本地)管理kerberos数据库,后一个跟权限有关,表示所有权限。HADOOP。COM是上面配置的realm。adminHADOOP。COM Kerberoskadmind使用该文件来管理对Kerberos数据库的访问权限。对于影响principa的操作,ACL文件还控制哪些principa可以对哪些其他principa进行操作。文件格式如下:principalpermissions〔targetprincipal〔restrictions〕〕 相关参数说明:principal:设置该principal的权限;principal的每个部分都可以使用。permissions:权限,指定匹配特定条目的主体可以执行或不可以执行的操作。如果字符是大写,则不允许该操作。如果字符是小写,则允许该操作。有如下一些权限:a:〔不〕允许添加主体或策略。d:〔不〕允许删除主体或策略。m:〔不〕允许修改主体或策略。c:〔不〕允许更改主体的口令。i:〔不〕允许查询Kerberos数据库。l:〔不〕允许列出Kerberos数据库中的主体或策略。x或:允许所有权限。targetprincipal:目标principal,目标principal的每个部分都可以使用。【可选】restrictions:针对权限的一些补充限制,如:限制创建的principal的票据最长时效。【可选】 【示例】 kadm5。acl文件中的以下项授予HADOOP。COM领域中包含admin实例的任何主体对Kerberos数据库的所有权限:adminHADOOP。COM kadm5。acl文件中的以下项授予testEXAMPLE。COM主体添加、列出和查询包含root实例的任何主体的权限。testEXAMPLE。COMalirootEXAMPLE。COM kadm5。acl文件中的以下项不授予testEXAMPLE。COM主体添加、列出和查询包含root实例的任何主体的权限。testEXAMPLE。COMALIrootEXAMPLE。COM 详细说明可参考官网文档:https:web。mit。edukerberoskrb5latestdocadminconffileskadm5acl。html5、初始化KDC数据库kdb5utilcreaterHADOOP。COMsllavarkerberoskrb5kdcs:表示生成stashfile,并在其中存储masterserverkey(krb5kdc)r:指定realmname kerberos数据库创建完之后,默认会创建以下5个文件(kdc。conf、kadm5。acl除外的其他几个),Kerberos数据库的目录为:varkerberoskrb5kdc,如果需要重建数据库,可删除这五个文件重新执行上面的命令创建。rmvarkerberoskrb5kdc。k5。HADOOP。COMvarkerberoskrb5kdcprincipalf6、启停Kerberos服务 启动:systemctlstartkrb5kdckadmin查看服务状态systemctlstatuskrb5kdckadmin 停止:systemctlstopkrb5kdckadmin7、kadmin。local Kerberos服务机器上可以使用kadmin。local来执行各种管理的操作。进入kadmin。local,不需要输入密码:kadmin。local 常用操作: 操作 描述 示例 addprincipal,addprinc,ank 增加principal addprincipalrandkeytestHADOOP。COM cpw 修改密码 cpwtestHADOOP。COM deleteprincipal,delprinc 删除principal deleteprincipaltestHADOOP。COM modifyprincipal,modprinc 修改principal modifyprincipaltestHADOOP。COM renameprincipal,renprinc 重命名principal renameprincipaltestHADOOP。COMtest2ABC。COM getprincipal,getprinc 获取principal getprincipaltestHADOOP。COM listprincipals,listprincs,getprincipals,getprincs 显示所有principal listprincs ktadd,xst 导出条目到keytab xstkroottest。keytabtestHADOOP。COM ? 查看帮助 ? 【温馨提示】randkey是密码是随机的,nokey密码不随机【默认】,得手动输入密码。 【示例】addprincrandkeyhdfsadminaddprincpw123456hdfsadminaddprinchdfsadmin输入密码:1234562)KerberosClient安装 在hadoopnode2和hadoopnode3节点上安装clientkrb5workstation:包含一些基本Kerberos程序,比如(kinit,klist,kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。krb5devel:包含编译Kerberos程序的头文件和一些类库。yuminstallkrb5develkrb5workstationy 配置krb5。conf 【温馨提示】etckrb5。conf:客户端根据该文件中的信息取访问KDCTooptoutofthesystemcryptopoliciesconfigurationofkrb5,removethesymlinkatetckrb5。conf。dcryptopolicieswhichwillnotberecreated。includediretckrb5。conf。dKerberos守护进程的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a记录方式。换句话说,表示server端的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的打印位置。〔logging〕默认的krb5libs。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径defaultFILE:varlogkrb5libs。log默认的krb5kdc。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径kdcFILE:varlogkrb5kdc。log默认的kadmind。logahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件存放路径adminserverFILE:varlogkadmind。logKerberos使用的默认值,当进行身份验证而未指定Kerberos域时,则使用defaultrealm参数指定的Kerberos域。即每种连接的默认配置,需要注意以下几个关键的配置:〔libdefaults〕DNS查找域名,我们可以理解为DNS的正向解析,该功能我没有去验证过,默认禁用。(我猜测该功能和domainrealm配置有关)dnslookuprealmfalse凭证生效的时限,设置为24h。ticketlifetime24h凭证最长可以被延期的时限,一般为7天。当凭证过期之后,对安全认证的服务的后续访问则会失败。renewlifetime7d如果此参数被设置为true,则可以转发票据,这意味着如果具有TGT的用户登陆到远程系统,则KDC可以颁发新的TGT,而不需要用户再次进行身份验证。forwardabletrue我理解是和dnslookuprealm相反,即反向解析技术,该功能我也没有去验证过,默认禁用即可。rdnsfalse在KDC中配置pkinit的位置,该参数的具体功能我没有做进一步验证。pkinitanchorsetcpkitlscertscabundle。crt设置Kerberos应用程序的默认领域。如果您有多个领域,只需向〔realms〕节添加其他的语句。其中默认EXAMPLE。COM可以为任意名字,推荐为大写,这里我改成了HADOOP。COM。必须跟要配置的realm的名称一致。defaultrealmHADOOP。COM顾名思义,默认的缓存名称,不推荐使用该参数。defaultccachenameKEYRING:persistent:{uid}〔realms〕HADOOP。COM{kdc服务器地址。格式〔主机名或域名〕:端口,默认端口是88,默认端口可不写kdcserver。kerberos。com:88admin服务地址格式〔主机名或域名〕:端口,默认端口749,默认端口可不写adminserverserver。kerberos。com:749代表默认的域名,设置Server主机所对应的域名defaultdomainkerberos。com}指定DNS域名和Kerberos域名之间映射关系。指定服务器的FQDN,对应的domainrealm值决定了主机所属的域。〔domainrealm〕。kerberos。comHADOOP。COMkerberos。comHADOOP。COM 测试验证连接server默认用户是rootadminHADOOP。COM,发现在数据库里没有这个用户,可以先在server端创建该用户:addprincipalrootadminHADOOP。COMkadmin输入密码:123456 指定用户kadminptestHADOOP。COM 3)基本命令操作1、kadmin(数据库管理) Kerberos客户端机器上可以使用kadmin来执行各种管理的操作,服务端可以使用kadmin和kadmin。local命令。需先在KerbersServer上创建登录的principal,默认为{当前用户}adminrealm。 管理KDC数据库有两种方式:一种直接在KDC(server端)直接执行,可以不需要输入密码就可以登录【命令:kadmin。local】一种则是客户端命令,需要输入密码【命令:kadmin】,在server端和client端都可以使用。 创建用户,注意自己设置的密码交互式kadmin。localaddprincipalrootadmin非交互式kadmin。localqaddprincipalrootadmin2、kinit(在客户端认证用户)kinitrootadminHADOOP。COM查看当前的认证用户klist 3、导出keytab认证文件 使用xst命令或者ktadd命令:非交互式kadmin。localqktaddnorandkeykrootroot。keytabrootadmin交互式kadmin。localktaddnorandkeykrootroot。keytabrootadmin或xstkrootv。keytabrootadmin或xstnorandkeykrootroot。keytabrootadmin 其中rootroot。keytab为自己指定的路径与文件名,以。keytab结尾;rootadmin为之前创建的凭证用户 查看密钥文件klistktrootroot。keytab4、kdestroy(删除当前的认证缓存)kdestroy5、用户认证(登录) 基于密码认证klistkinitrootadmin输入密码:123456klist 基于密钥认证(keytab)删除当前用户认证kdestroy拿到上面生成的keytab文件klistkinitktrootroot。keytabrootadminklist 常见的基础操作就到这里了,更多操作命令,可以查看官方文档和查看帮助。后续会分享kerberos认证实战文章,请小伙伴耐心等待