Kerberos基础

一. Kerberos概述

Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。

Hadoop使用Kerberos作为用户和服务的强身份验证和身份传播的基础。Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。 Kerberos是第三方认证机制,其中用户和服务依赖于第三方(Kerberos服务器)来对彼此进行身份验证。 Kerberos服务器本身称为密钥分发中心或KDC。 在较高的层面上,它有三个部分:

一个认证服务器(AS)执行初始认证并颁发票证授予票证(TGT)
一个票据授权服务器(TGS)发出基于初始后续服务票证TGT
一个用户主要来自AS请求认证。AS返回使用用户主体的Kerberos密码加密的TGT,该密码仅为用户主体和AS所知。用户主体使用其Kerberos密码在本地解密TGT,从那时起,直到ticket到期,用户主体可以使用TGT从TGS获取服务票据。服务票证允许委托人访问各种服务。

Kerberos简单来说就是一个用于安全认证第三方协议,它采用了传统的共享密钥的方式,实现了在网络环境不一定保证安全的环境下,client和server之间的通信,适用于client/server模型,由MIT开发和实现。

Kerberos服务是单点登录系统,这意味着您对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。

由于每次解密TGT时群集资源(主机或服务)都无法提供密码,因此它们使用称为keytab的特殊文件,该文件包含资源主体的身份验证凭据。 Kerberos服务器控制的主机,用户和服务集称为领域。

二. Kerberos术语

Princal(安全个体):Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号,其格式通常如下:primary**/**instance@realm

Realm:Kerberos所管理的一个领域或范围,称之为一个Realm。

keytab:Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件。

KDC(key distribution center): 认证过程的票据生成管理服务,其中包含两个服务,AS(Authentication Service)和TGS(Ticket Granting Service)。
Ticket:一个记录,客户用它来向服务器证明自己的身份,包括客户标识,会话密钥,时间戳.
AS(Authentication Server):认证服务器, 为client生成TGT的服务。
TGS(Ticket Grantion Server): 许可证服务器, 为client生成某个服务的ticket
TGT(Ticket-grantion Ticket) : 用于获取ticket的票据
AD(Account Database): 存储所有client的白名单,只有存在于白名单的client才能顺利申请到ticket

三. Kerberos认证流程

Kerberos基础_第1张图片

(1)客户端执行kinit命令,输入Principal及Password,向AS证明身份,并请求获取TGT。
(2)AS检查Database中是否存有客户端输入的Principal,如有则向客户端返回TGT。
(3)客户端获取TGT后,向TGS请求ServerTicket。
(4)TGS收到请求,检查Database中是否存有客户端所请求服务的Principal,如有则向客户端返回ServerTicket。
(5)客户端收到ServerTicket,则向目标服务发起请求。
(6)目标服务收到请求,响应客户端。

四.Kerberos部署

4.1 概述

Cloudera提供了非常简便的Kerberos集成方式,基本做到了自动化部署。

系统:CentOS 7.3

操作用户:admin

角色分布如下:

角色 部署节点
KDC, AS, TGS,Kerberos Agent 192.168.0.200
Kerberos Agent 192.168.0.[201-202]

假设slaves文件如下:

192.168.0.201
192.168.0.202

4.3 Kerberos安装

在192.168.0.200上安装服务端:

yum -y install krb5-server openldap-clients

在192.168.0.[201-202]上安装客户端:

pssh -h slaves -P -l root -A "yum -y install krb5-devel krb5-workstation"

在安装完上述的软件之后,会在KDC主机上生成配置文件/etc/krb5.conf和/var/kerberos/krb5kdc/kdc.conf,它们分别反映了realm name 以及 domain-to-realm mappings。

4.4 修改配置

4.4.1 配置krb5.conf

/etc/krb5.conf: 包含Kerberos的配置信息。例如,KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = XICHUAN.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
  EXAMPLE.COM = {
   kdc = master01-dev
   admin_server = master01-dev
  }

[domain_realm]
  .example.com = XICHUAN.COM
  example.com = XICHUAN.COM

说明

[logging]:表示server端的日志的打印位置

[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置

  1. default_realm = EXAMPLE.COM 默认的realm,必须跟要配置的realm的名称一致。

  2. udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误

  3. ticket_lifetime 表明凭证生效的时限,一般为24小时。

  4. renew_lifetime 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败

[realms]:列举使用的realm。

  1. kdc:代表要kdc的位置。格式是 机器:端口

  2. admin_server: 代表admin的位置。格式是机器:端口

  3. default_domain:代表默认的域名

[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。

分发krb5.conf至所有client:

//这一步可以不需要,因为在Cloudera Manager中启用配置krb5.conf后,它会自动帮你部署到客户端。

pscp -h slaves krb5.conf /tmp
pssh -h slaves "cp /tmp/krb5.conf /etc"

4.4.2 配置kdc.conf

默认放在 /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 XICHUAN.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 aes256-cts 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 = 24h
  max_renewable_life = 7d
 }

说明:

XICHUAN.COM:是设定的realms。名字随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。
max_renewable_life = 8d 涉及到是否能进行ticket的renwe必须配置。
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,推荐不使用。
acl_file:标注了admin的用户权限。文件格式是:
Kerberos_principal permissions [target_principal][restrictions]支持通配符等。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。

4.4.3 配置kadm5.acl

修改服务端192.168.0.200上的配置文件/var/kerberos/krb5kdc/kadm5.acl,以允许具备匹配条件的admin用户进行远程登录权限:

*/[email protected] *

