大数据环境配置之CentOS中安装kerberos

Kerberos简介

Kerberos是一种基于对称密钥的身份认证协议,它作为一个独立的第三方的身份认证服务,可以为其它服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务如HBase/HDFS等)。
Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于Kerberos协议在每个Client和Service之间具有共享密钥,使得该协议具有相当的安全性。

知识储备

  • Kerberos是一种客户端/服务端架构。
  • KDC:密钥分发中心(Key distribution Center),由三部分构成:Kerberos数据库、认证服务(Authentication service,AS)和票据授予服务(ticket-granting service,TGS)
  • principal:主体,Kerberos中的身份标识称为主体。
  • realm:域,确定了管理边界,所有主体均属于特定的Kerberos域。
  • 主体和域的信息存储在Kerberos数据库中。
  • TGT:票据授予票据,AS认证成功后授予用户的一种特殊票据

Kerberos服务端

安装

服务端安装KDC

1
yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation -y

配置

配置/etc/krb5.conf。修改其中的realm,把默认的EXAMPLE.COM修改为自己要定义的值(如:PSVMC.CN),也可以不修改。

krb5.conf

其中,需要修改以下参数:

  • default_realm:默认的realm。如PSVMC.CN
  • kdc:KDC 服务器的主机名或 IP 地址
  • admin_server:kadmind 服务器地址,默认与 kdc 相同
  • [domain_realm]:将域名映射到 realm

注意:

Master、Worker节点均需配置,且文件内容必须相同

1
vi /etc/krb5.conf

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = PSVMC.CN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 10000d
renew_lifetime = 10000d
forwardable = true

[realms]
PSVMC.CN = {
kdc = 192.168.7.104:88
admin_server = 192.168.7.104:749
}

[domain_realm]
.psvmc.cn = PSVMC.CN
psvmc.cn = PSVMC.CN

kdc.conf

仅配置Master节点,如果没有,需自建

1
vi /var/kerberos/krb5kdc/kdc.conf

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
PSVMC.CN = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_life = 10000d
max_renewable_life = 10000d
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
}

kadm5.acl

kadm5.acl文件用于设置哪些用户具有管理Kerberos数据库的权限。

1
vi /var/kerberos/krb5kdc/kadm5.acl

内容

1
*/admin@PSVMC.CN     *

设置Kerberos数据库ACL访问权限

  • 第一列表示主体名,此处代表名称匹配`*/admin@PSVMC.CN`

  • 第二列表示权限,*代码全部权限

  • 第三列为可选的,表示权限应用的目标实体,此处没有设置

    比如下面的acl文件最后一条记录就设置了第三列:

    1
    2
    3
    petter/admin@MYTRAIN.COM     * 
    mary/admin@MYTRAIN.COM *
    mary/admin@MYTRAIN.COM ADMICL */admin@MYTRAIN.COM

权限使用单个字母组合,小写字母表示授予该权限,大写字母表示拒绝该权限

权限列表:

权限 说明
a 向KDC数据库添加用户
d 从KDC数据库中删除用户
m 修改KDC数据库中的用户
c 修改KDC数据库中的principal(主体)密码
i 查询数据库,列举principal(主体)信息
*(或x) 以上所有权限

创建Kerberos数据库

创建Kerberos数据库,需要设置管理员密码,创建成功后会在/var/Kerberos/krb5kdc/下生成一系列文件,

如果重新创建,需要先删除/var/kerberos/krb5kdc下面principal相关文件。

1
2
cd /var/kerberos/krb5kdc/
rm -rf principal*

需在Master节点的root用户下执行以下命令新建数据库:

1
kdb5_util create -s -r PSVMC.CN

image-20221215150543148

输入自定义的数据库的密码为:zhangjian

启动服务

数据库创建成功后,需启动krb5服务:

1
2
3
4
chkconfig --level 35 krb5kdc on
chkconfig --level 35 kadmin on
service krb5kdc start
service kadmin start

两个服务的作用

  • krb5kdc 认证使用
  • kadmin 管理用户使用

创建kerberos的管理员

在Master节点的root用户下分别执行以下命令:

1
kadmin.local

添加管理员

1
addprinc admin/admin@PSVMC.CN

这里会让输入密码,我这里输入的zhangjian

查看所有用户

1
listprincs

先退出之前的登录

1
quit

用密码登录

1
2
3
kinit admin/admin
# 或者
kinit admin/admin@PSVMC.CN

数据密码后即可登录

登录后查看认证状态

1
klist

管理用户命令

这些命令需要登录后执行

操作 描述 示例
add_principal, addprinc, ank 增加 principal add_principal -randkey test@PSVMC.CN
cpw 修改密码 cpw test@PSVMC.CN
delete_principal, delprinc 删除 principal delete_principal test@PSVMC.CN
modify_principal, modprinc 修改 principal modify_principal test@PSVMC.CN
rename_principal, renprinc 重命名 principal rename_principal test@PSVMC.CN test2@ABC.COM
get_principal, getprinc 获取 principal get_principal test@PSVMC.CN
list_principals, listprincs, get_principals, getprincs 显示所有 principal listprincs
ktadd, xst 导出条目到 keytab xst -k /root/test.keytab test@PSVMC.CN
? 查看帮助 ?

创建Kerberos的普通用户

