微信公众号:大数据开发运维架构
关注可了解更多大数据相关的资讯。问题或建议,请公众号留言;
如果您觉得“大数据开发运维架构”对你有帮助,欢迎转发朋友圈
从微信公众号拷贝过来,格式有些错乱,建议直接去公众号阅读
一、为什么启用Kerberos安全认证
大家都知道,Hadoop1.0.0或者CDH3版本以前,并没有安全认证的概念,用户与HDFS文件系统或者提交分布式任务(Mapreduce、Spark)都是不需要认证的,这样就导致任意用户都可以智联集群进行操作和任务提交;测试环境的恶意操作我们还能接受,如果是生产环境恶意的提交作业,修改文件和数据将会造成严重的后果。
鉴于安全认证的迫切性,Hadoop1.0.0或CDH3b版本以后都加入了Kerberos认证机制。开启Kerberos认证的集群运行时,集群内的节点使用密钥得到认证。只有被认证过节点才能正常使用。企图冒充的节点由于没有事先得到的密钥信息,无法与集群内部的节点通信。防止了恶意的使用或篡改Hadoop集群的问题,确保了Hadoop集群的可靠安全。
二、Kerberos认证解决的问题
1.集群节点之间的认证
kerberos实现是服务器节点之间的认证,首先由管理员在KDC服务器节点将集群所有节点加到Kerberos认证数据库中,然后生成主机与各个节点的Keytab文件,并分发到集群各个节点,然后通过认证文件和认证密钥进行通信认证。
2.client与服务器端的认证
与服务器节点间认证原理相同,客户端通过keytab文件和密钥连接集群,与集群进行通信。
3.未实现用户级别的认证
Kerberos只是控制集群的登录,相当于一把钥匙打开了进入集群操作的大门,并没有实现用户操作权限的管理,这一点要搞清楚,举个例子:有一个房间,Kerberos相当于房间的钥匙,有了钥匙之后才可以进行房间,这是Kerberos干的事,进入之后至于你干什么这个不在Kerberos管理的范围之内,这是权限认证的东西,一般我们生产上是通过Ranger去做权限认证。
二、Kerberos认证基本原理
基本认证原理请参考CSDN这位大牛的分析:
参考链接:
https://blog.csdn.net/kwame211/article/details/78728989
三、Kerberos安装和配置
1.环境信息
Ambari2.6.0
HDP版本:2.6.3
Linux版本:Centos 7.2
JDK版本:1.8
操作用户:root
集群节点信息,如下表:
主机IP
主机名
描述
192.168.1.98
master98.hadoop.ljs
主节点(安装KDC)
192.168.1.158salver158.hadoop.ljssalver158
192.168.1.31salver31.hadoop.ljssalver31
192.168.1.32salver32.hadoop.ljssalver32
2.Kerberos Server端安装配置(这里只在Master98节点执行):
1).选择一个节点安装KDC,这里用master98节点安装,首先我们已经通过yum源将kerberos的rpm包挂载上去了,如果没有rpm包可直接从这里下载:
http://rpm.pbone.net/:
执行命令,安装KDC:
yum -y install krb5-server krb5-libs krb5-workstation
2).修改配置文件/etc/krb5.conf,修改其中的realm,把默认的EXAMPLE.COM修改为自己要定义的值,这里我们一般是CHINAUNICOM
[libdefaults] udp_preference_limit=1
renew_lifetime = 7d -这里时间一般都是10年 3650d
forwardable = true
default_realm = CHINAUNICOM
ticket_lifetime = 24h -这里时间一般都是10年 3650d
dns_lookup_realm = false
dns_lookup_kdc = false
default_ccache_name = /tmp/krb5cc_%{uid} #走tcp协议而不是走udp协议,这一行一定要添加
udp_preference_limit = 1 //Switching kerberos to use TCP rather than UDP
#default_tgs_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
#default_tkt_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
[domain_realm]
.chinaunicom=CHINAUNICOM
chinaunicom=CHINAUNICOM
[logging]
default=FILE:/var/log/krb5kdc.log
admin_server=FILE:/var/log/kadmind.log
kdc = FILE:/var/log/krb5kdc.log
[realms]
CHINAUNICOM={
admin_server=master98.hadoop.ljs
kdc = master98.hadoop.ljs
}
配置说明:
[logging]:日志输出设置 (可选)
[libdefaults]:连接的默认配置
default_realm:Kerberos应用程序的默认领域,所有的principal都将带有这个领域标志
ticket_lifetime:表明凭证生效的时限,一般为24小时
renew_lifetime:表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败
clockskew:时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内
udp_preference_limit= 1:禁止使用 udp 可以防止一个 Hadoop 中的错误
default_ccache_name:credential缓存名,默认值为
[realms]:列举使用的 realm
kdc:代表要 kdc 的位置。格式是 机器:端口
admin_server:代表 admin 的位置。格式是 机器:端口
default_domain:代表默认的域名
[domain_realm]:域名到realm的关系 (可选)
3).修改/var/kerberos/krb5kdc目录下的两个文件(注意添加:max_renewable_life和default_principal_flags配置项),KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的机器上的配置文件都同步。
kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
CHINAUNICOM = {
--这里跟krb5.conf中realms对应 #master_key_type = aes256-cts max_life = 3650d --修改 证书最大时间10年 max_renewable_life = 3650d --修改 这里也是10年
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
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}
配置说明:
CHINAUNICOM:是设定的realms。名字随意。Kerberos可以支持多个realms,一般设置一个。大小写敏感,一般为了识别使用全部大写。
max_renewable_life = 7d 涉及到是否能进行ticket的renew必须配置。
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包。推荐不使用。
acl_file:标注了admin的用户权限,需要用户自己创建。文件格式是
Kerberos_principal permissions [target_principal] [restrictions]
支持通配符等。最简单的写法是
*/admin@HADOOP.COM *
代表名称匹配*/admin@CHINAUNICOM都认为是admin,权限是 *。代表全部权限。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
修改kadm5.acl ,给数据库管理员添加ACL权限,修改kadm5.acl文件,*代表全部权限, 这里表示凡是/admin 斜划线后面有admin的都是管理员用户:
*/admin@CHINAUNICOM *
4).创建KDC数据库,其中需要设置管理员密码,创建完成会在/var/kerberos/krb5kdc/下面生成一系列文件,若重建数据库则需先删除/var/kerberos/krb5kdc下面principal相关文件,只保留kdc.conf、kadm5.acl文件即可,其他文件都会自动生成。
/usr/sbin/kdb5_util create -r CHINAUNICOM -s
5).添加数据库管理员,注意kadmin.local可以直接运行在KDC上,而无需通过Kerberos认证
/usr/sbin/kadmin.local -q "addprinc admin/admin"
中间需要输入你刚才初始化KDC数据库时,输入密码:
6).启动Kerberos进程并,通过/var/log/krb5kdc.log 和 /var/log/kadmind.log查看日志,通过kinit检查Kerberos正常运行
[root@master98 krb5kdc]# /bin/systemctl start krb5kdc.service
[root@master98 krb5kdc]# /bin/systemctl start kadmin.service
查看状态:
[root@master98 krb5kdc]# /bin/systemctl status krb5kdc.service
[root@master98 krb5kdc]# /bin/systemctl status kadmin.service
设置开机启动:
[root@master98 ~]# systemctl enable krb5kdc.service
[root@master98 ~]# systemctl enable kadmin.service
至此服务端Kerberos安装完成。
3.Kerberos Client安装,比较简单(如果通过ambari从界面启用kerberos,这一步可以忽略,因为ambari会自动都配置好):
yum install krb5-workstation krb5-libs
客户端也需要配置/etc/krb5.conf,直接把kerberos Server端的krb5.conf文件复制过来即可,直接从master98拷贝到salver158、salver31、slaver32节点/etc/目录下即可。
重要的事情说三遍:
重要的事情说三遍:
重要的事情说三遍:
特别提醒:所有kerberos节点,不管是server、client还是租户客户端都需要配置JCE
配置JCE,这是因为CentOS6.5及以上系统默认使用AES-256加密,因此需要在所有节点安装并配置JCE,JCE下载路径:
JDK1.7 下载:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK1.8 下载
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
解压到自己JDK对应的目录下,解压命令:
unzip -o -j -q /opt/jce_policy-8.zip -d /usr/jdk64/jdk1.8.0_60/jre/lib/security/
其实就是替换了jdk自带的那个jar:
采坑记录:
1.之前没有在/etc/kr5.conf中没有添加:
[libdefaults]
//没添加这一行,这里意思是走tcp协议通信,不走udp
udp_preference_limit = 1
之前没配置上面一行zookeeper一直启动报错,就报这一个错误,其他完全看不出错误来,切记,切记,报错信息:
至此Kerberos服务端和客户端安装已经完成,接下来我要分享两篇文章:
1.通过Ambari界面对HDP集群开启Kerberos认证
2.Kerberos常用操作、命令及票据有效期管理