CDH构建大数据平台-配置集群的Kerberos认证安全

当平台用户使用量少的时候我们可能不会在意集群安全功能的缺失,因为用户少,团队规模小,相对容易把控,开发人员直接也彼此了解。这时候只需要做好团队内部或是企业通过一些列行政管理手段就能管理好集群的安全问题。但是别忘了我们的平台定位可是作为一个单一的大数据来支持企业内部所有应用的。正所谓人上一百,形形色色。当平台用户达到一定数量之后其素质难免会参差不齐,大数据平台面对的也不再是一个小团队了。这时候靠团队自觉或是单纯地通过规章制度都很难再起到有效的作用。作为一个企业级平台,安全问题不容小觑。详情请参考:构建企业级平台安全方案

一、安装Kerberos

1. 整体说明

软件版本 
操作系统:CentOs 6.8 
CDH版本:Hadoop 2.6.0-cdh5.9.0 
JDK版本: jdk1.8.0_211
运行用户:root

集群主机角色划分 
netcloud01 作为master节点,安装kerberos Server 
其他节点作为slave节点,安装kerberos client

2. 配置host

添加主机名到 /etc/hosts 文件中。

$ cat /etc/hosts
172.16.240.103 netcloud01
172.16.240.104 netcloud02
172.16.240.105 netcloud03
 
注意:hostname 请使用小写,要不然在集成 kerberos 时会出现一些错误。

3. 安装 Kerberos

在 netcloud01 上安装 krb5、krb5-server 和 krb5-client。

> yum install krb5-server -y
# klist等命令找不大时执行下面安装
> yum install -y krb5-server krb5-workstation pam_krb5


在其他节点(netcloud02、netcloud03)安装 krb5-devel、krb5-workstation

> yum install krb5-devel krb5-workstation -y

4. 修改配置文件

kdc 服务涉及到三个配置文件:

/etc/krb5.conf
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl
1)编辑配置文件 /etc/krb5.conf。默认安装的文件中包含多个示例项。

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = NETCLOUD.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 default_tgs_enctypes = aes256-cts
 default_tkt_enctypes = aes256-cts
 permitted_enctypes = aes256-cts
 udp_preference_limit = 1
 kdc_timeout = 3000

[realms]
 NETCLOUD.COM = {
  kdc = netcloud01
  admin_server = netcloud01
 }

[domain_realm]
 .netcloud.com = NETCLOUD.COM
 netcloud.com = NETCLOUD.COM


说明:

[logging]:表示 server 端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置 
default_realm = 0HKJ.COM:设置 Kerberos 应用程序的默认领域。如果您有多个领域,只需向 [realms] 节添加其他的语句。
ticket_lifetime: 表明凭证生效的时限,一般为24小时。
renew_lifetime: 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
clockskew:时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内。
udp_preference_limit= 1:禁止使用 udp 可以防止一个 Hadoop 中的错误
[realms]:列举使用的 realm。 
kdc:代表要 kdc 的位置。格式是 机器:端口
admin_server:代表 admin 的位置。格式是 机器:端口
default_domain:代表默认的域名
[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
2)修改 /var/kerberos/krb5kdc/kdc.conf ,该文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 NETCLOUD.COM = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  max_renewable_life = 7d
  max_life = 1d

  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }


说明:

0HKJ.COM: 是设定的 realms。名字随意。Kerberos 可以支持多个 realms,会增加复杂度。大小写敏感,一般为了识别使用全部大写。这个 realms 跟机器的 host 没有大关系。
master_key_type:和 supported_enctypes 默认使用 aes256-cts。JAVA 使用 aes256-cts 验证方式需要安装 JCE 包,见下面的说明。为了简便,你可以不使用 aes256-cts 算法,这样就不需要安装 JCE 。
acl_file:标注了 admin 的用户权限,需要用户自己创建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
supported_enctypes:支持的校验方式。
admin_keytab:KDC 进行校验的 keytab。 
关于AES-256加密:
对于使用 centos5. 6 及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装 JCE,如果你使用的是 JDK1.6 ,则到Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 6 页面下载,如果是 JDK1.7,则到 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 7 下载。下载的文件是一个 zip 包,解开后,将里面的两个文件(local_policy.jar、US_export_policy.jar)放到下面的目录中:$JAVA_HOME/jre/lib/security.

上面这一步一定要做,否则会报zk,namenode等不支持默认tkt的加密方式错误。

3)为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过创建 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。

$ cat /var/kerberos/krb5kdc/kadm5.acl
内容如下:

*/[email protected] *

表示principal的名字的第二部分如果是admin,那么该principal就拥有管理员权限

5. 同步配置文件

将 kdc 中的 /etc/krb5.conf 拷贝到集群中其他服务器即可。

$ scp -r /etc/krb5.conf netcloud02:/etc/krb5.conf
$ scp -r /etc/krb5.conf netcloud03:/etc/krb5.conf

