CDH6.3.2 启用Kerberos 认证

一. Kerberos概述
强大的身份验证和建立用户身份是Hadoop安全访问的基础。用户需要能够可靠地“识别”自己,然后在整个Hadoop集群中传播该身份。完成此操作后,这些用户可以访问资源(例如文件或目录)或与集群交互(如运行MapReduce作业)。除了用户之外,Hadoop集群资源本身(例如主机和服务)需要相互进行身份验证,以避免潜在的恶意系统或守护程序“冒充”受信任的集群组件来获取数据访问权限。

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

它知道的用户和服务(称为主体)及其各自的Kerberos密码的数据库

一个认证服务器(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(安全个体):被认证的个体,有一个名字和口令.(客户端或者服务端)
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认证流程

client向kerberos服务请求,希望获取访问server的权限。kerberos得到了这个消息,首先得判断client是否是可信赖的,也就是白名单黑名单的说法。通过AD中存储的黑名单和白名单来判断client。成功后,AS返回TGT给client。
2. client得到了TGT后,继续向kerberos请求,希望获取访问server的权限。kerberos得到了这个消息,这时候通过client消息中的TGT,判断出了client拥有了这个权限,给了client访问server的权限ticket。

  1. client得到ticket后,终于可以成功访问server。这个ticket只是针对这个server,其他server需要重新申请。

只有被认证过节点才能正常使用。企图冒充的节点由于没有事先得到的密钥信息,无法与集群内部的节点通信。防止了恶意的使用或篡改Hadoop集群的问题,确保了Hadoop集群的可靠安全。

四. Kerberos部署

  1. 系统环境
    1.操作系统:CentOS Linux release 7.9.2009

2.CDH6.3.2

3.采用root用户进行操作
2. KDC服务安装及配置
1). 在Cloudera Manager服务器上安装KDC服务

yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation openldap-clients -y

会生成/etc/krb5.conf、/var/kerberos/krb5kdc/kadm5.acl、/var/kerberos/krb5kdc/kdc.conf三个文件。

2). 修改/etc/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 = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = JHT.COM
#default_ccache_name = KEYRING:persistent:%{uid}

[realms]
JHT.COM = {
kdc = cdh01
admin_server = cdh01
}

[domain_realm]
.jht.com = JHT.COM
jht.com = JHT.COM
第一部分是logging配置, 略过。 然后是libdefaults部分:

default_realm: 默认realm,例如当我们使用kinit而不指定principal时使用的就是这里配置的默认realm

dns_lookup_realm:是否可以通过DNS查找使用什么样的realm

ticket_lifetime: 设定ticket的有效期

forwardable: 用于指定ticket是否可以被转发,转发的含义是:如果一个用户已经有了一个TGT,当他登入到另一个远程系统,KDC会为他自动重新创建一个TGT,而不需要让用户重新进行身份认证

然后是[realms]部分,这一部分会列出所有的realm,kdc和admin_server两个配置是在告诉客户端哪台服务器在运行KDC以及kadmin进程。这两项配置可以在服务器上追加端口,如果不指定,则使用默认端口,KDC是88,admin server是749.

最后一部分[domain_realm]是配置DNS名称和Kerberos Realm映射的。 .http://jht.com = JHT.COM是在说:所有在jht.com域下的主机都会被映射到JHT.COM这个realm下,而jht.com = JHT.COM是说jht.com它自己也会映射到JHT.COM这个realm。

3). 修改/var/kerberos/krb5kdc/kadm5.acl配置

vim /var/kerberos/krb5kdc/kadm5.acl

*/admin@JHT.COM *
4). 修改/var/kerberos/krb5kdc/kdc.conf配置

vim /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
JHT.COM = {
#master_key_type = aes256-cts
max_renewable_life= 7d 0h 0m 0s
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
}
5). 创建Kerberos数据库

kdb5_util create –r http://JHT.COM -s

Loading random data
Initializing database ‘/var/kerberos/krb5kdc/principal’ for realm ‘JHT.COM’,
master key name ‘K/M@JHT.COM’
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:【输入密码为hadoop】
Re-enter KDC database master key to verify:【输入密码为hadoop】
此处需要输入Kerberos数据库的密码,设置为hadoop。

6). 创建Kerberos的管理账号

admin/admin@JHT.COM

输入: kadmin.local

Authenticating as principal root/admin@JHT.COM with password.
kadmin.local:
kadmin.local: addprinc admin/admin@JHT.COM
WARNING: no policy specified for admin/admin@JHT.COM; defaulting to no policy
Enter password for principal “admin/admin@JHT.COM”: 【输入密码为admin】
Re-enter password for principal “admin/admin@JHT.COM”:
Principal “admin/admin@JHT.COM” created.
kadmin.local:
7).将Kerberos服务添加到自启动服务,并启动krb5kdc和kadmin服务

systemctl enable krb5kdc
systemctl enable kadmin
systemctl start krb5kdc
systemctl start kadmin
8) .测试Kerberos的管理员账号

kinit admin/admin@JHT.COM

  1. .为集群安装所有Kerberos客户端,包括Cloudera Manager

yum -y install krb5-libs krb5-workstation
10).将KDC Server上的krb5.conf文件拷贝到所有Kerberos客户端

scp /etc/krb5.conf root@cdh02:/etc/
scp /etc/krb5.conf root@cdh03:/etc/
五. CDH集群启用Kerberos
1.在KDC中给Cloudera Manager添加管理员账号
cloudera-scm/admin@JHT.COM