说明:

标注了admin的用户权限,需要用户自己创建。文件格式是:
Kerberos_principal permissions [target_principal][restrictions]
支持通配符等。最简单的写法是:
*/[email protected] *
代表名称匹配*/[email protected] 都认为是admin,权限是 * 代表全部权限。

4.5 创建Kerberos数据库

在192.168.0.200上对数据库进行初始化,默认的数据库路径为/var/kerberos/krb5kdc,如果需要重建数据库,将该目录下的principal相关的文件删除即可,请牢记数据库密码。

kdb5_util create -r XICHUAN.COM -s

说明:

[-s] 表示生成 stash file ,并在其中存储master server key(krb5kdc)
[-r] 来指定一个realm name , 当krb5.conf中定义了多个realm时使用
当 Kerberos database创建好之后,在 /var/kerberos/ 中可以看到生成的 principal相关文件

4.6 启动Kerberos服务

在192.168.0.200上执行:

#启动服务命令 
systemctl start krb5kdc 
systemctl start kadmin 

#加入开机启动项 
systemctl enable krb5kdc 
systemctl enable kadmin

查看进程:

[root@master01-dev ~]# netstat -anpl|grep kadmin
tcp        0      0 0.0.0.0:749             0.0.0.0:*               LISTEN      67465/kadmind       
tcp        0      0 0.0.0.0:464             0.0.0.0:*               LISTEN      67465/kadmind       
tcp6       0      0 :::749                  :::*                    LISTEN      67465/kadmind       
tcp6       0      0 :::464                  :::*                    LISTEN      67465/kadmind       
udp        0      0 0.0.0.0:464             0.0.0.0:*                           67465/kadmind       
udp6       0      0 :::464                  :::*                                67465/kadmind       
[root@master01-dev ~]# netstat -anpl|grep kdc
tcp        0      0 0.0.0.0:88              0.0.0.0:*               LISTEN      67402/krb5kdc       
tcp6       0      0 :::88                   :::*                    LISTEN      67402/krb5kdc       
udp        0      0 0.0.0.0:88              0.0.0.0:*                           67402/krb5kdc       
udp6       0      0 :::88                   :::*                                67402/krb5kdc  

4.7 创建Kerberos管理员principal

 #需要设置两次密码 
kadmin.local -q "addprinc root/admin"
#使用cloudera-scm/admin作为CM创建其它principals的超级用户
kadmin.local -q "addprinc cloudera-scm/admin"

principal的名字的第二部分是admin,那么根据之前配置的acl文件,该principal就拥有administrative privileges,这个账号将会被CDH用来生成其他用户/服务的principal。

注意需要先kinit保证已经有principal缓存。