建数据库
在 netcloud01 上运行初始化数据库命令。其中 -r 指定对应 realm。

$ kdb5_util create -r NETCLOUD.COM -s
出现 Loading random data 的时候另开个终端执行点消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快随机数采集。该命令会在 /var/kerberos/krb5kdc/ 目录下创建 principal 数据库。

如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉。默认的数据库名字都是 principal。可以使用 -d指定数据库名字。

7. 启动Kerberos服务

netcloud01 节点上运行:

$ chkconfig --level 35 krb5kdc on
$ chkconfig --level 35 kadmin on
$ service krb5kdc start
$ service kadmin start

8、建 kerberos 管理员
关于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至于使用哪个,取决于账户和访问权限:

如果有访问 kdc 服务器的 root 权限,但是没有 kerberos admin 账户,使用 kadmin.local
如果没有访问 kdc 服务器的 root 权限,但是用 kerberos admin 账户,使用 kadmin 
netcloud01 上创建远程管理的管理员:

手动输入两次密码

$ kadmin.local -q "addprinc root/admin"

密码:netcloud@123
 
也可以不用手动输入密码
$ echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"
 
抽取密钥并将其储存在本地 keytab 文件 /etc/krb5.keytab 中。这个文件由超级用户拥有,所以必须是 root 用户才能在 kadmin shell 中执行以下命令:

kadmin.local -q "ktadd kadmin/admin"
 
# 查看生成的keytab
klist -k /etc/krb5.keytab
9.  kerberos常用命令

