一. 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。
只有被认证过节点才能正常使用。企图冒充的节点由于没有事先得到的密钥信息,无法与集群内部的节点通信。防止了恶意的使用或篡改Hadoop集群的问题,确保了Hadoop集群的可靠安全。
四. Kerberos部署
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
2). 修改/etc/krb5.conf配置
vi /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]
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
*/[email protected] *
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/[email protected]’
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/[email protected]
输入: kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:
kadmin.local: addprinc admin/[email protected]
WARNING: no policy specified for admin/[email protected]; defaulting to no policy
Enter password for principal “admin/[email protected]”: 【输入密码为admin】
Re-enter password for principal “admin/[email protected]”:
Principal “admin/[email protected]” created.
kadmin.local:
7).将Kerberos服务添加到自启动服务,并启动krb5kdc和kadmin服务
systemctl enable krb5kdc
systemctl enable kadmin
systemctl start krb5kdc
systemctl start kadmin
8) .测试Kerberos的管理员账号
kinit admin/[email protected]
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/[email protected]
[root@dev01 ~]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local: addprinc cloudera-scm/[email protected]
WARNING: no policy specified for cloudera-scm/[email protected]; defaulting to no policy
Enter password for principal “cloudera-scm/[email protected]”: [密码:admin]
Re-enter password for principal “cloudera-scm/[email protected]”: [密码:admin]
Principal “cloudera-scm/[email protected]” created.
kadmin.local: list_principals
HTTP/[email protected]
HTTP/[email protected]
HTTP/[email protected]
K/[email protected]
admin/[email protected]
cloudera-scm/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hdfs/[email protected]
[email protected]
hive/[email protected]
hive/[email protected]
hue/[email protected]
hue/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kiprop/[email protected]
krbtgt/[email protected]
mapred/[email protected]
[email protected]
spark/[email protected]
yarn/[email protected]
yarn/[email protected]
yarn/[email protected]
zookeeper/[email protected]
zookeeper/[email protected]
zookeeper/[email protected]
2.进入Cloudera Manager的“管理”->“安全”界面
选择“启用Kerberos”,进入如下界面
不勾选“通过Cloudera Manager 管理krb5.conf”,否则会修改掉之前的配置。
启动之后,出现两个警告
点进去勾选上。
然后重启集群。
至此已成功启用Kerberos。
六. Kerberos安全环境使用
1.在集群启用Kerberos之后,用户访问各服务都需要先通过Kerberos认证。
在Kerberos服务端主机(cdh01)执行以下命令,并输入密码,完成注册
[root@hadoop1 ~]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local: addprinc [email protected]
WARNING: no policy specified for [email protected]; defaulting to no policy
Enter password for principal “[email protected]”:
Re-enter password for principal “[email protected]”:
Principal “[email protected]” created.
2.用户认证,执行以下命令,并输入密码,完成认证
kinit hdfs
[root@cdh01 ~]# kinit hdfs
Password for [email protected]:
[root@cdh01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]
Valid starting Expires Service principal
10/26/2021 14:48:34 10/27/2021 14:48:34 krbtgt/[email protected]
renew until 11/02/2021 14:48:34
[root@cdh01 ~]#
3.访问HDFS
认证前
认证后
kadmin.local -q “xst -k /path/to/your/keytab/hdfs.keytab [email protected]”
#生成密钥文件之后,密码失效,不想密码失效,加 '-norandkey’参数
通过keytab文件认证登录
kinit -kt /path/to/your/keytab/hdfs.keytab [email protected]
提交spark任务
spark-submit --keytab /path/to/your/keytab/hdfs.keytab --principal [email protected] --class cn.baidu.service.ApplicationMain ./codeConvert-etl-1.0-SNAPSHOT-jar-with-dependencies.jar
连接hive
beeline -u “jdbc:hive2://cdh03:10000/default;principal=hive/[email protected]”
5. 浏览器访问开启了kerberos的 Web UI
win10安装kerberos 客户端
下载地址: MIT Kerberos Distribution Page
拷贝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浏览器URL里输入:about:config
2).搜索network.negotiate-auth.trusted-uris, 配置值为域名cdh01,cdh02,cdh03
3).搜索network.auth.use-sspi,双击值改为false
重启浏览器就可以正常访问hdfs了