创建 kerberos的普通用户及密钥文件,为配置时,各节点可以相互访问用。

在Master节点的root用户下分别执行以下命令

先删除之前的文件

1
rm -rf /root/psvmc.keytab

登录到管理员账户:

如果在本机上,可以通过kadmin.local直接登录。

1
kadmin.local

其它机器的,先使用kinit进行验证。

注意

psvmc.keytab相当于密匙文件,和密码作用一致。

创建用户及验证文件

1
2
3
4
5
6
7
8
9
10
11
#如果村则先删除用户
delprinc psvmc/hadoop@PSVMC.CN

#创建用户
addprinc -pw zhangjian psvmc/hadoop@PSVMC.CN

#生成密钥文件(如果未指定路径则生成到当前路径下)
ktadd -k /root/psvmc.keytab -norandkey psvmc/hadoop@PSVMC.CN

#退出
quit

设置相应的组

1
2
chown root:root psvmc.keytab
cp psvmc.keytab /data/tools/bigdata/kerberos/

登录

1
2
3
4
5
6
7
8
#方式1 用密码登录
kinit psvmc/hadoop

#方式2 用keytab登录
kinit -kt /root/psvmc.keytab psvmc/hadoop@PSVMC.CN

#查看认证状态
klist

Kerberos客户端

客户端上不用启动服务。

kerberos 客户端的常用命令是kinit、klist、kdestroy、kpasswd。

kinit用户登录。登录过程就是客户端从KDC获取票据TGT的过程。

登录成功后,票据被缓存在本地。实际上就是建立了安全会话。

  • klist用户查看当前票据缓存中内容。

  • kdestroy用于退出登录,即销毁缓存中票据。

  • kpasswd用于修改用户(主体)口令。

安装

客户端安装krb5-level、krb5-workstation

1
yum install krb5-devel krb5-workstation -y

服务端其实已经安装了客户端的依赖,所以在服务端可以直接连接。

配置

Worker节点均需配置,且文件内容和Master相同

1
vi /etc/krb5.conf

内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = PSVMC.CN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 10000d
renew_lifetime = 10000d
forwardable = true

[realms]
PSVMC.CN = {
kdc = 192.168.7.104:88
admin_server = 192.168.7.104:749
}

[domain_realm]
.psvmc.cn = PSVMC.CN
psvmc.cn = PSVMC.CN

其中下面的配置中可以不写端口,使用默认端口。

1
2
3
4
5
[realms]
PSVMC.CN = {
kdc = 192.168.7.104:88
admin_server = 192.168.7.104:749
}

登录

方式1

1
kinit psvmc/hadoop

方式2

需要把服务端生成的密钥文件psvmc.keytab复制过来。

1
kinit -kt /root/psvmc.keytab psvmc/hadoop@PSVMC.CN

查看认证状态

1
klist

Hadoop配置

core-site.xml

1
2
3
4
5
6
7
8
9
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>

<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!-- kerberos start -->
<!-- namenode -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/data/tools/bigdata/kerberos/hadoop.keytab</value>
</property>

<property>
<name>dfs.namenode.kerberos.principal</name>
<value>root/hadoop@PSVMC.CN</value>
</property>

<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>root/hadoop@PSVMC.CN</value>
</property>

<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>root/hadoop@PSVMC.CN</value>
</property>

<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/data/tools/bigdata/kerberos/hadoop.keytab</value>
</property>

<!-- datanode -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/data/tools/bigdata/kerberos/hadoop.keytab</value>
</property>

<property>
<name>dfs.datanode.kerberos.principal</name>
<value>/data/tools/bigdata/kerberos/hadoop.keytab</value>
</property>

<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>

<property>
<name>dfs.data.transfer.protection</name>
<value>integrity</value>
</property>

<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>

<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>

<!-- journalnode -->
<property>
<name>dfs.journalnode.keytab.file</name>
<value>/data/tools/bigdata/kerberos/hadoop.keytab</value>
</property>

<property>
<name>dfs.journalnode.kerberos.principal</name>
<value>root/hadoop@PSVMC.CN</value>
</property>

<property>
<name>dfs.journalnode.kerberos.internal.spnego.principal</name>
<value>root/hadoop@PSVMC.CN</value>
</property>

<!-- kerberos end-->

hadoop_env.sh

1
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=${JAVA_HOME}/lib -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.krb5.realm=PSVMC.CN -Djava.security.krb5.kdc=hadoop01:88"

ssl-server.xml

生成密匙对

1
keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA

修改访问权

1
2
chown -R root:root /etc/security/keytab/keystore
chmod 660 /etc/security/keytab/keystore

分发

1
ha-fenfa.sh /etc/security/keytab/keystore

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!-- SSL密钥库路径 -->
<property>
<name>ssl.server.keystore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>

<!-- SSL密钥库密码 -->
<property>
<name>ssl.server.keystore.password</name>
<value>123456</value>
</property>

<!-- SSL可信任密钥库路径 -->
<property>
<name>ssl.server.truststore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>

<!-- SSL密钥库中密钥的密码 -->
<property>
<name>ssl.server.keystore.keypassword</name>
<value>123456</value>
</property>

<!-- SSL可信任密钥库密码 -->
<property>
<name>ssl.server.truststore.password</name>
<value>123456</value>
</property>