为什么需要kerberos
cdh集群搭建好以后,你可能已经成功地入坑了,因为后面还有很多问题,例如,数据安全的问题等。当你的cdh集群搭建好以后,你会发现他是没有任何权限控制的,所有人只要能够访问到你的ip和端口,就能使用你的服务。并且,你的hdfs中的数据更是毫无安全可言,只需要在一个客户端电脑上的hadoop fs
命令前面加上sudo -u hdfs
,就能够拥有最高权限因为谁都可以是hdfs。
从security的角度来讲,它包含两个部分,分别是Authentication和Authorization,简单来讲,Authentication就是证明你就是你(用户名+密码),而Authorization则规定了你可以做什么,例如,可以使用hdfs但不能使用spark。
kerberos的组成部分
本篇的主题kerberos就是用来做Authentication的。下面先介绍一下kerberos中的一些基本概念
- principal:可以理解为是账号,在kerberos中,所有的用户、主机、服务都会表示为一个principal
- realms:每一个kerberos服务器都有一个唯一的realm,所有希望使用kerberos服务的主机需要配置同一个realm。
- Key Distribution Center(KDC):包含三部分,分别是:一个包含所有principal的数据库,一个 authentication server,和一个ticket granting server.
当一个用户想要访问一个服务时,需要一个ticket,就需要向ticket granting server申请一个ticket,而向ticket granting server申请ticket之前要先拿到ticket granting ticket。拿到ticket granting ticket有两种方法,一种是principal+密码,另一个是principal+keytab文件,这两种方法是等价的,principal+keytab文件一般是分配给服务的。
如果你不是很明白,没关系,接着往下看吧。
搭建MIT kerberos server
找一台服务器,将它的hostname设置为kdc.yourdomain.com
,将域名修改为你公司的域名(按照kerberos的惯例),或者你的名字也可以。然后执行下面的apt命令
sudo apt-get install krb5-admin-server krb5-kdc
安装期间会让你输入三次信息分别是
- Default Kerberos version 5 realm,输入你的主域名,按照惯例用大写,如YOURDOMAIN.COM
- Kerberos servers for your realm,输入你的主机名,如,kdc.yourdomain.com
- Administrative server for your realm,输入你的主机名,如,kdc.yourdomain.com
安装完之后,检查一下/etc/krb5.conf
文件,检查以下信息
[realms]
YOURDOMAIN.COM = {
kdc = kdc.yourdomain.com
admin_server = kdc.yourdomain.com
}
如果没问题,则打开vi /etc/krb5kdc/kdc.conf
文件,将supported_enctypes一行的aes256-cts:normal
删除掉。这样做事为了避免在cdh集群中安装JCE Policy File。
确定无误后,执行下面的命令来创建realm数据库
sudo krb5_newrealm
这个命令可能会执行二十分钟左右。请确保你执行此命令时具有root权限或者使用了sudo,否则二十分钟之后会告诉你权限不足,还要再来一次。(我当然没有犯过这个错误了)
设置管理员账号
接下来设置一个管理员账号。管理员账号可以用来远程执行kadmin
命令。kadmin命令经常用来创建principal、生成keytab文件等。由于我们是在本机上操作,所以直接使用kadmin.local
命令就行。
使用sudo kadmin.local
命令进入交互模式,输入?
可以查看帮助
输入addprinc admin/admin
,然后输入两次密码,管理员账号就创建好了。
接下来配置一下acl文件,位于/etc/krb5kdc/kadm5.acl
将*/admin *
这一行的注释删掉,保留这一行的内容,意味着所有admin的角色可以执行所有的操作。
使用命令重启两个服务
$ sudo service krb5-kdc restart
$ sudo service krb5-admin-server restart
验证kerberos server是否可用
使用kinit命令来获取一个ticket granting ticket
$ kinit admin/admin
输入admin/admin的密码,则获取到了ticket granting ticket。拿到ticket granting ticket后,你就有资格向ticket granting server申请ticket了。
cdh中集成kerberos
在cdh中集成kerberos比较容易,难点就在于你对kerberos本身的理解以及一个可用的kerberos server。在cdh的cluster的action列表中,选择enable kerberos,然后进入一个向导,你跟着向导一步一步去做就好了。
请参考官方文档 https://www.cloudera.com/documentation/enterprise/5-13-x/topics/cm_sg_intro_kerb.html
打开后,这个页面其实只是一个概览,左侧的文章列表中有九篇文章,分别是step 1 至 step 9。
具体的过程,请仔细阅读官方文档。在本篇博客中,我仅列出几个需要注意的点
- 执行这个向导之前,务必将集群备份一下,因为如果出错的话,整个集群可能都会出问题
- 请确保执行向导之前
kadmin
命令可以使用的,这个命令特别喜欢发神经,时好时坏。如果出现了这个错误:kadmin: GSS-API (or Kerberos) error while initializing kadmin interface
,目前我没有什么好的办法,等半个小时后再试试吧。知道kadmin的shell能够工作,再开始运行向导。 - 向导中会让你输入一个账号,没有必要再创建额外的账号,就用上面创建的管理员账号(admin/admin)就好,否则cdh将没有权限创建principal并导出keytab文件
- 如果启用kerberos后hdfs的namenode起不来了,
Login failed for user: hdfs from keytab hdfs.keytab Receive timed out
,请确保你的防火墙是否开通了UDP的端口。
管理kerberos
cdh集成了kerberos以后,想使用cdh集群的其它服务都需要经过kerberos的认证,下面是比较常用的方式。
登录到kerberos server主机,使用sudo kadmin.local
进入kadmin的shell,然后创建principal和keytab文件
创建principal
addprinc -randkey myservice/myhost
创建keytab文件
ktadd -norandkey -k myservice.myhost.keytab myservice/myhost
-k
参数参数指定了keytab文件的文件名。当前目录下就会有一个名叫myservice.myhost.keytab
的文件,就是我们需要的keytab文件
然后输入q
命令退出kadmin shell。接下来将keytab文件scp到指定的服务器。
在别的服务器上想要使用kerberos服务的话,需要先安装必要的组件。
ubuntu下使用下面的命令来安装
sudo apt install krb5-user libpam-krb5 libpam-ccreds auth-client-config
centos下使用下面的命令来安装
yum install krb5-workstation
安装以后,修改/etc/krb5.conf
文件,需要包含以下内容
[libdefaults]
default_realm = YOURDOMAIN.COM
[realms]
YOURDOMAIN.COM = {
kdc = kdc.yourdomain.com
admin_server = kdc.yourdomain.com
}
接下来使用keytab文件创建credencial
kinit -kt myservice.myhost.keytab myservice/myhost
-kt
参数指明了keytab文件的位置,后面加上principal的信息。然后使用klist
命令查看是否成功
关于kerberos,请参考
https://help.ubuntu.com/lts/serverguide/kerberos.html
http://blog.manula.org/2012/04/setting-up-kerberos-server-with-debian.html