kerberos认证搭建安装
一、Kerberos简介
1.Kerberos
Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份,协议基于对称密码学,并需要一个值得信赖的第三方(KDC)。Kerberos 是第三方认证机制,其中用户和服务依赖于第三方(Kerberos 服务器)来对彼此进行身份验证。 Kerberos服务器本身称为密钥分发中心或 KDC。
它主要包含:认证服务器(AS)和票据授权服务器(TGS)组成的密钥分发中心(KDC),以及提供特定服务的SS。相关概念描述:
- AS(Authentication Server)= 认证服务器
- KDC(Key Distribution Center)= 密钥分发中心
- TGT(Ticket Granting Ticket)= 授权票据
- TGS(Ticket Granting Server)= 票据授权服务器
- SS(Service Server)= 特定服务提供端
KDC持有一个密钥数据库;每个网络实体——无论是客户还是服务器——共享一套只有他自己和KDC知道的密钥。密钥的内容用于证明实体的身份。对于两个实体间的通信,KDC产生一个会话密钥,用来加密他们之间的交互信息。
2.Kerberos认证流程
以平时坐火车举例:
- 初始验证:票证授予票证:
- 后续Kerberos验证
2.1客户端认证
- 客户端将clientID(Principal)以明文消息发送给AS,以代表用户请求服务,密码(keytab)不会发送,AS能够从本地数据库中查询到。
- AS会查询该用户名是否存在本地数据库,如果存在则使用该用户密码,发送两条加密消息给客户端。
- Message A: 用户密码加密的会话密钥Client/TGS Session Key 。
- Message B: 使用TGS加密的TGT,TGT包含了( client ID, client network address, ticket validity period, and the client/TGS session key)。
- 一旦客户端收到消息A和B,它就会使用密码生成的密钥解密消息A。如果用户输入的密码与AS数据库中的密码不匹配,则无法解密消息A。解密后的会话密钥用于与TGS进行进一步的通信,客户端无法解密消息B,因为它是使用TGS的密钥加密的。此时,客户端具有足够的信息来向TGS进行身份验证。
2.2服务授权
- 请求服务时,客户端将以下消息发送到TGS。
- Message C: 由消息B的TGT和请求的服务的ID组成。
- Message D: 使用Client/TGS Session Key加密的authenticator (which is composed of the client ID and the timestamp)。
- 收到消息C和消息D后,TGS首先检查KDC数据库中是否存在所需的服务,查找到之后,TGS用自己的密钥解密消息C中的消息B(也就是TGT),从而得到之前生成的Client/TGS Session Key。TGS再用这个Session Key解密消息D得到包含用户ID和时间戳的Authenticator,并对TGT和Authenticator进行验证,验证通过之后返回两条消息:
- Message E: 由服务端SS加密的Client-to-server ticket(客户端到服务端票据),包含了(Client ID, client network address, validity period and Client/Server Session Key)。
- Message F:由Client/TGS Session Key加密的Client/Server Session Key
2.3服务请求
- 当获得Client/Server Session Key之后,Client就能够使用服务器提供的服务了。Client向指定服务器发出2条消息:
- Message E: 服务端ss加密的Client-to-server ticket
- Message G: 新的Authenticator,包含使用Client/Server Session Key加密的client ID, timestamp。
- 服务端解密消息E进而获得Client/Server Session Key,再用这个Client/Server Session Key解密消息G得到Authenticator,同TGS一样对Ticket和Authenticator进行验证,验证通过则服务器将以下消息发送给客户端,以确认其真实身份和接收客户端请求。
- Message H: 通过Client/Server Session Key加密的,在客户的身份验证器中找到的时间戳。
- 客户端使用Client/Server Session Key解密确认(消息H),并检查时间戳是否正确。如果正确,则客户端可以信任服务器并可以开始向服务器发出服务请求。
- 服务器向客户端提供请求的服务。
3.kdc集群
3.1安装包
- krb5-server:Kerberos服务端程序,KDC所在节点。
- krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。
- krb5-libs:包含Kerberos程序的各种支持类库等。所有节点部署。
3.2术语
- principal :认证的主体,简单来说就是"用户名"。 Principal 是由三个部分组成:名字(name),实例(instance),REALM(域)。比如一个标准的 Kerberos 的用户是:name/instance@REALM。格式: 服务/主机@域
- realm:域,类似于namespace的作用,可以看成是principal的一个"容器"或者"空间"。 在kerberos, 大家都约定成俗用大写来命名realm, 比如"EXAMPLE.COM",相对应的,principal的命名规则是"what_name_you_like@realm"。
- keytab文件:存储了多个principal的加密密码。因为服务器上可以访问 keytab 文件即可以以 principal 的身份通过 kerberos 的认证,所以,keytab 文件应该被妥善保存,应该只有少数的用户可以访问。
- password:某个用户的密码,对应于kerberos中的master_key。password可以存在一个keytab文件中。所以kerberos中需要使用密码的场景都可以用一个keytab作为输入。
- credential:credential是“证明某个人确定是他自己/某一种行为的确可以发生”的凭据。在不同的使用场景下, credential的具体含义也略有不同:
- 对于某个principal个体而言,他的credential就是他的password。
- 在kerberos认证的环节中,credential就意味着各种各样的ticket。
- ticket(票证):ticket 是一种信息包,用于将用户身份安全地传递到服务器或服务。一个票证仅对一台客户机以及某台特定服务器上的一项特殊服务有效。所有此类数据都使用服务器的服务密钥进行加密。颁发票证之后,可重用票证直到其到期为止。票证包含以下内容:
- 服务的主体名称
- 用户的主体名称
- 用户主机的 IP 地址
- 时间标记
- 定义票证生命周期的值
- 会话密钥的副本
以上来自文章Kerberos协议及Habase相关参数与kerberos入坑指南
二、安装搭建
1.服务器安装
所用机器节点名为node1
1.1安装命令
yum -y install krb5-server krb5-libs krb5-workstation
执行完命令后,会生成kerberos配置文件,krb5.conf和kdc.conf等
主要文件路径分别为:
- /var/kerberos/krb5kdc/
- /var/kerberos/krb5kdc/kdc.conf
- /var/kerberos/krb5kdc/kadm5.acl
- /etc/krb5.conf
安装情况如图:
1.2修改配置
1.2.1修改KDC的配置文件
cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_life = 1d
max_renewable_life = 7d
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
注:其上配置中的aes256-cts:normal这个算法需要额外的jar包支持,可以去掉
配置说明:
[kdcdefaults]
#该部分包含在此文件中列出的所有通用的配置。
kdc_ports = 88 #指定KDC的默认端口
kdc_tcp_ports = 88 # 指定KDC的TCP协议默认端口。
[realms]
#该部分列出每个领域的配置。
HADOOP.COM = {
#是设定的 realms。名字随意,推荐为大写!,但须与/etc/krb5.conf保持一致。Kerberos 可以支持多个 realms,会增加复杂度。大小写敏感。
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl #标注了 admin 的用户权限的文件,若文件不存在,需要用户自己创建。即该参数允许为具有对Kerberos数据库的管理访问权限的UPN指定ACL。
dict_file = /usr/share/dict/words #该参数指向包含潜在可猜测或可破解密码的文件。
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab #KDC 进行校验的 keytab。
max_life #该参数指定如果指定为2天。这是票据的最长存活时间。
max_renewable_life #该参数指定在多长时间内可重获取票据。
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal #指定此KDC支持的各种加密类型。
}
1.2.2配置KDC服务的权限管理文件
cat /var/kerberos/krb5kdc/kadm5.acl
*/[email protected] *
配置说明:
上述参数只有两列,第一列为用户名,第二列为权限分配。
*/[email protected] #表示以"/[email protected]"结尾的用户。
* #表示UNP可以执行任何操作,因为权限为所有权限,
权限可选择的配置列表如下:
a: 允许增加principal或访问策略
A: 不允许增加principal或访问策略
c: 允许变更principals的密码
C: 不允许变更princials的密码
d: 允许删除principals或策略
D: 不允许删除principals或策略
i: 允许查看数据库
I: 不允许查看数据库
l: 允许列出principals或策略列表
L: 不允许列出principals或策略
m: 允许修改principals或策略
M: 不允许修改principals或策略
p: 允许传播(propagation)principal数据库
P: 不允许传播principal数据库
s: 允许显式设置principals秘钥
S: 不允许显式设置principals秘钥
x: admcilsp的缩写。所有特权
*: 跟x一样
下面举例说明:
root/[email protected] *
===说明:root/admin可以在kadmin里做任何事===
xianglei/[email protected] aml
===说明:root/admin可以在kadmin里增加,修改,查看principals列表,===
===但不能删除,传播,查看数据库内容,变更密码等操作===
list/[email protected] l
===说明:list/admin用户只能看,别的啥也不能干===
1.2.3修改Kerberos的配置文件信息
包含KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的机器上的配置文件都同步。
cat /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default