进入kadmin
kadmin.local/kadmin
创建数据库
kdb5_util create -r NETCLOUD.COM -s 
启动kdc服务
service krb5kdc start
启动kadmin服务
service kadmin start 
修改当前密码
kpasswd
测试keytab可用性
kinit -k -t /var/kerberos/krb5kdc/keytab/root.keytab root/[email protected]
查看keytab
klist -e -k -t /etc/krb5.keytab 
清除缓存
kdestroy
通过keytab文件认证登录
kinit -kt /var/run/cloudera-scm-agent/process/***-HIVESERVER2/hive.keytab hive/node2
 
 
kadmin模式下:
 
生成随机key的principal
addprinc -randkey root/[email protected]
生成指定key的principal
Addprinc -pw **** admin/[email protected]
查看principal
listprincs
修改admin/admin的密码
cpw -pw xxxx admin/admin
添加/删除principle
addprinc/delprinc admin/admin
直接生成到keytab
ktadd -k /etc/krb5.keytab host/[email protected] 
设置密码策略(policy)
addpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 -history 10 user
添加带有密码策略的用户
addprinc -policy user hello/[email protected]
修改用户的密码策略
modprinc -policy user1 hello/[email protected]
删除密码策略
delpol [-force] user
修改密码策略
modpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 user


二、CDH启用Kerberos

 

CM中的操作

在CM的界面上点击启用Kerberos,启用的时候需要确认几个事情:

1.KDC已经安装好并且正在运行  
2.将KDC配置为允许renewable tickets with non-zerolifetime(在之前修改kdc.conf文件的时候已经添加了kdc_tcp_ports、max_life和max_renewable_life这个三个选项)  
3.在Cloudera Manager Server上安装openldap-clients  
4.为Cloudera Manager创建一个principal,使其能够有权限在KDC中创建其他的principals,就是上面创建的Kerberos管理员账号

启用Keberos 

全部勾选 

第一行选择:MIT KDC

第二行填写:master节点

第三行填写:NETCLOUD.COM

第四行填写:aes256-cts

第五行选择:5

 Note:不勾选 

如果看不清的话,可以看下面文字:

第一行:root/[email protected]

第二行:netcloud@123(这里是我们刚才设置的密码,建议设置为netcloud@123)

这一步也默认,直接勾选Yes,然后重启整个集群的服务,完成了CDH中的Kerberos的配置

PS:有可能出现的问题

1,如果我们在配置完成Kerberos中出现了问题,一定要去确定我们刚才配置的信息是否正确,因为如果错误,就会导致CDH无法正确应用Kerberos的配置

2,如果在配置完成Kerberos后,出现ZooKeeper服务无法启动并报错,或者其他服务无法启动并报错:

java.io.IOException: Could not configure server because SASL configuration did not allow the  ZooKeeper server to authenticate itself properly:

javax.security.auth.login.LoginException: No supported encryption types listed in default_tkt_enctypes

百分百确定是你的jdk路径没有找正确,你需要重新去找一下本机用的java -version和你本机的jdk路径是否一致,然后将UnlimitedJCEPolicyJDK7这个文件夹下的文件重新移动到我上面写的路径下面,然后重新启动刚才报错的服务。

3,中途如果出现服务没有启动成功,需要我们去确认一下每个节点的master文件和slaves文件,确保每台机子的master文件和slave文件都是一致的。

如果所有服务启动没有问题,在配置完成之后,进入主节点,创建HDFS超级用户:

kadmin.local -q "addprinc hdfs"

中途会提示这个:直接输入密码就行,建议:netcloud@123

Authenticating as principal root/[email protected] with password.

WARNING: no policy specified for [email protected]; defaulting to no policy

Enter password for principal "[email protected]":

Re-enter password for principal "[email protected]":

Principal "[email protected]" created.

创建用户完成后,我们验证一下Kerberos在集群上是否正常工作:

首先,在master节点上输入:

hadoop fs -ls /

会报错,这个是正常的,如果不报错,就说明有问题,请检查上述步骤,要确定

然后我们输入:

kinit hdfs 

kinit  [email protected] 

提示我们输入密码,我们就输入netcloud@123,然后我们再输入:

hadoop fs -ls /

发现可以正常显示,说明配置Kerberos成功

其他客户端如果使用root或hdfs用户执行 hadoop fs -ls / 命令报错

需要执行 :

kinit  root/[email protected] 

kinit  [email protected] 

Note:为每个节点的每个用户创建principal ( kinit  [email protected]  )

 

三、验证Kerberos在集群上是否正常工作

 

确认HDFS可以正常使用

登录到某一个节点后,切换到hdfs用户,然后用kinit来获取credentials  (kinit  [email protected])

现在用hadoop hdfs -ls /应该能正常输出结果 
用kdestroy销毁credentials后,再使用hadoop hdfs -ls /会发现报错

Note:

 

票据有过期时间的 设置crontab 定期去刷新就好了。或者你把过期时间设置很大

kinit -k -t /etc/krb5.keytab  hdfs;

票据过期,密码过期解决方法 (重新创建一个HDFS超级用户)

 

kadmin.local -q "addprinc ysj"

中途会提示这个:直接输入密码就行,建议:netcloud@123

然后我们输入:

kinit ysj 

kinit  [email protected] 

提示我们输入密码,我们就输入netcloud@123,然后我们再输入:

hadoop fs -ls /

发现可以正常显示,说明配置Kerberos成功

或者删除之前的的超级用户重新创建

kadmin.local -q "delprinc hdfs"


kadmin.local -q "addprinc hdfs"

然后我们输入:

kinit ysj 

kinit  [email protected] 

提示我们输入密码,我们就输入netcloud@123,然后我们再输入:

hadoop fs -ls /

发现可以正常显示,说明配置Kerberos成功

其他问题参考: https://www.cnblogs.com/xiaodf/p/5968178.html

问题总结:

1)Hue 集成Kerberos 导致Kerberos Ticket Renewer 起不来

    报错,Kerberos Ticket Renewer 起不来,查看日志

[19/Jan/2018 07:10:08 +0000] kt_renewer   INFO     Renewing kerberos ticket to work around kerberos 1.8.1: /usr/bin/kinit -R -c /run/hue/hue_krb5_ccache
kinit: KDC can't fulfill requested option while renewing credentials
[19/Jan/2018 07:10:08 +0000] kt_renewer   ERROR    Couldn't renew kerberos ticket in order to work around Kerberos 1.8.1 issue. Please check that the ticket for 'hue/[email protected]' is still renewable:
  $ klist -f -c /run/hue/hue_krb5_ccache
If the 'renew until' date is the same as the 'valid starting' date, the ticket cannot be renewed. Please check your KDC configuration, and the ticket renewal policy (maxrenewlife) for the 'hue/[email protected]' and `krbtgt' principals.
[19/Jan/2018 23:10:09 +0000] settings     DEBUG    DESKTOP_DB_TEST_NAME SET: /usr/local/hue/desktop/desktop-test.db
[19/Jan/2018 23:10:09 +0000] settings     DEBUG    DESKTOP_DB_TEST_USER SET: hue_test
[19/Jan/2018 07:10:09 +0000] __init__     INFO     Couldn't import snappy. Support for snappy compression disabled.
[19/Jan/2018 07:10:09 +0000] kt_renewer   INFO     Reinitting kerberos from keytab: /usr/bin/kinit -k -t /etc/security/keytabs/hue.service.keytab -c /var/run/hue/hue_krb5_ccache hue/[email protected]
[19/Jan/2018 07:10:10 +0000] kt_renewer   INFO     Renewing kerberos ticket to work around kerberos 1.8.1: /usr/bin/kinit -R -c /run/hue/hue_krb5_ccache
kinit: KDC can't fulfill requested option while renewing credentials
[19/Jan/2018 07:10:10 +0000] kt_renewer   ERROR    Couldn't renew kerberos ticket in order to work around Kerberos 1.8.1 issue. Please check that the ticket for 'hue/[email protected]' is still renewable:
发布了110 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/yangshaojun1992/article/details/103837821
今日推荐