Kerberos原理
目录
2.2 客户端认证(客户端(Client)从认证服务器(AS)获取票据的票据(TGT)) 3
2.3 服务授权(client从TGS获取票据(client-to-server ticket)) 4
AS:Authentication Server
KDC:key distribution center
TGS:Ticket Granting Server
SS:Service Server
TGT:Ticket Granting Ticket
principal: represent a unique identity,eg.hive/[email protected]
primary: the operating system username of the user or the name of a service
instance: an optional section, are used by users in special roles or to define the host on which a service runs
realm: similar to a domain in DNS ,defines a group of principals
keytab:principal+passwd
-
-
用户使用客户端(用户自己的机器)登录:
- 用户输入用户ID和密码到客户端。
- 客户端程序运行一个单向加密把密码转换成**,这个就是客户端(用户)的“用户**”(user's secret key)。
-
客户端认证(客户端(Client)从认证服务器(AS)获取票据的票据(TGT))
- Client向AS发送1条明文消息,申请基于该用户所应享有的服务,例如“用户Sunny想请求服务”(Sunny是用户ID)。(注意:用户不向AS发送“用户**”(user's secret key),也不发送密码)该AS能够从本地数据库中查询到该申请用户的密码,并通过相同途径转换成相同的“用户**”(user's secret key)。
- AS检查该用户ID是否在于本地数据库中,如果用户存在则返回2条消息:
-
用户使用客户端(用户自己的机器)登录:
-
- 消息A:Client/TGS会话**(Client/TGS Session Key)(该Session Key用在将来Client与TGS的通信(会话)上),通过用户**(user's secret key)进行加密
-
消息B:票据授权票据(TGT)(TGT包括:消息A中的“Client/TGS会话**”(Client/TGS Session Key),用户ID,用户网址,TGT有效期),通过TGS**(TGS's secret key)进行加密
- 一旦Client收到消息A和消息B,Client首先尝试用自己的“用户**”(user's secret key)解密消息A,如果用户输入的密码与AS数据库中的密码不符,则不能成功解密消息A。输入正确的密码并通过随之生成的"user's secret key"才能解密消息A,从而得到“Client/TGS会话**”(Client/TGS Session Key)。(注意:Client不能解密消息B,因为B是用TGS**(TGS's secret key)加密的)。拥有了“Client/TGS会话**”(Client/TGS Session Key),Client就足以通过TGS进行认证了。
-
- 消息c:即消息B的内容(TGS's secret key加密后的TGT),和想获取的服务的服务ID(注意:不是用户ID)
-
消息d:认证符(Authenticator)(Authenticator包括:用户ID,时间戳),通过Client/TGS会话**(Client/TGS Session Key)进行加密
- 收到消息c和消息d后,TGS首先检查KDC数据库中是否存在所需的服务,查找到之后,TGS用自己的“TGS**”(TGS's secret key)解密消息c中的消息B(也就是TGT),从而得到之前生成的“Client/TGS会话**”(Client/TGS Session Key)。TGS再用这个Session Key解密消息d得到包含用户ID和时间戳的Authenticator,并对TGT和Authenticator进行验证,验证通过之后返回2条消息:
- 消息E:client-server票据(client-to-server ticket)(该ticket包括:Client/SS会话** (Client/Server Session Key),用户ID,用户网址,有效期),通过提供该服务的服务器**(service's secret key)进行加密
-
消息F:Client/SS会话**( Client/Server Session Key)(该Session Key用在将来Client与Server Service的通信(会话)上),通过Client/TGS会话**(Client/TGS Session Key)进行加密
- Client收到这些消息后,用“Client/TGS会话**”(Client/TGS Session Key)解密消息F,得到“Client/SS会话**”(Client/Server Session Key)。(注意:Client不能解密消息E,因为E是用“服务器**”(service's secret key)加密的)。
-
- 消息e:即上一步中的消息E“client-server票据”(client-to-server ticket)
-
消息g:新的Authenticator(包括:用户ID,时间戳),通过Client/SS会话**(Client/Server Session Key)进行加密
- SS用自己的**(service's secret key)解密消息E从而得到TGS提供的Client/SS会话**(Client/Server Session Key)。再用这个会话**解密消息g得到Authenticator,(同TGS一样)对Ticket和Authenticator进行验证,验证通过则返回1条消息(确认函:确证身份真实,乐于提供服务):
-
消息H:新时间戳(新时间戳是:Client发送的时间戳加1,v5已经取消这一做法),通过Client/SS会话**(Client/Server Session Key)进行加密
- Client通过Client/SS会话**(Client/Server Session Key)解密消息H,得到新时间戳并验证其是否正确。验证通过的话则客户端可以信赖服务器,并向服务器(SS)发送服务请求。
- 服务器(SS)向客户端提供相应的服务。
- Kerberos具体认证实现
kinit [email protected]
kinit -kt example3.keytab example3
-
- 列出keytab文件中的principal
klist -kt example3.keytab
beeline -u
“jdbc:hive2://testdiy0.example.com:10000/;principal=hive/[email protected]
1)只有在kdc中拥有root或者sudo权限的用户可以执行:
kadmin.local
admin>addprinc [email protected]
kadmin.local -q “addprinc [email protected]”
2) 通过kinit 获取admin账号的principal
kinit admin/admin
kadmin
>addprinc [email protected]
3)将principal生成keytab文件:
ktadd -kt example5.keytab [email protected]