Hadoop Kerberos
一、背景
在Hadoop1.0.0或者CDH3 版本之前, hadoop并不存在安全认证一说。默认集群内所有的节点都是可靠的,值得信赖的。
导致存在恶意用户伪装成真正的用户或者服务器入侵到hadoop集群上,恶意的提交作业,修改JobTracker状态,篡改HDFS上的数据,伪装成NameNode 或者TaskTracker接受任务等。
二、安全问题
2.1 用户到服务器的认证问题
- NameNode上没有用户认证:用户可以伪装成其他用户入侵到一个HDFS或者MapReduce集群上
- DataNode对读入输出没有认证:如果一些客户端知道blockID,就可以任意访问DataNode上block的数据
- JobTracker上没有认证:可以任意杀死或更改用户的jobs,可以更改JobTracker的工作状态
2.2 服务器到服务器的认证问题
没有DataNode,TaskTracker的认证,用户可以伪装成datanode,tasktracker去接受JobTracker,NameNode的任务指派
三、kerberos解决的安全认证问题
kerberos实现的是机器级别的安全认证。
3.1 解决服务器到服务器的认证
由于kerberos对集群里的所有机器都分发了keytab,相互之间使用密钥进行通信,确保不会冒充服务器的情况。集群中的机器就是它们所宣称的,是可靠的。防止了用户伪装成Datanode,Tasktracker,去接受JobTracker,Namenode的任务指派。
3.2 解决client到服务器的认证
Kerberos对可信任的客户端提供认证,确保他们可以执行作业的相关操作。防止用户恶意冒充client提交作业的情况。用户无法伪装成其他用户入侵到一个HDFS 或者MapReduce集群上。用户即使知道datanode的相关信息,也无法读取HDFS上的数据,用户无法发送对于作业的操作到JobTracker上
3.3 对用户级别上的认证并没有实现
无法控制用户提交作业的操作。不能够实现限制用户提交作业的权限。不能控制哪些用户可以提交该类型的作业,哪些用户不能提交该类型的作业。这些由ACL模块控制(参考)
四、Kerberos工作原理介绍
4.1 基本概念
Kerberos由三个成员组成的
Key Distribution Center(KDC)钥匙分发中心,核心组件,类似于CA,kdc的端口默认为88。
Application Server(Network services)应用程序。
Client users客户端。
Principals.代理人,角色。
一个最基本的单位是Principal
Ticket:票据,用户用它来向服务器证明自己的身份,包括客户标识、会话密钥、时间戳。
AS (Authentication Server): 认证服务器
TGS(Ticket Granting Server): 许可证服务器
Kerberos
Kerberos是一个用于鉴定身份(authentication)的协议, 它采取对称密钥加密(symmetric-key cryptography),这意味着密钥不会在网络上传输。在Kerberos中,未加密的密码(unencrypted password)不会在网络上传输,因此攻击者无法通过嗅探网络来偷取用户的密码。
Kerberos利用对称加密和受信任的第三方(即KDC, key distribution center)来鉴别要求使用网络服务的用户的身份。所有有KDC和secondary KDC管理的主机构成了一个域(realm)。
当一个用户的身份通过了KDC的验证后,KDC会向该用户发送一个证书/票据(该证书/票据是与这次会话绑定的),其他kerberized services会在该用户的主机上搜索该ticket,而不是要求用户使用密码来验证他的身份。
Principal
一个用户会以一个独一无二的身份来被KDC认证,该身份被称为principal。
一个Principal由三个部分组成:primary, instance以及realm,其组成形式为primary/instance@realm。
primary: 用户/服务名
instance: 用于区分属于同一个user或者service的多个principals,该项为optional;
realm: kerberos的域,定义了一组principals
4.2 认证详细原理
Kerberos实际上一个基于Ticket的认证方式。
Client想要获取Server端的资源,先得通过Server的认证;而认证的先决条件是Client向Server提供从KDC获得的一个有Server的Master Key进行加密的Session Ticket(Session Key + Client Info)。
可以这么说,Session Ticket是Client进入Server领域的一张门票。而这张门票必须从一个合法的Ticket颁发机构获得,这个颁发机构就是Client和Server双方信任的KDC,同时这张Ticket具有超强的防伪标识:它是被Server的Master Key加密的。
对Client来说,获得Session Ticket是整个认证过程中最为关键的部分。
管理KDC服务器命令
# 登陆集群
ssh username@ip
# 获取集群root权限
sudo -i
# 登陆管理KDC服务器
kadmin.local
# 查看用户列表
listprincs
# 创建principal
add_principal principalName
# 删除principal
delete_principal principalName
使用kerberos命令
# 动态认证
kinit -kt /etc/security/keytabs/hdfs.keytab hdfs
# 查看登陆状态
klist
# 退出
kdestroy
# beeline连接hive
beeline -u "jdbc:hive2://192.168.90.11:10000/default;principal=hive/cdh-master.dev.AAAA.local@HADOOP.COM"
kerberos和Ldap
Kerberos之前是使用crypt的加密算法加密的密码。密码还是在互联网上传输的。
Kerberos传输的是票(tickets)
Secure network authentication system
Based around credentials called tickets.基于对身份验证的方法实现验证,这种方式被成为票。
Tickets secured by secret key encyption.票的安全是通过私钥加密的,因此Kerberos就是要保障票的安全
Kerberos是安全的网络认证系统,它是专门用来做认证的。
认证体系是由两部分组成的。
NSS提供账号。LDAP /etc/nsswitch.conf
PAM提供认证。Kerberos /etc/pam.d/system-auth
账户信息和密码信息都是有LDAP提供的。system-config-authentication
正常情况下是客户端访问服务由服务保障安全,但是现在客户端将请求发送给KDC,由KDC来保障服务的安全。
Ldap
LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。
LDAP支持TCP/IP。
LDAP目录以树状的层次结构来存储数据。
LDAP访问控制异常灵活和丰富。
访问控制
虽然LDAP并无访问控制的标准,但从一些草案中或是事实上LDAP产品的访问控制情况,我们不难看出:LDAP访问控制异常的灵活和丰富,在LDAP中是基于访问控制策略语句来实现访问控制的,这不同于现有的关系型数据库系统和应用系统,它是通过基于访问控制列表来实现的,无论是基于组模式或角色模式,都摆脱不了这种限制
而对于LDAP,用户数据管理和访问标识是一体的,应用不需要关心访问控制的实现。这是由于在LDAP中的访问控制语句是基于策略语句来实现的,无论是访问控制的数据对象,还是访问控制的主体对象,均是与这些对象在树中的位置和对象本身的数据特征相关。
在LDAP中,可以把整个目录、目录的子树、制定条目、特定条目属性集或符合某过滤条件的条目作为控制对象进行授权;可以把特定用户、属于特定组或所有目录用户作为授权主体进行授权;最后,还可以定义对特定位置(例如IP地址或DNS名称)的访问权。
使用Sentry的角色授权机制
通过Kerberos的hive账户可以在集群上以hive shell的形式进入hive中创建数据库和表
通过beeline连接Hive Server2来创建角色和组:
通过Kerberos认证进入beeline
通过LDAP的hive账号进入beeline,hive默认为admin权限