Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。
Kerberos中有以下一些概念需要了解:
1)KDC:密钥分发中心,负责管理发放票据,记录授权。
2)Realm:Kerberos管理领域的标识。
3)principal:当每添加一个用户或服务的时候都需要向kdc添加一条principal,principl的形式为:主名称/实例名@领域名。
4)主名称:主名称可以是用户名或服务名,表示是用于提供各种网络服务(如hdfs,yarn,hive)的主体。
5)实例名:实例名简单理解为主机名。
关于 Kerberos 更多的原理讲解可参考以下链接:
看完您如果还不明白 Kerberos 原理,算我输! - 腾讯云开发者社区-腾讯云
[root@m1 ~]# yum install -y krb5-server krb5-workstation krb5-libs
#查看结果
[root@m1~]# rpm -qa | grep krb5krb5-workstation-1.10.3-65.el6.x86_64
krb5-libs-1.10.3-65.el6.x86_64
krb5-server-1.10.3-65.el6.x86_64
[root@s1 ~]# yum install -y krb5-workstation krb5-libs
[root@s2 ~]# yum install -y krb5-workstation krb5-libs
#查看结果
[root@s1 ~]# rpm -qa | grep krb5
krb5-workstation-1.10.3-65.el6.x86_64
krb5-libs-1.10.3-65.el6.x86_64
需要配置的文件有两个为f和f , kdc配置只是需要Server服务节点配置,即m1
1) kdc配置
[root@m1 ~]#
[root@m1 ~]# vim /var/kerberos/f
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[realms]HADOOP.COM = {#master_key_type = aes256-ctsacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabmax_life = 1dmax_renewable_life = 7dsupported_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}
编辑
说明:
HADOOP.COM:realm名称,Kerberos支持多个realm,一般全用大写。
acl_file:admin的用户权。
admin_keytab:KDC进行校验的keytab。
supported_enctypes:支持的校验方式,注意把aes256-cts去掉,JAVA使用aes256-cts验证方式需要安装额外的jar包,所有这里不用。
2) krb5文件配置
[root@m1 ~]# vim /f
includedir /f.d/[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = /etc/pki/tls/default_realm = HADOOP.COM#default_ccache_name = KEYRING:persistent:%{uid}udp_preference_limit = 1
[realms]HADOOP.COM = {kdc = m1.testadmin_server = m1.test
}[domain_realm]
# .example = EXAMPLE.COM
# example = EXAMPLE.COM
编辑
说明:
default_realm:默认的realm,设置 Kerberos 应用程序的默认领域,必须跟要配置的realm的名称一致。
ticket_lifetime:表明凭证生效的时限,一般为24小时。
renew_lifetime : 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
udp_preference_limit= 1:禁止使用 udp,可以防止一个 Hadoop 中的错误。
realms:配置使用的 realm,如果有多个领域,只需向 [realms] 节添加其他的语句。
domain_realm:集群域名与Kerberos realm的映射关系,单个realm的情况下,可忽略。
3)同步krb5到Client节点
[root@m1 ~]#
[root@m1 ~]# xsync /f
在server节点执行
[root@m1 ~]# kdb5_util create -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'HADOOP.COM',
master key name 'K/M@HADOOP.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:(确认密码)
创建完成后/var/kerberos/krb5kdc目录下会生成对应的文件
[root@m1 ~]# ls /var/kerberos/krb5kdc/
kadm5.acl f principal principal.kadm5 principal.kadm5.lock principal.ok
[root@m1 ~]# vim /var/kerberos/krb5kdc/kadm5.acl
#修改为以下内容:
*/admin@HADOOP.COM *
说明:
*/admin:admin实例的全部主体
@HADOOP.COM:realm
*:全部权限
这个授权的意思:就是授予admin实例的全部主体对应HADOOP.COM领域的全部权限。也就是创建Kerberos主体的时候如果实例为admin,就具有HADOOP.COM领域的全部权限,比如创建如下的主体user1/admin就拥有全部的HADOOP.COM领域的权限。
启动krb5kdc
[root@m1 ~]# systemctl start krb5kdc
正在启动 Kerberos 5 KDC: [确定]#启动kadmin
[root@m1 ~]# systemctl start kadmin
正在启动 Kerberos 5 Admin Server: [确定]#设置开机自启
[root@m1 ~]# systemctl enable krb5kdc
#查看是否设置为开机自启
[root@node02 ~]# systemctl is-enabled krb5kdc[root@m1 ~]# systemctl enable kadmin
#查看是否设置为开机自启
[root@m1 ~]# systemctl is-enabled kadmin
注意:启动失败时可以通过/var/log/krb5kdc.log和/var/log/kadmind.log来查看。
root@m1 ~]# kadmin.local -q "addprinc admin/admin"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for admin/admin@HADOOP.COM; defaulting to no policy
Enter password for principal "admin/admin@HADOOP.COM": (输入密码)
Re-enter password for principal "admin/admin@HADOOP.COM": (确认密码)
Principal "admin/admin@HADOOP.COM" created.
[root@m1 ~]# kinit admin/admin
Password for admin/admin@HADOOP.COM: (输入密码)
[root@m1 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@HADOOP.COMValid starting Expires Service principal
08/27/19 14:41:39 08/28/19 14:41:39 krbtgt/HADOOP.COM@HADOOP.COMrenew until 08/27/19 14:41:39
出现以上admin/admin@HADOOP.COM说明没问题
在其他机器尝试:
[root@m1 ~]# kinit admin/admin
Password for admin/admin@HADOOP.COM: (输入密码)
[root@m1~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@HADOOP.COMValid starting Expires Service principal
08/27/19 14:41:39 08/28/19 14:41:39 krbtgt/HADOOP.COM@HADOOP.COMrenew until 08/27/19 14:41:39
如果出现:kadmin: GSS-API (or Kerberos) error while initializing kadmin interface,则重启ntp服务:
[root@m1 ~]# service ntpd restart
关闭 ntpd: [确定]
正在启动 ntpd:
1)本地登录(无需认证)
[root@m1 ~]# kadmin.local
Authenticating as principal root/admin@HADOOP.COM with password.
kadmin.local:
2)远程登录(需进行主体认证,先认证刚刚创建的管理员主体)
[root@s1 ~]# kadmin
Authenticating as principal admin/admin@HADOOP.COM with password.
Password for admin/admin@HADOOP.COM:
kadmin:
退出输入:exit
[root@m1 ~]# kadmin.local -q "addprinc aaa/aaa"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for aaa/aaa@HADOOP.COM; defaulting to no policy
Enter password for principal "aaa/aaa@HADOOP.COM": (输入密码)
Re-enter password for principal "aaa/aaa@HADOOP.COM": (输入密码)
Principal "admin/admin@HADOOP.COM" created.
[root@m1 ~]# kadmin.local -q "cpw aaa/aaa"
Authenticating as principal root/admin@HADOOP.COM with password.
Enter password for principal "aaa/aaa@HADOOP.COM": (输入密码)
Re-enter password for principal "aaa/aaa@HADOOP.COM": (输入密码)
Password for "aaa/aaa@HADOOP.COM" changed.
[root@m1 ~]# kadmin.local -q "list_principals"
Authenticating as principal root/admin@HADOOP.COM with password.
K/M@HADOOP.COM
[admin/admin@HADOOP.COM](mailto:admin/admin@HADOOP.COM)
aaa/aaa@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
kadmin/hadoop105@HADOOP.COM
kiprop/hadoop105@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
Kerberos提供了两种认证方式,一种是通过输入密码认证,另一种是通过keytab密钥文件认证,但两种方式不可同时使用。
1)使用kinit进行主体认证
[root@m1 ~]# kinit aaa/aaa
Password for admin/admin@HADOOP.COM:
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: aaa/aaa@HADOOP.COM
Valid starting Expires Service principal
10/27/2019 18:23:57 10/28/2019 18:23:57 krbtgt/HADOOP.COM@HADOOP.COMrenew until 11/03/2019 18:23:57
2)查看认证凭证
[root@m1 ~]# klist Ticket cache: FILE:/tmp/krb5cc_0
Default principal: aaa/aaa@HADOOP.COM
Valid starting Expires Service principal
10/27/2019 18:23:57 10/28/2019 18:23:57 krbtgt/HADOOP.COM@HADOOP.COMrenew until 11/03/2019 18:23:57
1)生成主体admin/admin的keytab文件到指定目录/root/admin.keytab
[root@m1 ~]# kadmin.local -q "xst -k /root/aaa.keytab aaa/aaa@HADOOP.COM"
2)使用keytab进行认证
[root@m1 ~]# kinit -kt /root/aaa.keytab aaa/aaa
3)查看认证凭证
[root@m1 ~]# klist Ticket cache: FILE:/tmp/krb5cc_0
Default principal: aaa/aaa@HADOOP.COM
Valid starting Expires Service principal
08/27/19 15:41:28 08/28/19 15:41:28 krbtgt/HADOOP.COM@HADOOP.COM
renew until 08/27/19 15:41:28
[root@m1 ~]# kdestroy
[root@m1 ~]# klist klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
[root@m1 ~]# kadmin.local -q "addprinc cloudera-scm/admin"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for cloudera-scm/admin @HADOOP.COM; defaulting to no policy
Enter password for principal " cloudera-scm/admin @HADOOP.COM": (输入密码)
Re-enter password for principal " cloudera-scm/admin @HADOOP.COM": (确认密码)
Principal " cloudera-scm/admin @HADOOP.COM" created.
Kerberos 加密类型:aes128-cts、des3-hmac-sha1、arcfour-hmac
根据你自己的实际情况填写 比如我下面主机这两个框这就填的m1.test
5.5 继续
5.6 填写主体名和密码
5.7 等待导入KDC
5.8 准备重启集群
5.9 等待完成
5.10 查看主体
[root@m1 ~]# kadmin.local -q "list_principals"
Authenticating as principal cloudera-scm/admin@HADOOP.COM with password.
HTTP/m1@HADOOP.COM
HTTP/hadoop103@HADOOP.COM
HTTP/hadoop104@HADOOP.COM
K/M@HADOOP.COM
admin/admin@HADOOP.COM
aaa@HADOOP.COM
cloudera-scm/admin@HADOOP.COM
hdfs/m1@HADOOP.COM
hdfs/hadoop103@HADOOP.COM
hdfs/hadoop104@HADOOP.COM
hive/m1@HADOOP.COM
hue/m1@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
kadmin/m1@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
mapred/m1@HADOOP.COM
oozie/m1@HADOOP.COM
sentry/m1@HADOOP.COM
yarn/m1@HADOOP.COM
yarn/hadoop103@HADOOP.COM
yarn/hadoop104@HADOOP.COM
zookeeper/m1@HADOOP.COM
zookeeper/hadoop103@HADOOP.COM
zookeeper/hadoop104@HADOOP.COM
在启用Kerberos之后,系统与系统(flume-kafka)之间的通讯,以及用户与系统(user-hdfs)之间的通讯都需要先进行安全认证,认证通过之后方可进行通讯。
故在启用Kerberos后,数仓中使用的脚本等,均需要加入一步安全认证的操作,才能正常工作。
开启Kerberos安全认证之后,日常的访问服务(例如访问HDFS,消费Kafka topic等)都需要先进行安全认证
1)在Kerberos数据库中创建用户主体/实例
[root@m1 ~]# kadmin.local -q "addprinc hive/hive@HADOOP.COM"
2)进行用户认证
[root@m1 ~]# kinit hive/hive@HADOOP.COM
3)访问HDFS
[root@m1 ~]# hadoop fs -ls /
Found 4 itemsdrwxr-xr-x - hive hive 0 2019-10-02 01:29 /origin_data
drwxrwxrwt - hdfs supergroup 0 2019-10-03 00:20 /tmp
drwxr-xr-x - hdfs supergroup 0 2019-10-02 01:35 /user
drwxr-xr-x - hive hive 0 2019-10-02 01:38 /warehouse
4)hive查询
[root@m1 ~]# hive
WARNING: Use "yarn jar" to launch YARN applications.Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-6.2.1-1.cdh6.2.1.p0.1425774/jars/hive-common-2.1.1-cdh6.2.1.jar!/hive-log4j2.properties Async: falseWARNING: Hive CLI is deprecated and migration to Beeline is recommended.hive>
5)HDFS WebUI浏览器认证
我们设置CDH支持kerberos后会出现下图所示的情况:
可以登录9870,但是不能查看目录及文件,这是由于我们本地环境没有通过认证。
接下来我们设置本地验证。
注意:由于浏览器限制问题,我们这里使用火狐浏览器,其他如:谷歌,ie等均会出现问题。
(1) 下载火狐
(2)设置浏览器
1 打开火狐浏览器,在地址栏输入:about:config,进入设置页面。
2 搜索“usted-uris”,修改值为自己的服务器主机名。
3搜索“network.auth.use-sspi”,双击将值变为false。
(3)安装kfw
1.安装kfw-4.1-amd64.msi。
2.将集群的/f文件的内容复制到C:ProgramDataMITKerberos5krb.ini中,删除和路径相关的配置。
[logging][libdefaults]default_realm = HADOOP.COMdns_lookup_realm = falsedns_lookup_kdc = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = trueudp_preference_limit = 1[realms]HADOOP.COM = {kdc = m1.testadmin_server = m1.test}[domain_realm]
3打开MIT,输入主体名和密码:
4)测试
(1)生成hive用户的keytab文件
用户认证的方式有“输入密码”和“使用keytab密钥文件”两种方式,此处需使用keytab密钥文件进行认证。
[root@m1 hive]# kadmin.local -q “xst -k /var/lib/hive/hive.keytab hive/hive@HADOOP.COM”
(2)增加读权限
chmod +r /var/lib/hive/hive.keytab
(3)分发keytab文件
xsync /var/lib/hive/hive.keytab
(4)sqoop_import.sh
#!/bin/bash
kinit -kt /var/lib/hive/hive.keytab hive/hive
# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
if [ -n "$2" ] ;thendo_date=$2
else do_date=`date -d "-1 day" +%F`
fi
echo "===日志日期为 $do_date==="import_ec_data_daily() {
sqoop import
--connect jdbc:mysql://10.73.129.169:3306/ecdata
--username admin_user
--password Tcladmin#20170104
--hive-drop-import-delims
--target-dir /origin_data/db_mall/$1/$do_date
--delete-target-dir
--null-string '\N'
--null-non-string '\N'
--compress
--compression-codec lzop
--num-mappers 1
--fields-terminated-by "