简介
Kerberoso为一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。这里指由麻省理工实现此协议,并发布的一套免费软件。Kerberos协议基于对称密码学。Kerberos工作在用于证明用户身份的”票据(tickets)”的基础上。KDC持有一个密钥(principals)数据库;每个网络实体——无论是客户还是服务器——共享一套只有他自己和KDC知道的密钥。密钥的内容用于证明实体的身份。对于两个实体间的通信,KDC产生一个会话密钥,用来加密他们之间的交互信息。
| [[ https://en.wikipedia.org/wiki/Kerberos_(protocol) | Kerberos Wiki ]] |
系统环境
-
系统://CentOS 6.3 x64// X 2
-
Cloudera Manager://5.4.4//
-
CDH: //5.4.4//
-
JDK: //1.7.0_79//
-
群集节点规划如下
| IP | Hostname | Roles |
| 10.1.2.51 | hadoop001 | NameNode, DataNode, Kerberos client |
| 10.1.2.52 | hadoop002 | DataNode, Kerberos Server, Kerberos client |
注意:hostname 需使用小写,以避免不必要的错误。
前置条件
1. 安装Cloudera Management和CDH:
可参考 通过Cloudera Management安装CDH中的Hadoop/Hive/Spark
2. 配置Kerberos服务:
以下操作使用root权限进行。
1) 安装 Kerberos Server:
在hadoop002上安装Kerberos Server:
[root@hadoop002 ~]# yum install krb5-server -y
2) 安装 Kerberos Client:
在hadoop001和hadoop002上安装Kerberos Client:
[root@hadoop001 ~]# yum install krb5-workstation krb5-libs -y
[root@hadoop002 ~]# yum install krb5-workstation krb5-libs -y
3) 编辑 Kerberos Server 配置文件(kdc.conf):
以下仅列出需要的配置,详细配置参考:[[ http://web.mit.edu/~kerberos/krb5-devel/doc/admin/conf_files/kdc_conf.html kdc.conf ]]:
[root@hadoop002 ~]# vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
CDP.COM = {
#master_key_type = aes256-cts
master_key_type = aes128-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_life = 1d
max_renewable_life = 7d
supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
default_principal_flags = +renewable, +forwardable
}
说明:
-
CDP.COM :设定的realms, 一般使用大写。
-
master_key_type, supported_enctypes : 默认使用aes256-cts,为了简便,这里不使用 aes256-cts 算法(原因见下面说明)。
-
max_renewable_life = 7d, max_life = 1d, default_principal_flags = +renewable, +forwardable : Cloudera Manager要求配置凭证生命周期非零且可更新。
关于AES-256加密:
如果你使用的是CentOS或Red Hat Enterprise Linux 5.5及以上的系统,则默认使用AES-256加密Kerberos的tickts。需要给群集里的所有节点安装[[ http://www.oracle.com/technetwork/java/javase/downloads/index.html Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File ]]。
这里使用的是JDK1.7,对应的JCE下载地址[[ http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/jce-7-download-432124.html Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for JDK/JRE 7 ]] 。下载完后将zip包内的两个文件解压到 $JAVA_HOME/jre/lib/security 即可。
4) 修改 Kerberos Client 配置文件(krb5.conf):
[root@hadoop002 ~]# vim /etc/krb5.conf
[logging]
default = FILE:/DATA/log/krb5libs.log
kdc = FILE:/DATA/log/krb5kdc.log
admin_server = FILE:/DATA/log/kadmind.log
[libdefaults]
default_realm = CDP.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
clockskew = 120
udp_preference_limit = 1
[realms]
CDP.COM = {
kdc = hadoop002
admin_server = hadoop002
}
[domain_realm]
.cdp.com = CDP.COM
cdp.com = CDP.COM
说明:
-
基本上是默认配置,修改一些hostname和realms配置即可。
-
clockskew = 120 :表示tickets与服务器的时钟偏差可容忍在120秒之内。
-
udp_preference_limit = 1 : 据说可以避免一个Hadoop的错误。
5) 编辑 访问控制列表文件 (kadm5.acl)
该文件包含所有获许管理 KDC 的主体名称。
[root@hadoop002 ~]# cat /var/kerberos/krb5kdc/kadm5.acl
*/admin@CDP.COM *
6) 同步配置文件
将 hadoop002 中的 /etc/krb5.conf 拷贝到其他主机(即hadoop001)
[root@hadoop001 ~]# scp hadoop002:/etc/krb5.conf /etc/krb5.conf
7) 创建数据库
该数据库用于存储principals。其中 -r 指定对应 realm。用 -d 可指定数据库名字,默认为principal。
[root@hadoop002 ~]# kdb5_util create -r CDP.COM -s
如果提示数据库已经存在,则要把 /var/kerberos/krb5kdc/ 目录下的 principal(数据库名称) 的相关文件都干掉。
8) 启动服务
在 hadoop002 节点上运行:
[root@hadoop002 ~]# chkconfig --level 35 krb5kdc on
[root@hadoop002 ~]# chkconfig --level 35 kadmin on
[root@hadoop002 ~]# service krb5kdc start
[root@hadoop002 ~]# service kadmin start
9) 创建 kerberos 管理员
关于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,区别如下:
- 本地机器(即kerberos server所在主机)使用 kadmin.local。不需要密码。
[root@hadoop002 ~]# kadmin.local
Authenticating as principal root/admin@CDP.COM with password.
kadmin:
- 远端机器(即kerberos client)使用 kadmin 远程连接kerberos server,需要有管理员权限的principal。需要认证。
[root@hadoop001 ~]# kadmin
Authenticating as principal cloudera-scm/admin@CDP.COM with password.
Password for cloudera-scm/admin@CDP.COM:
kadmin:
所以这里我们需要创建一个远程管理员用以远端登陆。同时Cloudera Manager也会用到。
[root@hadoop001 ~]# kadmin.local -q "addprinc cloudera-scm/admin"
系统会提示输入密码,密码不能为空。
10) Kerberos 相关操作
至此kerberos服务搭建完成,可以用以下几个指令测试是否搭建成功:
#查看principals
kadmin.local: list_principals
#添加principal
kadmin.local: addprinc test
WARNING: no policy specified for test@CDP.COM; defaulting to no policy
Enter password for principal "test@CDP.COM":
Re-enter password for principal "test@CDP.COM":
Principal "test@CDP.COM" created.
#删除principal
kadmin.local: delete_principal test
Are you sure you want to delete the principal "test@CDP.COM"? (yes/no): yes
Principal "test@CDP.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
[root@hadoop001 ~]# kadmin.local -q "addprinc root/admin" //查看principals。
#获得ticket
[root@hadoop002 ~]# kinit test
Password for test@CDP.COM:
#查看持有的ticket
[root@hadoop002 ~]# klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test@CDP.COM
Valid starting Expires Service principal
09/10/15 17:53:55 09/11/15 17:53:55 krbtgt/CDP.COM@CDP.COM
renew until 09/10/15 17:53:55, Etype (skey, tkt): aes128-cts-hmac-sha1-96, aes128-cts-hmac-sha1-96
#销毁持有的ticket
[root@hadoop002 ~]# kdestroy
[root@hadoop002 ~]# klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
在Cloudera Manager上启动Kerberos
Important:
- If you have enabled YARN Resource Manager HA in your non-secure cluster, you should clear the StateStore znode in ZooKeeper before enabling Kerberos. To do this:
- Go to the Cloudera Manager Admin Console home page, click to the right of the YARN service and select Stop.
- When you see a Finished status, the service has stopped.
- Go to the YARN service and select Actions > Format State Store.
- When the command completes, click Close.
-
进入Cloudera Manager
-
Administratio > Kerberos
-
点击Enable Kerberos
首先
{F332}
有四个前置条件
-
有正在运行的KDC(即Kerberos Server),前置条件已经搭建。
-
KDC配置为非零生命周期且可更新,前置条件已经配置。
-
OpenLdap,这里没有用到。
-
已创建远端登陆管理员帐户。
下一步1
{F334}
都很明显
下一步2
{F336}
在搭建KDC时已经手动同步了krb5.conf,因此这里不打勾。
实际上在这里扔给Cloudera Manager管理会好一点。
下一步3
{F338}
远端principal的名称和密码
下一步4
{F340}
导入principal
下一步5
{F342}
配置Cloudera Manager为群集中的服务创建的Principals的名称
下一步6
{F344}
默认配置即可
下一步7
{F346}
这一步由于之前在测试的时候创建了同样的principals没有删除而出错了。只要确认KDC里面没有群集服务要使用的principals名称就不会出错。
查看principals
{F348}
到这里基本上就算完工了。接下来就是使用hdfs,跑mapreduce测试权限认证有没有正常运作。
注:运行MR2时,要清空yarn/nm/usercache下的用户缓存文件。在SIMPLE模式下和在KERBORES模式下建立的文件权限不一样。
验证权限认证系统正常运行
认证当前用户并获得ticket,principal格式为: username@YOUR-REALM.COM(需提前在KDC添加principal)
[localhost@hadoop001 ~]$ kinit
Password for localhost@CDP.COM:
[localhost@hadoop001 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: localhost@CDP.COM
Valid starting Expires Service principal
09/10/15 19:24:51 09/11/15 19:24:51 krbtgt/CDP.COM@CDP.COM
renew until 09/10/15 19:24:51
#### 运行hadoop mapreduce任务
结果
[localhost@hadoop001 ~]$ hadoop jar /DATA/cloudera/parcels/CDH-5.4.4-1.cdh5.4.4.p0.4/jars/hadoop-examples.jar pi 10 10000
Number of Maps = 10
Samples per Map = 10000
...
Job Finished in 49.05 seconds
Estimated value of Pi is 3.14120000000000000000
运行hive beeline
[localhost@hadoop001 ~]$ beeline
Beeline version 1.1.0-cdh5.4.4 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000/;principal=hive/hadoop001@CDP.COM
scan complete in 5ms
Connecting to jdbc:hive2://localhost:10000/;principal=hive/hadoop001@CDP.COM
Enter username for jdbc:hive2://localhost:10000/;principal=hive/hadoop001@CDP.COM:
Enter password for jdbc:hive2://localhost:10000/;principal=hive/hadoop001@CDP.COM:
Connected to: Apache Hive (version 1.1.0-cdh5.4.4)
Driver: Hive JDBC (version 1.1.0-cdh5.4.4)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000/> show databases;
+-----------------+--+
| database_name |
+-----------------+--+
| default |
| hive_auth_test |
+-----------------+--+
4 rows selected (3.639 seconds)
0: jdbc:hive2://localhost:10000/> select * from hive_auth_test.t1;
+--------+--+
| t1.id |
+--------+--+
| 0 |
| 1 |
+--------+--+
2 rows selected (1.635 seconds)
0: jdbc:hive2://localhost:10000/>