分享

CDH6.3.2之Kerberos安全认证(二)

本帖最后由 levycui 于 2020-11-10 20:15 编辑
问题导读:
1、Kerberos认证原理是什么?
2、Kerberos如何部署?
3、CDH集群如何启用Kerberos?
4、如何在Kerberos安全环境使用HFDS?

上一篇:CDH6.3.2实战1:安装与配置

01 PART
Kerberos简介


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

      本篇就介绍如何在CDH集群中开启Kerberos安全认证,让Kerberos为集群数据安全保驾护航。

02 PART
Kerberos认证原理


2020-11-10_200617.jpg

1.基本概概念

KDC:Key Distribute Center,密钥分发中心,其中包含认证服务器,票证授权服务器,和数据库
AS:AuthenticationServer,认证服务器
TGS:TicketGranting Server,票证授权服务器
TGT:Ticket Granting Ticket1票证授予票证
Principal:主体,用于在kerberos加密系统中标记一个唯一的身份。主体可以是用户(如zhangsan)或服务(如namenode或hive)。

2.认证流程

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


03 PART
Kerberos部署


1.安装Kerberos相关服务

       选择集群中的一台主机(hadoop102.example.com)作为Kerberos服务端,安装KDC,所有主机都需要部署Kerberos客户端。

服务端主机执行以下安装命令
  1. yum install -y krb5-server krb5-workstation krb5-libs
复制代码

客户端主机执行以下安装命令
  1. yum install -y krb5-workstation krb5-libs
复制代码

2.修改配置文件

(1)服务端主机(hadoop102.example.com)

修改/var/kerberos/krb5kdc/kdc.conf文件,内容如下
  1. [kdcdefaults]
  2. kdc_ports = 88
  3. kdc_tcp_ports = 88
  4. [realms]
  5. EXAMPLE.COM = {
  6.   #master_key_type = aes256-cts
  7.   acl_file = /var/kerberos/krb5kdc/kadm5.acl
  8.   dict_file = /usr/share/dict/words
  9.   max_life = 1d
  10.   max_renewable_life = 7d
  11.   admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  12.   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
  13. }
复制代码

(2)客户端主机(所有主机)

修改/etc/krb5.conf文件,内容如下
  1. # Configuration snippets may be placed in this directory as well
  2. includedir /etc/krb5.conf.d/
  3. [logging]
  4. default = FILE:/var/log/krb5libs.log
  5. kdc = FILE:/var/log/krb5kdc.log
  6. admin_server = FILE:/var/log/kadmind.log
  7. [libdefaults]
  8. dns_lookup_realm = false
  9. ticket_lifetime = 24h
  10. renew_lifetime = 7d
  11. forwardable = true
  12. rdns = false
  13. pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
  14. default_realm = EXAMPLE.COM
  15. #default_ccache_name = KEYRING:persistent:%{uid}
  16. udp_preference_limit = 1
  17. [realms]
  18. EXAMPLE.COM = {
  19.   kdc = hadoop102.example.com
  20.   admin_server = hadoop102.example.com
  21. }
  22. [domain_realm]
  23. .example.com = EXAMPLE.COM
  24. # example.com = EXAMPLE.COM
复制代码

3.初始化KDC数据库

在服务端主机(hadoop102.example.com)执行以下命令

  1. kdb5_utilcreate -s
复制代码

4.修改管理员权限配置文件

在服务端主机(hadoop102.example.com)修改/var/kerberos/krb5kdc/kadm5.acl文件,内容如下

  1. */admin@EXAMPLE.COM     *
复制代码

5.启动Kerberos相关服务

启动KDC

  1. systemctl start krb5kdc
复制代码

启动Kadmin,该服务为KDC数据库访问入口

  1. systemctl start kadmin
复制代码


04PART
CDH集群启用Kerberos


1.为CM创建Kerberos管理员主体

  1. kadmin.local -q "addprinc cloudera-scm/admin"
复制代码

2.启用Kerberos
2020-11-10_201057.jpg

3.环境确认(勾选全部)
2020-11-10_201349.jpg

4.填写KDC配置
2020-11-10_201423.jpg

