kerberos简介
Kerberos是一种计算机网络认证协议,此协议可以保护网络实体免受窃听和重复攻击,它允许某实体在非安全网络环境下向另一个实体以一种安全的方式证明自己的身份。Kerberos由麻省理工实验室实现此协议并发布的一套免费软件。其设计主要是针对客户-服务器模型,且提供了一系列交互认证——用户和服务器都能高安全性的验证对方的身份。
链接
kerberos认证原理
用对话场景来解释kerbeors的设计过程
Kerberos基本概念:
最后会通过搭建好的 kerberos 服务来具体讲解,不至于抽象:
1. Kerberos中有三种角色:
服务器, 客户端
KDC(认证服务器)
客户端和服务器要信任KDC
KDC在整个Kerberos Authentication中作为Client和Server共同信任的第三方起着重要的作用。
并且KDC要存储它们每个人的私有密码所生成的Hash**.这些hashkey被存储在account database(账号数据库)中。
2. KDC为了便于查询它们每个人的Hash**, 要求他们必须有一个唯一的名字,称为principal.
3. 安全个体(principal)
定义:
1. 凡是可以与账户和口令联系在一起的任何事物都可以被认为是安全个体;
2. 每个安全个体都有一个可被认证的身份;
3. 在认证的过程中,正在被证明的是参与各方的安全个体的身份。
假设你的CDH集群已经安装配置好了,Kerbers此过程忽略跳过。
一.检查是否已经安装
1.1 rpm -qa | grep krb5 ( rpm -qa 列出所有被安装的rpm package ,可以把grep理解成字符搜索工具 )
特别提醒:如果是在内网(镜像文件已经安装好Kerberos)谨慎进行下面卸载操作步骤
1.2 如果已经安装进行卸载,执行下面命令进行卸载
yum -y remove krb5
注意:如果是内网安装,请谨慎选择此卸载步骤。
二.安装kerberos
如果已经内网环境已经安装好Kerberos不需要重新安装,可跳过此节内容
2.1 Server节点安装Kerberos相关软件
通过下面命令进行安装kerberos
yum install -y krb5-server krb5-workstation krb5-libs
~~~~中间过程===省,直接看最后的安装结果
可以用rep -qa | grep krb5 查看安装的情况
2.2 Client节点安装Kerberos相关软件
- 本文档的集群客户端节点有2个,此文图文只展示 address-03 的客户端节点的安装,其他客户端节点安装过程完全一 样。
- 执行下面命令进行address-[03-04]节点安装
yum install -y krb5-workstation krb5-libs
中间过程省略。。。
- 可以用rep -qa | grep krb5查看安装的结果
2.3 配置Kerberos
需要配置的文件有两个为kdc.conf和krb5.conf , 配置只是需要Server服务节点配置,也就是address-02 节点。
2.3.1 kdc文件配置
- 查看krb5的配置文件路径
执行下面命令进行查看
whereis krb5
- 编辑修改kdc.conf,执行下面命令
vi /var/kerberos/krb5kdc/kdc.conf
- vi编写修改内容如下
[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
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
}
注意:[kdcdefaults] 和 [realms] 前面一定不能有空格
备注说明:
- HADOOP.COM:是设定的realms(领域)。名字随意。Kerberos可以支持多个realms,大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。
- master_key_type和 supported_enctypes 默认使用 aes256-cts。JAVA 使用 aes256-cts 验证方式需要安装 JCE 包,见下面的说明。为了简便,你可以不使用 aes256-cts 算法,这样就不需要安装 JCE ,我们这里没有使用。
- acl_file:标注了 admin 的主体权限,使用默认的文件。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
- supported_enctypes:支持的校验方式。
- admin_keytab:KDC 进行校验的 keytab。
2.3.2 krb5文件配置
- 编辑修改krb5.conf文件,执行下面命令进行修改
-
vi /etc/krb5.conf
# 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 = /etc/pki/tls/certs/ca-bundle.crt
default_realm = HADOOP.COM
default_ccache_name = KEYRING:persistent:%{uid}[realms]
HADOOP.COM = {
kdc = address-02
admin_server = address-02
}[domain_realm]
.example.com = HADOOP.COM
example.com = HADOOP.COM
红色部分要写成主机的名称
logging] [libdefaults][realms][domain_realm]的前面一定不能有空格
备注说明:
- default_realm = HADOOP.COM 默认的realm,设置 Kerberos 应用程序的默认领域,必须跟要配置的realm的名称一致。
- 如果您有多个领域,只需向 [realms] 节添加其他的语句。
- ticket_lifetime : 表明凭证生效的时限,一般为24小时。
- renew_lifetime : 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
- clockskew :时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。
这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内。
- udp_preference_limit= 1:禁止使用 udp 可以防止一个 Hadoop 中的错误
- [realms]:列举使用的 realm。
kdc:代表要kdc的位置。格式是 机器:端口 因为配置了hosts 可以使用Master
admin_server:代表admin的位置。格式是机器:端口 Master
- [default_domain]:代表默认的域名
- [appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置
2.3.3 同步krb5到Client(客户端)节点
- Kerberos客户端节点只需要同步Server节点的krb5.conf配置即可,执行下面命令进行同步
rsync -av /etc/krb5.conf address-03:/etc/krb5.conf
所有的客户端节点都需要同步。
2.3.4 生成Kerberos数据库
- 在Kerberos的Server服务器节点上执行生成Kerberos数据库,也就是hadoop01节点
- 执行过程输入两次Kerberos的密码,注意要记住
-
kdb5_util create -s -r HADOOP.COM
箭头指的地方需要输入两次密码。
- 确定Kerberos数据库是否创建完成
- 可以通过查看/var/kerberos/krb5kdc是否生成principal文件,执行下面命令
ls /var/kerberos/krb5kdc/
2.3.5(可选)重新创建Kerberos数据库
- 此流程可以忽略,只是kdc.conf或者krb5.conf文件不正常的情况或者其他情况下进行的操作
-
删除/var/kerberos/krb5kdc目录下的principal即可,执行下面命令进行删除
rm -rf /var/kerberos/krb5kdc/*principal*
3.查看是否删除完成,执行下面命令
ls /var/kerberos/krb5kdc/
4. 重新执行创建Kerberos数据库命令(参考 2.3.4章节)
2.3.6 创建Kerberos管理员主体/实例并授权
- 在Kerberos的服务端节点创建管理员主体,执行下面命令,并输入两次管理员‘主体/实例’的密码
kadmin.local -q "addprinc admin/admin"
箭头指的地方需要输入两次密码。
2.给管理员实例的全部主体进行授权,使用下面命令进行修改
vim /var/kerberos/krb5kdc/kadm5.acl
3.修改成下面内容:
保存并退出
备注:
- *代表全部的主体
- /admin 代表admin实例
- @HADOOP.COM代表领域
- 最后个*代表全部权限。
这个授权的意思:就是授予admin实例的全部主体对应HADOOP.COM领域的全部权限。
也就是创建Kerberos主体的时候如果实例为admin,就具有HADOOP.COM领域的全部权限,比如创建如下的主体user1/admin就拥有全部的HADOOP.COM领域的权限。
请特别留意:
- 后续都是为了简便创建principal时候都是以”主体”来称谓,因为我们只配置一个领域那么默认领域不写则为HADOOP.COM。如果存在多个领域必须添加@HADOOP.COM。
- 如果创建模式为:addprinc user1 那么就没有指定实例,默认领域为HADOOP.COM,格式为[email protected]
- 如果创建模式为addprinc user1/user1 那么主体为user1实例为user1,领域为默认领域HADOOP.COM。格式为user1/[email protected]
三.启动Kerberos并设置开机启动
-
Server节点启动Kerberos服务
1.1 启动krb5kdc
service krb5kdc start
1.2 启动kadmin
service kadmin start
2.Server节点设置开机启动Kerberos服务
1. 设置krb5kdc服务开机启动
chkconfig krb5kdc on
2. 检查krb5kdc是否已经开启开机启动
chkconfig |grep krb5kdc
3. 设置kadmin服务开机启动
chkconfig kadmin on
4. 检查kadmin是否已经开启开机启动
chkconfig |grep kadmin
5. 查看启动日志
5.1 krb5kdc启动日志查看
cat /var/log/krb5kdc.log
启动正常
5.2 kadmin启动日志查看
cat /var/log/kadmind.log
6.Kinit管理员检查
6.1 通过kinit进行管理员主体检查,执行下面命令,并输入创建管理员主体时的密码
kinit admin/admin
6.2 通过klist查看Kerberos管理员主体登录情况,执行下面命令查看
klist
出现上面截图证明kinit管理员主体检查已经正常。
6.3 客户端检查
通过其他客户端节点比如 address-03 节点检查Kerberos服务是否正常,通过运行下面命令
kadmin admin/admin
备注:到此Kerberos的整个安装配置流程已经完成~
四.常用命令
1.登录Kerberos
1.1 在KDC服务端节点登录
kadmin.local
1.2 在Client客户端登录
kadmin admin/admin
1.3 退出登录
kadmin: exit
2.创建Kerberos主体
2.1 创建主体user1并指定输入密码
kadmin.local -q "addprinc user1"
2.2 创建主体user3密码随机生成
kadmin.local -q "addprinc -randkey user3"
3.修改Kerberos主体密码
3.1 修改主体user1的密码
kadmin.local -q "cpw user1"
4.查询所有的Kerberos的主体
4.1 kadmin.local -q "list_principals"
5.生成keytab**文件
5.1 生成主体user1的keytab文件到指定目录/home/keytab/user1.keytab
kadmin.local -q "xst -k /home/keytab/user1.keytab [email protected]"
5.2 查看生成的keytab**文件
ls /home/keytab/
6.删除Kerberos主体
6.1 删除Kerberos主体user3
kadmin.local -q "delprinc user3"
确定是否已经删除
kadmin.local -q "list_principals"
7.主体认证
7.1 kinit 进行主体Kerberos认证,通过密码的方式
kinit admin/admin
7.2 kinit 进行主体Kerberos认证,通过keytab的方式
kinit -kt /home/keytab/user1.keytab user1
8. 销毁凭证
8.1 执行销毁凭证命令
kdestroy
9.启动重启停止Kerberos服务命令
9.1 启动服务命令
(1)启动kdc服务
service krb5kdc start
(2)启动kadmin服务
service kadmin start
9.2 重启服务命令
(1)重启kdc服务
service krb5kdc restart
(2)重启kadmin服务
service kadmin restart
9.3 停止服务命令
(1)停止kdc服务
service krb5kdc stop
(2)停止kadmin服务
service kadmin stop
五.安装和使用Kerberos异常问题
1.创建Kerberos数据库过程可能会在loading random data中等待很长时间
原因:因为/dev/random的随机数据产生的很少,可以适当的让网卡传输数据,这样有助于产生随机数据。
解决办法:
可以重新开启一个窗口执行cat /dev/sda > /dev/urandom命令,加快消耗CPU,增加随机数采集。
2. Kerberos启动后台日志提示异常:No such file or directory - while initializing database for realm HADOOP.COM
解决办法:检查kdc.conf和krb5.conf文件是否配置正确,修改配置,注意:配置文件的[kdcdefaults],[logging]
[libdefaults] 等的里面不能有空格
1.1 停止Kerberos服务
service krb5kdc stop
service kadmin stop
1.2 删除Kerberos数据库重新创建数据库
rm -rf /var/kerberos/krb5kdc/*principal*
kdb5_util create -s -r HADOOP.COM
1.3 创建管理员
kadmin.local -q "addprinc admin/admin"
1.4 启动Kerberos服务
service krb5kdc start
service kadmin start
1.5 在检查下日志文件内容
cat /var/log/krb5kdc.log
krb5kdc正常启动了
cat /var/log/kadmin.log
3.kinit通过keytab认证出现异常kinit: ???? while getting initial credentials
描述:通过Linux的user1主体执行kinit -kt /home/keytab/user1.keytab user1出现下面情况
kinit /home/hadoop
kinit: ???? while getting initial credentials
或者kinit: Permission denied while getting initial credentials
解决办法:
使用Linux的root用户更改user1.keytab文件的拥有者为user1
chown user /user/keytab/user1.keytab
使用Linux的root用户更改user1.keytab的权限为660
验证认证正常
4. kinit进行主体密码认证时候,明明密码正确,为什么一直提示密码错误
异常进行如下:kinit: Password incorrect while getting initial credentials
原因:已经使用该主体生成了keytab文件,那么‘kinit 主体名’进行验证时候是无法进行认证的
解决办法:要么使用keytab的方式认证
kinit -kt /home/keytab/user1.keytab user1
要么更改密码,重新kinit 新密码认证,那么以前的那个keytab文件就失效了
具体实例理解(自己理解):
在上面的配置中主机address-02就是服务器,address-{03,04}是客户端,在服务器上面配置的krb5.cof文件中指定了kdc服务器的主机名,同时生成了一个用于存放每个主体私有密码所生成的Hash**.这些hashkey被存储在account database(账号数据库)中。创建一个主体,这个主体是当前HADOOP.COM领域的父主体,这个主体的权限最大。然后生成一个keytab,这个keytab里面的数据和这个主体就会在kdc数据库中保存,当有主体登录的时候就会去这个数据库检查,证明认证成功可以登录。