名称来源
Kerberos,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。
kerberos是一种计算机网络授权协议
用来在非安全网络中,对个人通信以安全的手段进行身份认证。Kerberos旨在通过密钥加密技术为客户端/服务器应用程序提供身份验证,主要用在域环境下的身份验证。
背景
通常只有服务器的运维管理人员在配置Active Directory之类的东西时才会接触到Kerberos,但由于整个Hadoop生态圈在安全方面对于Kerberos愈发依赖,同时由于Kerberos认证必须入侵式改造代码的特点,需要深入研究kerberos原理及使用。
作用
网络中密码明文传输,属于裸奔状态,而Kerberos结合了加密和消息完整性来确保敏感的身份验证数据不会在网络上透明地发送;
另外无需记住多个密码,只需要记住密码数量和Kerberos密码。
KDC(key distribution center)
是一个网络服务,提供ticket和临时会话密钥。
AS(Authentication Server)
认证服务器
TGS(Ticket Grantion Server)
许可证服务器
Ticket
一个记录,客户用它来向服务器证明自己的身份,包括服务的主体名称、用户的主体名称、用户主机的ip地址、时间标记、会话密钥、定义票证生命周期的时间戳。
② User向KDC中的AS请求身份验证,AS为user和TGS生成一个session key:SK_TGS,并发送{TGT,SK_TGS} K_USER
其中,{TGT,SK_TGS}K_USER表示使用user的密码加密的packet,包含了TGT和用户与TGS的session key;这个请求验证的过程实际上是使用kinit来完成的,kinit将username传给AS,AS查找username的密码,将TGT和SK_TGS使用用户密码加密后发送给kinit,kinit要求用户输入密码,解密后得到TGT和SK;其中,TGT使用TGS的密码加密,信息内容为{user,address,tgs_name,start_time,lisftime,SK_TGS} K_TGS
④ User向KDC中的TGS请求访问某个Service的ST,发送[TGT,Authenticator]
其中,Authenticator用于验证发送该请求的user就是TGT中所声明的user,内容为:{user,address,start_time,lifetime};Authenticator使用的TGS和user之间的session key加密的,防止TGT被盗。TGS先使用自己的密码解开TGT获得它与user之间的session key,然后使用session key解密Authenticator,验证用户和有效期;
⑤ TGS判断无误后,为user和Service之间生成一个新的session key:SK_Service;然后发送给user一个包:[{SK_Service} SK_TGS, ST]
其中,ST是使用Service的密码加密的,SK_Service使用TGS和user之间的session key加密的;ST的内容为:{ user, address, start_time, lifetime, SK_Service } K_Service
⑥ User使用与TGS之间的会话密钥解开包得到与Service之间的会话密钥SK_Service,然后使用SK_Service生成一个Authenticator,向Service发送[ ST,Authenticator]
其中,此处的Authenticator是使用user和service之间的会话密钥加密的,Service收到包后先使用自己的密码解密ST,或者会话密钥SK_Service,然后使用SK_Service解密Authenticator来验证发送请求的用户就是票中所声明的用户。
主要组成
principal 是Kerberos 世界的用户名,用于标识身份,每个用户都会有一个 principal,如果 principal 失效或者不正确,那么这个用户将无法访问任何资源。principal 主要由三部分构成:primary,instance(可选) 和 realm。
primary
主体,每个 principal 都会有的组成部分,代表用户名(username)或服务名(service name)。
instance
用于服务主体以及用来创建用于管理的特殊主体。instance 用于服务主体时的一般会用于区分同一服务在不同服务器上的服务实例,因此与 primary 组成的 principal 一般用于 server 端,如:NameNode,HiverServer2,Presto Coordinator等。
instance 用来创建用于管理的特殊主体时,一般来区分同一个用户的不同身份,如区分担任管理员角色的 a 用户与担任研发的 a 用户。
realm
realm 是认证管理域名,用来创建认证的边界,只有在同属于一个认证服务的边界内,这个认证服务才有权利认证一个用户、主机或者服务。每个域都会有一个与之对应的 kdc(密钥分发中心key distribution center) 服务用于提供域内的所有服务的认证服务。
ticket cache
客户端与 KDC 交互完成后,包含身份认证信息的文件,短期有效,需要不断renew。
简介
keytab是包含多个principal和加密principal key的文件,用户可以利用该文件进行身份认证。keytab文件对于每个host是唯一的,因为key中包含hostname。keytab文件用于不需要人工交互和保存纯文本密码,实现到kerberos上验证一个主机上的principal。因为服务器上可以访问keytab文件即可以以principal的身份通过kerberos的认证
简介
存放位置 /etc/krb5.conf
包含Kerberos的配置:例如,KDC的位置,Kerberos的admin realms等。需要所有使用的Kerberos的机器上的配置文件都同步。
需替换DOMAIN.COM为自定义域名
默认示例
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = EXAMPLE.COM
udp_preference_limit = 1
[realms]
EXAMPLE.COM = {
kdc = dbnode1
admin_server = dbnode1
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
注:这里需要分发krb5.conf至所有client主机
[logging]
表示server端的日志的打印位置
[libdefaults]
每种连接的默认配置,需要注意以下几个关键的小配置:
default_realm = EXAMPLE.COM 默认的realm,必须跟要配置的realm的名称一致。
udp_preference_limit = 1 禁止使用udp,可以防止一个Hadoop中的错误
ticket_lifetime表明凭证生效的时限,一般为24小时
renew_lifetime表明凭证最长可以被延期的时限,一般为一周。当凭证过期之后,对安全认证的服务的后续访问则会失败。
[realms]
列举使用的realm:
kdc:代表kdc的位置,格式是:机器hostname或ip地址
admin_server:代表admin的位置,格式是:机器hostname或ip地址
default_domain:代表默认的域名
[appdefaults]
可以设定一些针对特定应用的配置,覆盖默认配置。
存放位置
默认放在 /var/kerberos/krb5kdc/kdc.conf
示例
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.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
supported_enctypes = 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
max_life = 25h
max_renewable_life = 8d
}
参数说明
EXAMPLE.COM:是设定的realms,名字随意。Kerberos可以支持多个realms,会增加复杂度。一般为大写。
max_renewable_life = 8d: 涉及到是否能进行ticket的renew必须配置。
master_key_type:和supported_enctyps默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,推荐不使用。
acl_file:标注了admin的用户权限。文件格式是Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
admin_keytab:KDC进行校验的keytab。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
配置说明
存放目录:服务端的配置文件/var/kerberos/krb5kdc/kadm5.acl
样例说明
# 配置以允许具备匹配条件的admin用户进行远程登录权限
*/[email protected] *
标注了admin的用户权限,需要用户自己创建。文件格式是Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。最简单的写法是*/[email protected] *
代表名称匹配*/[email protected]都认为是admin,权限是*代表全部权限。
配置说明
默认的数据库路径为/var/kerberos/krb5kdc,如果需要重建数据库,将该目录下的principal相关的文件删除即可,请牢记数据库密码。
样例说明
kdb5_util create -r EXAMPLE.COM -s
[-s] 表示生成stash file,并在其中存储master server key(krb5kdc)
[-r] 来指定一个realm name,当krb5.conf中定义了多个realm时使用
当Kerberos database创建好了之后,在/var/kerberos/中可以看到生成的principal相关文件
配置说明
krb5.conf路径存放位置
// 自定义路径
System.setProperty("java.security.krb5.conf", "src/test/resources/krb5.conf");
Linux系统:/etc/
其他:${JDK_HOME}/jre/lib/security
访问示例
数据库类型 | 访问方式 | 访问示例 | 其他 |
---|---|---|---|
Hive | jdbc | jdbc:hive2://127.0.0.1:10000/default;principal=hive/[email protected] | xxx.keytab文件路径 |
Kudu | jdbc | jdbc:hive2://127.0.0.1:21050/default;principal=impala/[email protected] | xxx.keytab文件路径 |
shell模式
操作 | 命令 | 备注 |
---|---|---|
启动kdc服务 | systemctl start krb5kdc | |
启动kadmin服务 | systemctl start kadmin | |
进入kadmin | kadmin.local / kadmin | |
创建数据库 | kdb5_util create -r EXAMPLE.COM -s | |
修改当前密码 | kpasswd | |
测试keytab可用性 | kinit -k -t /home/xiaobai/xb.keytab [email protected] | |
查看当前票据 | klist | |
查看keytab | klist -e -k -t /home/xiaobai/xb.keytab | |
通过keytab文件认证登录 | kinit -kt /home/xiaobai/xb.keytab [email protected] | |
通过密码认证登录 | kinit [email protected] / kint xiaobai | |
清除缓存 | kdestroy |
kadmin模式
注意:Kerberos进入admin管理模式需要使用root用户
操作 | 命令 | 备注 |
---|---|---|
查看principal | listprincs | |
生成随机key的principal | addprinc -randkey root/[email protected] | |
生成指定key的principal | addprinc -pw xxx root/[email protected] | |
修改root/admin的密码 | cpw -pw xxx root/admin | |
添加/删除principal | addprinc/delprinc root/admin | |
直接生成到keytab | ktadd -k /home/xiaobai/xb.keytab [email protected] xst -norandkey -k /home/xiaobai/xb.keytab [email protected] | 注意:在生成keytab文件时需要加参数"“-norandkey”",否则导致直接使用kinit [email protected]初始化时提示密码错误。 |
设置密码策略(policy) | addpol -maxlife “90 days” -minlife “75 days” -minlength 8 -minclasses 3 -maxfailure 10 -history 10 user | |
修改密码策略 | modpol -maxlife “90 days” -minlife “75 days” -minlength 8 -minclasses 3 -maxfailure 10 user | |
添加带有密码策略 | addprinc -policy user hello/[email protected] | |
修改用户的密码策略 | modprinc -policy user1 hello/[email protected] | |
删除密码策略 | delpol [-force] user |
MIT Kerberos Documentation
地狱三头犬,Kerberos身份验证在ChunJun中的落地实践
Kerberos基本原理、安装部署及用法
配置 KDC 服务器