hadoop2.7.7集群使用kerberos1.18.1进行授权验证

e88a7c3843c2609ce7408f0d14eb1521.png

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

de0622cf1140d3012e02e046871748a4.png

2. 客户端安装

在182 和183 客户端上安装kerberos 客户端软件

yum install lkrb5-libs

yum install krb5-workstation

查看安装情况

rpm -qa|grep kr

5a9a34b1effd048c501531dd522e7cb6.png

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

afc7446a8b765954c1b6eea1723c9f9b.png

需要输入密码 并再次确认后初始化成功,上面操作会产生5个文件

路径就是在上步配置的database_name = /var/Kerberos/krb5kdc/principal,我们到该目录下查看如下

cd /var/kerberos/krb5kdc/

e155b8a6b6f3f84a0ceac56d3a23d0a2.png

如果需要从小重新初始化库,只需要将产生的principal开头的4个文件删除掉

rm -rf principal*

然后重新创建库即可

2.为kdc添加administrator principals用户管理员

在启用kerberos之前,我们需要创建一个用户管理主体,这个用户主体就好像是linux的root账户,

至少需要一个principal来管理进行kadmind能够在网络上于程序kadmin进行通讯

kadmin.local -q "addprinc root/admin"

45b8a38d8a42e44539b2388aef5c2a35.png

查看

kadmin.local -q "listprincs"

b3dadafffc9b5cec49fbc4d85748cfaa.png

并为创的该用户管理主体配置acl权限

vi /var/kerberos/krb5kdc/kadm5.acl

*/admin@HADOOP.COM *

ede110d980da74584e2ead471c52a992.png

2.创建普通用户 principal(参考可选测试)

这里也可以创建普通用户,比如我linux系统下有用户hadoop,我给它创建一个principal并设置了密码

5c6230120d07a3eb4ddd30f6861cc8d0.png
c007cf08cad7e998e68bdb3af61785af.png

当kerberos服务起来之后我们就可以在域内任何机器上使用该账号进行登陆

su hadoop

kinit

klist

373f23e9311826c49369aa0c8e8ac4eb.png

我们看到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

3a2f8473c5cf11fdf86efe1e8132345a.png
be3317c10cd21714bbfdb2ce63f940e9.png

4.创建 service principals(KDC 本机)

我们必须创建一个service principals 来表示每个hadoop服务 如hdfs yarn等,同时确保hadoop服务进程能通过kerberos 进行验证,我们可以给每个服务和对应的守护进程创建spn,也可以为某些组件比如hive /oozie等创建spn,这里我们仅仅是演示基于用户的服务如 hdfs yarn创建,因为这两个服务是在hadoop所有节点上,所有这里的 service principals 需要为所有节点都创建,格式为 服务名+hostname+域名

kadmin.local

caae321ef4c8f7ac15cf862e1cd973e1.png

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/

a6d8c2c8e54c7ef782af561ff4341e4d.png

查看创建的principal列表

listprincs

ec043300d1a3af551f125366b1ad1f82.png

如果我们需要删除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/

6d33f81c376ca91579008326dc9a256a.png

文件产生在 当前目录下(我们可以和kdc放一个路径下 /var/kerberos/krb5kdc)

88980e11940fd3ffd831dcdd0b8e04a2.png

6. 测试kerberos

目前我们已经在master01.hadoop上创建了kdc,并创建了多个principal 和产生了相应的keytab文件

下面我们来测试下kerberos的是否能正常工作

测试 user principal

登陆slave01.hadoop 和 slave02.hadoop 尝试使用user principal登陆

su hadoop

kinit

klist

9a52dfa96a1596f01ecb2a816f27cfb5.png

测试user keytab

在master01.hadoop上使用root创建hadoop.GOODHOPE.COM的keytab

kadmin.local

产生keytab文件

xst -k hadoop.keytab

0c2ab2729af3b0d9dd59619f774ffd1f.png

将hadoop.keytab 上传到slave01.hadoop进行登陆测试

chown hadoop:hadoop hadoop.keytab

kinit -kt hadoop.keytab hadoop@GOODHOPE.COM

klist

599dcb4afabc312653eef37a76d1478a.png

测试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

f66e254105382d9797cbd9fd8e9e0590.png

kinit -kt hdfs.keytab hdfs/slave02.hadoop@GOODHOPE.COM

klist

d1ba5c005f9ad3eaa33b915360ac60d1.png

到此位置kerberos已经搭建完毕,并测试可用,我们下一步需要设置hadoop各个服务,以便支持kerberos进行验证

更多推荐