[root@master01-dev ~]# kinit cloudera-scm/admin
Password for cloudera-scm/[email protected]: 
[root@master01-dev ~]# klist 
Ticket cache: KEYRING:persistent:0:0
Default principal: cloudera-scm/[email protected]

Valid starting       Expires              Service principal
09/01/2022 11:51:17  09/02/2017 11:51:16  krbtgt/[email protected]
	renew until 09/08/2022 11:51:16

Kerberos客户端支持两种,一是使用 principal + Password,二是使用 principal + keytab

principal + Password适合用户进行交互式应用,例如hadoop fs -ls这种,后者适合服务,例如yarn的rm、nm等。
principal + keytab就类似于ssh免密码登录,登录时不需要密码了。

五.Kerberos使用

5.1 Kerberos主体Principal介绍

在官网上有详细的介绍Principal的介绍,链接为:http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-user/What-is-a-Kerberos-Principal_003f.html

主体是Kerberos可以为其分配票证的唯一标识。主体可以具有任意数量的组件。每个组件都由一个组件分隔符(通常为 /)分隔。最后一个组成部分是领域,由领域分隔符(通常为@)与主体的其余部分分隔。如果主体中没有领域组件,则将假定主体在使用它的上下文中位于默认领域中

Principal的格式一般为:primary/instance@REALM

primary是Principal的一部分,如果是用户,则为用户名,如果是主机则为主机名。

instance是一个可选字符串,用于限定主服务器。该实例与主实例之间用斜杠(/)隔开。对于用户而言,该实例通常为null,但用户可能还具有一个附加的主体,即一个名为admin的实例,用该实例来管理数据库。主体[email protected]与主体root/[email protected]完全分开 ,具有单独的密码和单独的权限。对于主机,实例是标准主机名,例如 xichuan.com。

REALM是您的Kerberos领域。在大多数情况下,您的Kerberos域是您的域名,以大写字母表示。例如,机器daffodil.example.com就在领域中EXAMPLE.COM

5.2 Kerberos 命令使用

kadmin.local 与 kadmin区别:
kadmin.local:需要在 KDC server 上面操作,无需密码即可管理资料库
kadmin:可以在任何一台 KDC 领域的系统上面操作,但是需要输入管理员密码

5.2.1登陆kinit

kinit root/[email protected]

[root@node01 ~]# kinit root/[email protected]
Password for root/[email protected]: root
[root@node01 ~]# 

或者使用keytap登陆

kinit -kt /opt/xichuan.keytab xichuan/admin

[root@node01 ~]# kinit -kt /opt/xichuan.keytab xichuan/admin
[root@node01 ~]# 

5.2.2查询登陆状态klist

klist

[root@node01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/[email protected]

Valid starting       Expires              Service principal
10/26/2022 15:19:15  10/27/2022 15:19:15  krbtgt/[email protected]
	renew until 11/02/2022 15:19:15

5.2.3退出登陆kdestroy

kdestroy

[root@node01 ~]# kdestroy
[root@node01 ~]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)

5.2.4登录KDC后台 kadmin.local

kadmin.local

[root@node02 etc]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  

如果找不到kadmin.local命令,可以使用find / -name kadmin 来查找
一般的位置为:/usr/bin/kadmin

5.2.5查看用户列表 listprincs

listprincs

[root@node01 ~]# kadmin
Authenticating as principal root/[email protected] with password.
Password for root/[email protected]: 
kadmin:  listprincs
HTTP/[email protected]
HTTP/[email protected]
HTTP/[email protected]
K/[email protected]
cloudera-scm/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hive/[email protected]
httpfs/[email protected]
hue/[email protected]
impala/[email protected]
impala/[email protected]
impala/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kiprop/[email protected]
krbtgt/[email protected]
kudu/[email protected]
kudu/[email protected]
kudu/[email protected]
mapred/[email protected]
root/[email protected]
yarn/[email protected]
yarn/[email protected]
yarn/[email protected]
zookeeper/[email protected]
zookeeper/[email protected]
zookeeper/[email protected]
kadmin:  

5.2.6修改账号密码change_password

change_password root/[email protected]

