Hadoop安全问题:
1:非法的slave节点添加
2:非法的客户端添加
3:非法的应用添加
4:用法身份造假
5:Web界面随意访问
究其原因还是安全的问题
默认支持的安全协议
1:simple,简单,适合单一团队使用
2:kerberos,复杂,配置麻烦,但是较安全。能解决上述问题。
Hadoop安全背景:
共享集群
按照业务或应用的规则划分资源队列,并分配给特定用户
HDFS上存放各种数据,包括公共的、机密的重要概念
安全认证:确保某个用户是自己声称的那个用户
安全授权:确保某个用户只能做他允许的那些操作
User:Hadoop用户,可以提交作业,查看自己作业状态,查看HDFS上的文件
Service:Hadoop中的服务组件,包括:namenode,resourcemanager,datanode,nodemanager
Kerberos解决安全认证问题
kerberos实现的是机器级别的安全认证,也就是服务到服务的认证
解决服务器到服务器的认证
防止了用户伪装成Datanode,Tasktracker,去接受JobTracker,Namenode的任务指派
解决client到服务器的认证
Kerberos对可信任的客户端提供认证,确保他们可以执行作业的相关操作
对用户级别上的认证并没有实现
无法控制用户提交作业的操作
ACL解决安全授权问题
通过访问控制列表(ACL)实现的
按照授权实体,ACL可分为队列访问控制列表、应用程序访问控制列表和服务访问控制列表
HDFS的文件访问控制机制
与当前Unix的一致,即将权限授予对象分为用户、同组用户和其他用户
且可单独为每类对象设置一个文件的读、写和可执行权限
用户和用户组的关系是插拔式的,默认情况下共用Unix/Linux下的用户与用户 组对应关系
Kerberos原理简介
目的:1:简单介绍kerberos的原理;2:为后面介绍hadoop的安全管理做准备
如下图是我自己画的图(因为网上找不到符合我意图的图)
以前我们客户端访问服务端,通过网络,输入服务端的用户名和密码。但是这样的方式不安全,于是有了kerberos方案。
kerberos
条件:
Kerberos服务里面已经存了客户端和服务端的信息。
过程:
1:客户端把自己的用户名和密码发送给kerberos去请求一张TGT(票据)
2:当kerberos收到请求以后会生产一个session key,这个session key其中一份拷贝用客户端的用户名和密码加密。Kerberos把这个加密的session key返回给客户端。
客户端会用自己的用户名和密码来解密,如果解密成功了,就说明认证成功了,同时也获得了TGT(session key)
3:客户端要想访问服务端,还得继续请求到服务端的TGT。Kerberos收到请求后,再生产一个session key。这个session key 有两份拷贝,第一份拷贝用第一次产生的session key加密,第二份拷贝用服务端的密码加密。
4:步骤3产生的两份session key返回给客户端。用第一次产生的sessio key加密的,客户端能解密(因为在步骤2的时候已经获得了这个session key(TGT))。但是用服务端密码加密的这个session key 客户段是无法解密的。
目前,客户段一共获得三个session key:a :步骤2获得的session key ;b: 用a session key解密出来的session key;c:未能解密的用服务端密码加密的session key。
5:b session key获取当前的时间戳,用自己去加密。然后把a b c三份session key 发送给服务端。
b session key 服务端可以用自己的密码来解密出来,这个时候就获得了一个session key.然后用这个session key 去解密这个加密的时间戳。如果时间戳能解密出来。说明认证成功,是由同一个kerberos管理的。
更详细的图:
Kerberos在hadoop中的应用
使用kerberos的原因
可靠
Hadoop本身并没有认证功能和创建用户组功能,使用依靠外围的认证系统
高效
Kerberos使用对称钥匙操作,比SSL的公共密钥快
操作简单
Kerberos依赖于第三方的统一管理中心--KDC,管理员对用户的操作直接作用在KDC上
整理的访问控制协议
Hadoop2.0认证机制
YARN中的各类Token及其作用
ResourceManager Delegation Token
ResourceManager授权令牌
持有该令牌的应用程序及其发起的任务可以安全地与ResourceManager交互
YARN Application Token
用于保证ApplicationMaster与ResourceManager之间的通信安全
由ResourceManager传递给NodeManager
该Token的生命周期与ApplicationMaster实例一致
YARN NodeManager Token
用于保证ApplicationMaster与NodeManager之间的通信安全
ResourceManager发送给ApplicationMaster
NodeManager向ResourceManager注册和心跳时领取
YARN Localizer Token
ARN Container Token
ApplicationMaster与NodeManager通信启动Container时需要出示
ResourceManager发送给ApplicationMaster
NodeManager向ResourceManager注册和心跳时领取
MapReduce Client Token
用于保证MR JobClient与MR Application Master之间的通信安全
ResourceManager在作业提交时创建并发送给JobClient
MapReduce Job Token
用于保证MapReduce的各个Task与MR Application Master之间的通信安全
由ApplicationMaster创建并传递给NodeManager
MapReduce Shuffle Secret
用于保证shuffle过程的安全
HDFS通信协议
Yarn通信协议
访问控制列表(ACL)
队列访问控制列表
YARN将用户/用户组分成若干队列,并可指定每个用户/用户组所属的队列
每个队列包含两种权限:提交应用程序权限和管理应用程序权限
通过配置文件mapred-queue-acls.xml设置
应用程序访问控制列表
应用程序对外提供一些特殊的可直接设置的参数
比如用户可以通过参数mapreduce.job.acl-view-job 和mapreduce.job.acl-modify-job为每个作业单独设置查看和修改权限
服务访问控制列表
控制只有那些经过授权的客户端才能访问对应的服务
服务访问控制是通过控制各个服务之间的通信协议实现的
在hadoop-policy.xml文件进行配置