微软Windows域控的Kerberos认证技术
一、Kerberos概述
Kerberos是为TCP/IP网络系统设计的可信的第三方认证协议,用于身份认证。网络上的Keberos服务基于DES对称加密算法,但也可以用其他算法替代。因此,Keberos是一个在许多系统中获得广泛应用的认证协议。Keberos最初是美国麻省理工学院(MIT)为Athena项目开发的。
官网:https://www.kerberos.org/
官方文档:http://web.mit.edu/kerberos/krb5-current/doc/
1)应用场景
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的形式:
例如:administrator@ai-x.co.uk
Name[/Instance]@REALM
其中Instance是可选 的,通常用于更好地限定用户的类型。比如,一个管理员用户通常会有admin instance,即Name/admin@REALM。
1 | [email protected] |
2)服务principal
用户principal的形式:
Service/Hostname@REALM
第一部分是service的名字,比如imap, AFS, ftp. 通常’host’这个名字被用于指明对一台机器的通用的访问(telnent, rsh, ssh)。
第二个component是提供这个服务的机器的全限定域名(FQDN)。这个component跟DNS对应用服务器的IP地址进行逆向解析后得到的主机名。
1 | imap/[email protected] |
3)Ticket
Ticket分两种:
- Ticket Granting Ticket,TGT:这是KDC中的Authentication Server(简称AS)产生的,TGT是向Ticket Granting Server(TGS)用于表明自己真实身份的东西。
- Service Ticket:这是KDC中的Ticket Granting Server(简称TGS)产生的,Service Ticket 是用于向应用服务器表明自己身份的东西
三、Kerberos架构与工作原理
AS_REQ 是在初始化一个用户(kinit)的时候发出的用户认证请求,这个请求是发给KDC中的Authentication Server (AS);
AS_REP 是AS回复给client的信息,其中包括TGT (用TGS secret key加密过的) and the session key (用发请求的用户的secret key加密过的);
TGS_REQ 是client为了一个service ticket向Ticket Granting Server (TGS)的信息. 其中包括上一条信息中获得的TGT (用TGS secret key加密过的) ,一个客户端产生的一个authenticator(用session key加密过的).
TGS_REP 是TGS回复给TGS_REQ的信息. 其中包括service ticket(用appservice的secret key加密过),和 一个TGS产生的service sessinon key(之前AS产生的一条session key给加密过的)
AP_REQ 是一条客户端发给appserver的访问服务的请求,其中包括service ticket和一个authenticator(使用TGS产生的service session key 加密过的)
AP_REP 是appserver回复给client的一条信息,证明这个appserver确实是客户端希望访问的server。不过这条信息也不一定总是要回复的。比如当客户端和appserver需要相互认证的时候,客户端向appserver发出请求,这个时候就不需要回复信息。
Kerberos认证时序图:
四、Kerberos安装
官方文档:https://kerberos.org/dist/index.html
1 |
|
主机名 | 域 | IP | 角色 |
---|---|---|---|
hadoop-node1 | server.kerberos.com | 192.168.0.113 | KDC(Kerberos Server、kadmin) |
hadoop-node2 | client1.kerberos.com | 192.168.0.114 | Kerberos Client |
hadoop-node3 | client1.kerberos.com | 192.168.0.115 | Kerberos Client |
1)Kerberos Server 安装
在hadoop-node1节点上执行如下命令安装Kerberos Server
1、yum安装
- krb5-server:Kerberos服务端程序,KDC所在节点。
- krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。
- krb5-libs:包含Kerberos程序的各种支持类库等。
1
$ yum install krb5-server krb5-workstation krb5-libs
2、配置 krb5.conf
1 |
|
3、配置 kdc.conf
1 |
|
4、配置 kadm5.acl
/var/kerberos/krb5kdc/kadm5.acl:权限相关配置
其中前一个号是通配符,表示像名为“abc/admin”或“xxx/admin”的人都可以使用此工具(远程或本地)管理kerberos数据库,后一个跟权限有关,*表示所有权限。HADOOP.COM是上面配置的realm。
1 | */[email protected] * |
Kerberos kadmind 使用该文件来管理对 Kerberos 数据库的访问权限。对于影响 principa 的操作,ACL 文件还控制哪些 principa 可以对哪些其他 principa 进行操作。文件格式如下:
1 | principal permissions [target_principal [restrictions] ] |
相关参数说明:
- principal:设置该 principal 的权限;principal 的每个部分都可以使用 *。
- permissions: 权限,指定匹配特定条目的主体可以执行或不可以执行的操作 。如果字符是大写,则不允许该操作。如果字符是小写,则允许该操作。有如下一些权限:a:[不]允许添加主体或策略。d:[不]允许删除主体或策略。m:[不]允许修改主体或策略。c:[不]允许更改主体的口令。i:[不]允许查询 Kerberos 数据库。l:[不]允许列出 Kerberos 数据库中的主体或策略。x 或 *:允许所有权限。
- target_principal:目标 principal,目标 principal 的每个部分都可以使用 *。【可选】
- restrictions:针对权限的一些补充限制,如:限制创建的 principal 的票据最长时效。【可选】
【示例】
kadm5.acl 文件中的以下项授予 HADOOP.COM 领域中包含 admin 实例的任何主体对 Kerberos 数据库的所有权限:kadm5.acl 文件中的以下项授予 test@EXAMPLE.COM 主体添加、列出和查询包含 root 实例的任何主体的权限。 kadm5.acl 文件中的以下项不授予 test@EXAMPLE.COM 主体添加、列出和查询包含 root 实例的任何主体的权限。 详细说明可参考官网文档:https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/kadm5_acl.html1
*/[email protected] *
5、初始化KDC数据库
1 | $ kdb5_util create -r HADOOP.COM -s |
kerberos数据库创建完之后,默认会创建以下5个文件(kdc.conf、kadm5.acl除外的其他几个),Kerberos 数据库的目录为:/var/kerberos/krb5kdc,如果需要重建数据库,可删除这五个文件重新执行上面的命令创建。
1 | $ rm /var/kerberos/krb5kdc/.k5.HADOOP.COM /var/kerberos/krb5kdc/principal* -f |
6、启停 Kerberos 服务
启动:
1 | $ systemctl start krb5kdc kadmin |
停止:
1 | $ systemctl stop krb5kdc kadmin |
7、kadmin.local
Kerberos 服务机器上可以使用 kadmin.local 来执行各种管理的操作。进入 kadmin.local,不需要输入密码:
1 | $ kadmin.local |
常用操作:
操作 | 描述 | 示例 |
---|---|---|
add_principal, addprinc, ank | 增加 principal | add_principal -randkey test@HADOOP.COM |
cpw | 修改密码 | cpw test@HADOOP.COM |
delete_principal, delprinc | 删除 principal | delete_principal test@HADOOP.COM |
modify_principal, modprinc | 修改 principal | modify_principal test@HADOOP.COM |
rename_principal, renprinc | 重命名 principal | rename_principal test@HADOOP.COM test2@ABC.COM |
get_principal, getprinc | 获取 principal | get_principal test@HADOOP.COM |
list_principals, listprincs, get_principals, getprincs | 显示所有 principal | listprincs |
ktadd, xst | 导出条目到 keytab | xst -k /root/test.keytab test@HADOOP.COM |
? | 查看帮助 | ? |
【温馨提示】-randkey是密码是随机的,-nokey密码不随机【默认】,得手动输入密码。
【示例】
1 | addprinc -randkey hdfs/admin |
2)Kerberos Client 安装
在hadoop-node2和hadoop-node3节点上安装client
- krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。
- krb5-devel:包含编译Kerberos程序的头文件和一些类库。
1
$ yum install krb5-devel krb5-workstation -y
配置 krb5.conf
【温馨提示】/etc/krb5.conf : 客户端根据该文件中的信息取访问KDC
1 | # To opt out of the system crypto-policies configuration of krb5, remove the |
测试验证连接server
1 | # 默认用户是root/[email protected],发现在数据库里没有这个用户,可以先在server端创建该用户:add_principal root/[email protected] |
指定用户
1 | $ kadmin -p [email protected] |
3)基本命令操作
1、kadmin(数据库管理)
Kerberos 客户端机器上可以使用 kadmin 来执行各种管理的操作,服务端可以使用kadmin和kadmin.local命令。需先在 Kerbers Server 上创建登录的 principal,默认为 {当前用户}/admin@realm。
管理KDC数据库有两种方式:
- 一种直接在KDC(server端)直接执行,可以不需要输入密码就可以登录【命令:kadmin.local】
- 一种则是客户端命令,需要输入密码【命令:kadmin】,在server端和client端都可以使用。
创建用户,注意自己设置的密码1
2
3
4
5
6
7# 交互式
$ kadmin.local
add_principal root/admin
# 非交互式
$ kadmin.local -q "add_principal root/admin"
2、kinit(在客户端认证用户)
1 | $ kinit root/[email protected] |
3、导出keytab认证文件
使用xst命令或者ktadd命令:
1 | # 非交互式 |
其中 /root/root.keytab为自己指定的路径与文件名,以.keytab结尾;root/admin为之前创建的凭证用户
查看密钥文件
1 | $ klist -kt /root/root.keytab |
4、kdestroy(删除当前的认证缓存)
1 | $ kdestroy |
5、用户认证(登录)
基于密码认证
1 | $ klist |
基于密钥认证(keytab)
1 | # 删除当前用户认证 |
常见的基础操作就到这里了,更多操作命令,可以查看官方文档和查看帮助。