[root@dev01 ~]# kadmin.local
Authenticating as principal root/admin@JHT.COM with password.
kadmin.local: addprinc cloudera-scm/admin@JHT.COM
WARNING: no policy specified for cloudera-scm/admin@JHT.COM; defaulting to no policy
Enter password for principal “cloudera-scm/admin@JHT.COM”: [密码:admin]
Re-enter password for principal “cloudera-scm/admin@JHT.COM”: [密码:admin]
Principal “cloudera-scm/admin@JHT.COM” created.
kadmin.local: list_principals
HTTP/cdh01@JHT.COM
HTTP/cdh02@JHT.COM
HTTP/cdh03@JHT.COM
K/M@JHT.COM
admin/admin@JHT.COM
cloudera-scm/admin@JHT.COM
hdfs/cdh01@JHT.COM
hdfs/cdh02@JHT.COM
hdfs/cdh03@JHT.COM
hdfs@JHT.COM
hive/cdh01@JHT.COM
hive/cdh03@JHT.COM
hue/cdh02@JHT.COM
hue/cdh03@JHT.COM
kadmin/admin@JHT.COM
kadmin/cdh01@JHT.COM
kadmin/changepw@JHT.COM
kiprop/cdh01@JHT.COM
krbtgt/JHT.COM@JHT.COM
mapred/cdh03@JHT.COM
service@JHT.COM
spark/cdh02@JHT.COM
yarn/cdh01@JHT.COM
yarn/cdh02@JHT.COM
yarn/cdh03@JHT.COM
zookeeper/cdh01@JHT.COM
zookeeper/cdh02@JHT.COM
zookeeper/cdh03@JHT.COM
2.进入Cloudera Manager的“管理”->“安全”界面
选择“启用Kerberos”,进入如下界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

不勾选“通过Cloudera Manager 管理krb5.conf”,否则会修改掉之前的配置。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下面是我完成后的配置
在这里插入图片描述

启动之后,出现两个警告

在这里插入图片描述

点进去勾选上。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

点进去勾选上。

在这里插入图片描述

然后重启集群。

至此已成功启用Kerberos。

六. Kerberos安全环境使用
1.在集群启用Kerberos之后,用户访问各服务都需要先通过Kerberos认证。
在Kerberos服务端主机(cdh01)执行以下命令,并输入密码,完成注册

[root@hadoop1 ~]# kadmin.local
Authenticating as principal root/admin@JHT.COM with password.
kadmin.local: addprinc hdfs@JHT.COM
WARNING: no policy specified for hdfs@JHT.COM; defaulting to no policy
Enter password for principal “hdfs@JHT.COM”:
Re-enter password for principal “hdfs@JHT.COM”:
Principal “hdfs@JHT.COM” created.
2.用户认证,执行以下命令,并输入密码,完成认证
kinit hdfs

[root@cdh01 ~]# kinit hdfs
Password for hdfs@JHT.COM:

[root@cdh01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: hdfs@JHT.COM

Valid starting Expires Service principal
10/26/2021 14:48:34 10/27/2021 14:48:34 krbtgt/JHT.COM@JHT.COM
renew until 11/02/2021 14:48:34
[root@cdh01 ~]#
3.访问HDFS
认证前
在这里插入图片描述

认证后

在这里插入图片描述

  1. 非交互环境认证
    例如在代码中认证,则可通过以下命令生成密钥文件,在代码中指定密钥文件路径即可。

kadmin.local -q “xst -k /path/to/your/keytab/hdfs.keytab hdfs@JHT.COM”
#生成密钥文件之后,密码失效,不想密码失效,加 '-norandkey’参数

通过keytab文件认证登录

kinit -kt /path/to/your/keytab/hdfs.keytab hdfs@JHT.COM
提交spark任务

spark-submit --keytab /path/to/your/keytab/hdfs.keytab --principal hdfs@JHT.COM --class cn.baidu.service.ApplicationMain ./codeConvert-etl-1.0-SNAPSHOT-jar-with-dependencies.jar
连接hive

beeline -u “jdbc:hive2://cdh03:10000/default;principal=hive/cdh03@JHT.COM”
5. 浏览器访问开启了kerberos的 Web UI
win10安装kerberos 客户端
下载地址: MIT Kerberos Distribution Page
在这里插入图片描述

  1. 双击安装,默认下一步,选择typical,install。
    在这里插入图片描述

  2. 配置C:\ProgramData\MIT\Kerberos5\krb5.ini文件

拷贝centos7 /etc/krb5.conf 中的内容,[logging]部分不要:

[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = JHT.COM
#default_ccache_name = KEYRING:persistent:%{uid}

[realms]
JHT.COM = {
kdc = cdh01
admin_server = cdh01
}

[domain_realm]
.jht.com = JHT.COM
jht.com = JHT.COM
.cdh01 = JHT.COM
cdh01 = JHT.COM
4 配置完成后,启动MIT Kerberos客户端

输入centos 7上创建的用户,可以看到获取的Ticket。
在这里插入图片描述

  1. firefox浏览器配置

1).在Firefox浏览器URL里输入:about:config

2).搜索network.negotiate-auth.trusted-uris, 配置值为域名cdh01,cdh02,cdh03
在这里插入图片描述

3).搜索network.auth.use-sspi,双击值改为false
在这里插入图片描述

重启浏览器就可以正常访问hdfs了

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值