[root@node01 ~]# kadmin
Authenticating as principal root/[email protected] with password.
Password for root/[email protected]: 
kadmin:  change_password root/[email protected]
Enter password for principal "root/[email protected]": root
Re-enter password for principal "root/[email protected]": root
Password for "root/[email protected]" changed.
kadmin: 

5.2.7创建用户addprinc

addprinc -pw root xichuan/admin #创建用户名hadoop用户,密码为123456

[root@node01 ~]# kadmin
Authenticating as principal root/[email protected] with password.
Password for root/[email protected]: root
kadmin:  addprinc -pw root xichuan/admin   #创建用户名hadoop用户,密码为123456 
WARNING: no policy specified for xichuan/[email protected]; defaulting to no policy
Principal "xichuan/[email protected]" created.


创建用户时,不带REALM时,使用默认的REALM

5.2.8删除用户delprinc

delete_principal test/admin

[root@node01 ~]# kadmin
Authenticating as principal root/[email protected] with password.
Password for root/[email protected]: root
kadmin:  delete_principal test/admin
Are you sure you want to delete the principal "test/[email protected]"? (yes/no): yes
Principal "test/[email protected]" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
kadmin:

5.2.9导出keytab文件

ktadd -k /opt/xichuan.keytab -norandkey xichuan/[email protected]

[root@node02 etc]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  ktadd -k /opt/xichuan.keytab -norandkey xichuan/[email protected]
Entry for principal xichuan/[email protected] with kvno 1, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type des3-cbc-sha1 added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type arcfour-hmac added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type camellia256-cts-cmac added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type camellia128-cts-cmac added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type des-hmac-sha1 added to keytab WRFILE:/opt/xichuan.keytab.
Entry for principal xichuan/[email protected] with kvno 1, encryption type des-cbc-md5 added to keytab WRFILE:/opt/xichuan.keytab.


-norandkey 表示密码不改变

默认导出的目录为当前目录,在kadmin.local命令上操作

5.2.10查看keytab文件中的用户列表

klist -ket /opt/xichuan.keytab

[root@node02 opt]#  klist -ket /opt/xichuan.keytab 
Keytab name: FILE:/opt/xichuan.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   1 10/26/2022 15:41:35 xichuan/[email protected] (aes256-cts-hmac-sha1-96) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (aes128-cts-hmac-sha1-96) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (des3-cbc-sha1) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (arcfour-hmac) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (camellia256-cts-cmac) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (camellia128-cts-cmac) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (des-hmac-sha1) 
   1 10/26/2022 15:41:35 xichuan/[email protected] (des-cbc-md5) 


5.2.11更新票据kinit

kinit -R

[root@node01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: xichuan/[email protected]

Valid starting       Expires              Service principal
10/26/2022 15:45:07  10/27/2022 15:45:07  krbtgt/[email protected]
	renew until 11/02/2022 15:45:07
[root@node01 ~]# kinit -R
[root@node01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: xichuan/[email protected]

Valid starting       Expires              Service principal
10/26/2022 15:45:54  10/27/2022 15:45:54  krbtgt/[email protected]
	renew until 11/02/2022 15:45:07


可以看到这两个Ticket的Expires时间不一样

5.2.12查看Ticket详细信息

getprinc xichuan/admin

[root@node01 ~]# kadmin
Authenticating as principal xichuan/[email protected] with password.
Password for xichuan/[email protected]: root
kadmin:  getprinc xichuan/admin
Principal: xichuan/[email protected]
Expiration date: [never]
Last password change: Wed Oct 26 15:24:39 CST 2022
Password expiration date: [never]
Maximum ticket life: 1 day 01:00:00
Maximum renewable life: 8 days 00:00:00
Last modified: Wed Oct 26 15:24:39 CST 2022 (root/[email protected])
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 1, aes256-cts-hmac-sha1-96
Key: vno 1, aes128-cts-hmac-sha1-96
Key: vno 1, des3-cbc-sha1
Key: vno 1, arcfour-hmac
Key: vno 1, camellia256-cts-cmac
Key: vno 1, camellia128-cts-cmac
Key: vno 1, des-hmac-sha1
Key: vno 1, des-cbc-md5
MKey: vno 1
Attributes:
Policy: [none]
kadmin:

你可能感兴趣的:(网络,服务器,php)