5.继续
2020-11-10_201450.jpg
6.填写主体名和密码
2020-11-10_201519.jpg
7.等待导入KDC
2020-11-10_201619.jpg
8.重启集群
2020-11-10_201619.jpg
9.完毕


05 PART
Kerberos安全环境使用


在集群启用Kerberos之后,用户访问各服务都需要先通过Kerberos认证。下面通过访问HFDS,Hive演示具体操作方式。

1.为用户向Kerberos注册账号(Principal)

在Kerberos服务端主机(hadoop102.example.com)执行以下命令,并输入密码,完成注册
  1. kadmin.local -q "addprinc hdfs/hdfs@EXAMPLE.COM"
复制代码

2.用户认证,执行以下命令,并输入密码,完成认证
  1. kinit hdfs/hdfs@EXAMPLE.COM
复制代码

查看当前认证状态

$ klist
  1. Ticket cache: FILE:/tmp/krb5cc_0
  2. Default principal: hdfs/hdfs@EXAMPLE.COM
  3. Valid starting       Expires              Service principal
  4. 11/05/2020 14:29:23  11/06/2020 14:29:23  krbtgt/EXAMPLE.COM@EXAMPLE.COM
  5.   renew until 11/12/2020 14:29:23
复制代码

注:如需在非交互环境认证,例如在代码中认证,则可通过以下命令生成密钥文件,在代码中指定密钥文件路径即可。需要注意的是,生成密钥文件之后,密码随之失效。
  1. kadmin.local -q "xst -k /path/to/your/keytab/admin.keytab hdfs/hdfs@EXAMPLE.COM"
复制代码

3.访问HDFS

认证前
  1. $ hadoop fs -ls /
  2. 20/11/05 14:28:28 WARN ipc.Client: Exception encountered while connecting to the server : org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]
  3. ls: Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: "hadoop102.example.com/172.26.131.1"; destination host is: "hadoop102.example.com":8020;
复制代码

认证后
  1. $ hadoop fs -ls /
  2. Found 2 items
  3. drwxrwxrwt   - hdfs    supergroup          0 2020-11-02 15:52 /tmp
  4. drwxr-xr-x   - hdfs    supergroup          0 2020-11-03 09:23 /user
复制代码

4.访问Hive

(1)hive客户端

认证前
  1. $ hive
  2. Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: "hadoop102.example.com/172.26.131.1"; destination host is: "hadoop102.example.com":8020;
  3.   at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:604)
  4.   at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:545)
复制代码

认证后
  1. $ hive
  2. WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
  3. hive>
复制代码

(2)beeline客户端

注:开启Kerberos之后,jdbc的url需增加hiveserver2的principal信息,如下

认证前
  1. $ beeline -u " jdbc:hive2://hadoop102.example.com:10000/;principal=hive/hadoop102.example.com@EXAMPLE.COM"
  2. Connecting to jdbc:hive2://hadoop102.example.com:10000/;principal=hive/hadoop102.example.com@EXAMPLE.COM
  3. 20/11/05 14:42:57 [main]: ERROR transport.TSaslTransport: SASL negotiation failure
  4. javax.security.sasl.SaslException: GSS initiate failed
  5.   at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211) ~[?:1.8.0_181]
复制代码

认证后
  1. $ beeline -u " jdbc:hive2://hadoop102.example.com:10000/;principal=hive/hadoop102.example.com@EXAMPLE.COM"
  2. Connecting to jdbc:hive2://hadoop102.example.com:10000/;principal=hive/hadoop102.example.com@EXAMPLE.COM
  3. Connected to: Apache Hive (version 2.1.1-cdh6.3.2)
  4. Driver: Hive JDBC (version 2.1.1-cdh6.3.2)
  5. Transaction isolation: TRANSACTION_REPEATABLE_READ
  6. Beeline version 2.1.1-cdh6.3.2 by Apache Hive
  7. 0: jdbc:hive2://hadoop102.example.com:10000/>
复制代码

作者:暗送秋波
来源:https://mp.weixin.qq.com/s/s4Iw8egQGor2rw9poB6ahw

最新经典文章,欢迎关注公众号

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条