CDH6集群开启Kerberos认证

发布时间 2023-06-02 16:12:25作者: 潇湘神剑

一、部署Kerberos服务端

  Kerberos(也称为“GSSAPI”)是一种身份验证协议,用于在分布式计算环境中提供安全的身份验证和授权服务。它是由MIT开发的,并于1987年首次发布。Kerberos是一种基于X.509的认证协议,它使用TGS(Ticket Granting Service)来协调身份验证和授权过程。TGS是一种中间代理服务器,它负责协调Kerberos认证过程中的各个服务器。Kerberos可以在多个计算机系统之间提供安全的认证和授权服务,这些计算机系统可以运行在同一台主机上,也可以运行在不同的主机上。
Kerberos有以下特点:
  可靠性高:Kerberos使用了分布式存储和认证,可以在多个计算机系统之间提供高可用性和容错能力。
  安全性高:Kerberos使用了TLS(Transport Layer Security)来加密通信,并使用了SMTP(Simple Mail Transfer Protocol)等协议来进行身份验证和授权。
  灵活性高:Kerberos支持多种认证和授权模式,包括单点登录、集中认证和授权等。
  可扩展性高:Kerberos可以在多个计算机系统之间扩展,并支持分布式架构。

1、部署软件

CentOS 7:
  服务端:
    yum install krb5-server krb5-libs krb5-workstation -y
  客户端:
    yum install krb5-devel krb5-workstation -y

2、配置krb5.conf文件

vim /etc/krb5.conf
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]
 default_realm = KRBCDH.COM  # Kerberos应用程序的默认领域,所有的principal都将带有这个领域标志。可以自定义
 dns_lookup_kdc = false 
 dns_lookup_realm = false
 ticket_lifetime = 24h  # 表明凭证生效的时限,一般为24小时。
 renew_lifetime = 7d  # 表明凭证最长可以被延期的时限,一般为一个星期。当凭证过期之后,对安全认证的服务的后续访问则会失败。
 forwardable = true
# rdns = false
# pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
# default_realm = EXAMPLE.COM
# default_ccache_name = KEYRING:persistent:%{uid}

# 列举使用的realm
[realms]
 KRBCDH.COM = {
  kdc = cdh-master  # 表示kdc的位置,一般为服务器主机名
  admin_server = cdh-master  # 表示admin的位置,一般为服务器主机名
 }

# 域名到realm的关系
[domain_realm]
 .krbcdh.com = KRBCDH.COM
 krbcdh.com = KRBCDH.COM

3、配置kdc.conf文件

vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 KRBCDH.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
 }

"""
配置说明:
[realms]:realms的配置 
  KRBCDH.COM:设定的realms领域
  master_key_type:默认使用 aes256-cts。JAVA 使用 aes256-cts 验证方式需要去官网下载jce_policy-8.zip包,解压后会有两个jar包,找到$JAVA_HOME下跟它同名的两个jar包的位置,将其替换掉。
  acl_file:标注了 admin 的用户权限,文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
  supported_enctypes:支持的校验方式
  admin_keytab:KDC 进行校验的 keytab
"""

4、同步配置文件到其他客户端主机

[root@cdh-master etc]# scp krb5.conf root@cdh-node1:/etc/
krb5.conf                                                                                                  
[root@cdh-master etc]# scp krb5.conf root@cdh-node2:/etc/
krb5.conf

5、初始化KDC数据库

[root@cdh-master ~]# kdb5_util create -r KRBCDH.COM -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'KRBCDH.COM',
master key name 'K/M@KRBCDH.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:

# 这步需要自定义一个kdc数据库的密码。

6、创建KDC数据库的管理员账户

[root@cdh-master ~]# kadmin.local -q "addprinc admin/admin"
Authenticating as principal root/admin@KRBCDH.COM with password.
WARNING: no policy specified for admin/admin@KRBCDH.COM; defaulting to no policy
Enter password for principal "admin/admin@KRBCDH.COM":
Re-enter password for principal "admin/admin@KRBCDH.COM":
Principal "admin/admin@KRBCDH.COM" created.
# 这步需要自定义管理员的密码。

7、为KDC数据库管理员设置ACL权限

vim /var/kerberos/krb5kdc/kadm5.acl
*/admin@KRBCDH.COM	*

8、启动Kerberos服务

systemctl krb5kdc start
systemctl kadmin start 
systemctl enable krb5kdc 
systemctl enable kadmin

9、kerberos的日常操作

登录Kerberos: kadmin.local
查看已存在凭据:list_principals, listprincs, get_principals, getprincs
添加凭据:add_principal, addprinc, ank
修改凭据密码:change_password, cpw
删除凭据:delete_principal, delprinc
认证用户:kinit
查看当前认证用户:klist
删除当前认证的缓存:kdestroy
查看帮助信息:?

二、在CDH集群启用Kerberos

1、在KDC server上创建cloudera管理凭证

[root@cdh-master ~]# kadmin.local -q "addprinc cloudera-scm/admin@KRBCDH.COM"
Authenticating as principal root/admin@KRBCDH.COM with password.
WARNING: no policy specified for cloudera-scm/admin@KRBCDH.COM; defaulting to no policy
Enter password for principal "cloudera-scm/admin@KRBCDH.COM":
Re-enter password for principal "cloudera-scm/admin@KRBCDH.COM":
Principal "cloudera-scm/admin@KRBCDH.COM" created.

# 给clouder-scm/admin设置一个密码,记住这个密码,等会要用。

2、通过Cloudera Manager启用Kerveros

 三、通过认证来操作hdfs

1、未创建操作凭证时的现象

[root@cdh-master ~]# hdfs dfs -ls hdfs://cdh-master:8020/
23/06/01 10:19:16 WARN ipc.Client: Exception encountered while connecting to the server : org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]
ls: Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: "cdh-master/192.168.80.107"; destination host is: "cdh-master":8020;

2、在Kerberos服务器上创建访问凭证

[root@cdh-master ~]# kadmin.local -q "addprinc -randkey zhang/cdh-master@KRBCDH.COM"

3、创建认证凭证文件

[root@cdh-master ~]# kadmin.local -q "xst -k hdfs.keytab zhang/cdh-master@KRBCDH.COM"
# 会在当前目录下生成一个叫hdfs.keytab的文件,

4、通过凭证验证

[root@cdh-master ~]# kinit -k -t hdfs.keytab zhang/cdh-master@KRBCDH.COM
[root@cdh-master ~]# klist  # 查看验证信息
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: zhang/cdh-master@KRBCDH.COM

Valid starting       Expires              Service principal
06/02/2023 09:13:45  06/03/2023 09:13:45  krbtgt/KRBCDH.COM@KRBCDH.COM

5、再次操作hdfs

[root@cdh-master ~]# hdfs dfs -ls hdfs://cdh-master:8020/
Found 3 items
drwxr-xr-x   - zhang supergroup          0 2023-06-02 14:01 hdfs://cdh-master:8020/nginx
drwxrwxrwt   - hdfs supergroup          0 2023-06-02 10:04 hdfs://cdh-master:8020/tmp
drwxr-xr-x   - hdfs supergroup          0 2023-06-02 14:20 hdfs://cdh-master:8020/user

# 认证成功