hadoop2.7.7集群使用kerberos1.18.1进行授权验证
hadoop集群目前采用kerberos验证是比较理想的一种方式,我们介绍如何在现有的hadoop集群中添加kerberos验证。
添加步骤并不繁琐,大概有下面几步
1.安装kerberos到你的hadoop集群中
2.配置kerberos
3.设置kerberos以方便hadoop的使用,其中包括创建kerberos数据库,kerberos管理员用户和服务账户以及他们的keytabs文件
4.启动kerberos守护进程
5.配置hadoop配置文件 包括hdfs-site.xml yarn-site.xml 等文件
6.在安全模式下启动hdoop集群(hdfs 和 yarn)
7.测试hadoop集群的安全连接
接下来我们在你的集群中安装和配置kerberos的具体操作
集群现状:
centeros7.5 hadoop2.7.7
集群中有机器三台其中181是 namenode和datanode,其他2台是datanode
10.106.145.181 master01.hadoop
10.106.145.182 slave01.hadoop
10.106.145.183 slave02.hadoop
kerberos 关键词
Realm:这是一个基本管理域用来进行身份验证和用于建立服务器和用户进行身份验证的边界,每个用户都会被分配到一个特定的域中,通常使用大写字母指定领域,例如 HADOOP.EXAMOLE.COM,可以在网络中同时存在多个kdc 和多个领域
principal:主体,就是给定领域内的用户、主机或者服务,通常将用户成为用户主体 服务主体,用户主体名称(UPNs)表示常规用户,服务主体(SPNs)在hadoop生态中可以是后台进程,比如hadoop服务,如hdfs 和 yarn等,命名规则:主名称+实例+领域,如sherlocky/admin@EXAMPLE.COM,对于用户而言的principal就类似于
username@example.com只需要主名称+领域即可,也即实例为null, 而且主名称是操作系统中的用户名(注意), 如果是管理员用户则需要将实例设置为admin即可,如 username/admin@example.com. 此外我们还要注意 root/admin@TEST.COM 和root@TEST.COM是不同的principal,一定不能混淆。
如果服务的主体,则主名称应该就是主机名,或者直接使用host关键字,而对应的/后边的实例则要写完整的主机名
ticket:票据, 当用户在kerberos集群中需要验证时,管理服务器会生成一个票据,该票据包好用户名 、服务主体、客户端ip和时间戳,票据具有可配置的最大生命周期和会话密钥,用户和可以指定续签时间。
1.安装kerberos
1. 服务端yum安装
在181(master01.hadoop)上安装kerberos服务和客户端
yum install krb5-server
yum install lkrb5-libs
yum install krb5-workstation
查看安装情况
rpm -qa|grep kr
2. 客户端安装
在182 和183 客户端上安装kerberos 客户端软件
yum install lkrb5-libs
yum install krb5-workstation
查看安装情况
rpm -qa|grep kr
2.配置kerberos
1. krb5.conf
默认该文件位置 /etc/krb5.conf ,该配置文件用来指定KDC 的位置,以及kerberos中领域和主机名的映射关系,该文件是kerberos的客户端配置文件,我们来说下该文件的各个选项信息
[logging]:设置日志
[libdefaults]:kerberos library的默认值
[kdc] 指定kdc.conf的路径
[realms]:kerberos域信息设置,比如kerberos servers,这里可以有多对设置,这里还可以指定kdc和admin server的服务端口号,如果不指定则KDC默认端口诶88,admin server 的端口默认是749
[domain_realm]: 指定dns域名和kerberos 领域名的映射,给一个服务FQDN。这个配置决地址和领域的映射关系
forwardable = true: 如果用户使用一个TGT登录一个远程系统,该KDC可以发放一个新的TGT给该用户而无需用户再次验证
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = GOODHOPE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[realms]
GOODHOPE.COM = {
kdc = master01.hadoop
admin_server = master01.hadoop
}
[domain_realm]
.goodhope.com = GOODHOPE.COM
goodhope.com = GOODHOPE.COM
.dev.goodhope.com = GOODHOPE.COM
dev.goodhope.com = GOODHOPE.COM
上面的配置要在集群中所有的机器上都进行配置
2.配置kdc
kdc 需要在master上进行配置,在上面的客户端配置中我们指定了kdc配置文件的位置
profile = /var/kerberos/krb5kdc/kdc.conf,下面我们来介绍下配置kdc的选项及其含义
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
GOODHOPE.COM = {
profile = /etc/krb5.conf
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
allow-null-ticket-addresses = true
database_name = /var/kerberos/krb5kdc/principal
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
dict_file = /usr/share/dict/words
max_life = 2d 0h 0m 0s
max_renewable_life = 7d 0h 0m 0s
admin_database_lockfile = /var/kerberos/krb5kdc/kadm5_adb.lock
key_stash_file = /var/kerberos/krb5kdc/.k5stash
kdc_ports = 88
kadmind_port = 749
default_principle_flags = +renewable
}
kdc_ports kdc_tcp_ports :指定端口号
supported_enctypes :指定加密算法
max_life :指定票据最大的生命期
max_renewable_life:票据是否可用续期及续期时间
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用。
acl_file:标注了admin的用户权限。文件格式是
Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉
2.创建并初始化kerberosdatabase
1. 创建database(master01上操作)
kdb5_util create -r GOODHOPE.COM -s
需要输入密码 并再次确认后初始化成功,上面操作会产生5个文件
路径就是在上步配置的database_name = /var/Kerberos/krb5kdc/principal,我们到该目录下查看如下
cd /var/kerberos/krb5kdc/
如果需要从小重新初始化库,只需要将产生的principal开头的4个文件删除掉
rm -rf principal*
然后重新创建库即可
2.为kdc添加administrator principals用户管理员
在启用kerberos之前,我们需要创建一个用户管理主体,这个用户主体就好像是linux的root账户,
至少需要一个principal来管理进行kadmind能够在网络上于程序kadmin进行通讯
kadmin.local -q "addprinc root/admin"
查看
kadmin.local -q "listprincs"
并为创的该用户管理主体配置acl权限
vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
2.创建普通用户 principal(参考可选测试)
这里也可以创建普通用户,比如我linux系统下有用户hadoop,我给它创建一个principal并设置了密码
当kerberos服务起来之后我们就可以在域内任何机器上使用该账号进行登陆
su hadoop
kinit
klist
我们看到klist已经获取到了ticket cache了
3.启动kerberos 服务(KDC本机)
/bin/systemctl start krb5kdc .service
/bin/systemctl enable krb5kdc .service
/bin/systemctl start kadmin.service
/bin/systemctl enable kadmin.service
systemctl start krb5kdc
systemctl start kadmin
systemctl status krb5kdc
systemctl status kadmin
4.创建 service principals(KDC 本机)
我们必须创建一个service principals 来表示每个hadoop服务 如hdfs yarn等,同时确保hadoop服务进程能通过kerberos 进行验证,我们可以给每个服务和对应的守护进程创建spn,也可以为某些组件比如hive /oozie等创建spn,这里我们仅仅是演示基于用户的服务如 hdfs yarn创建,因为这两个服务是在hadoop所有节点上,所有这里的 service principals 需要为所有节点都创建,格式为 服务名+hostname+域名
kadmin.local
addprinc -randkey hdfs/
addprinc -randkey hdfs/slave
addprinc -randkey hdfs/slave02.hadoop@GOODHOPE.COM
addprinc -randkey mapred/
addprinc -randkey mapred/slave
addprinc -randkey mapred/
addprinc -randkey yarn/
addprinc -randkey yarn/slave
addprinc -randkey yarn/slave02.hadoop@GOODHOPE.COM
addprinc -randkey http/
addprinc -randkey http/slave
addprinc -randkey http/
查看principal详细信息
getprinc yarn/
查看创建的principal列表
listprincs
如果我们需要删除principal可以使用指令即可,最后推出 exit
kadmin: delprinc yarn/
5. 为service principal创建keytab 文件
每个service principal都需要一个keytab文件来存储其密码,keytab文件包含成对的kerberos主体和从他们的kerberos密码派生的加密密钥,当服务在运行时需要使用它到kdc进行身份验证,我们可以将多个server principal产生到一个keytabl文件中 如下
kadmin.local
xst -k yarn.keytab hdfs/hadoop@GOODHOPE.COM yarn/hadoop@GOODHOPE.COM HTTP/hadoop@GOODHOPE.COM mapred/
文件产生在 当前目录下(我们可以和kdc放一个路径下 /var/kerberos/krb5kdc)
6. 测试kerberos
目前我们已经在master01.hadoop上创建了kdc,并创建了多个principal 和产生了相应的keytab文件
下面我们来测试下kerberos的是否能正常工作
测试 user principal
登陆slave01.hadoop 和 slave02.hadoop 尝试使用user principal登陆
su hadoop
kinit
klist
测试user keytab
在master01.hadoop上使用root创建hadoop.GOODHOPE.COM的keytab
kadmin.local
产生keytab文件
xst -k hadoop.keytab
将hadoop.keytab 上传到slave01.hadoop进行登陆测试
chown hadoop:hadoop hadoop.keytab
kinit -kt hadoop.keytab hadoop@GOODHOPE.COM
klist
测试server keytab
在master01.hadoop上使用root创建hadoop.GOODHOPE.COM的keytab
kadmin.local
产生keytab文件
xst -k hdfs.keytab hdfs/master01.hadoop@GOODHOPE.COM hdfs/slave01.hadoop@GOODHOPE.COM hdfs/
xst -k yarn.keytab yarn/master01.hadoop@GOODHOPE.COM yarn/slave01.hadoop@GOODHOPE.COM yarn/
将文件上传到slave01.hadoop进行登陆测试,因为我只有hadoop账号,使用该账号进行登陆测试,所以授予
文件权限给hadoop
chown hadoop:hadoop hdfs.keytab yarn.keytab
登陆 slave01.hadoop 和 slave02.hadoop 进行测试(使用hadoop账号)
kinit -kt yarn.keytab yarn/
klist
kinit -kt hdfs.keytab hdfs/slave02.hadoop@GOODHOPE.COM
klist
到此位置kerberos已经搭建完毕,并测试可用,我们下一步需要设置hadoop各个服务,以便支持kerberos进行验证