大数据集群最基本的就是数据以及用于计算的资源,是一个公司的宝贵财富,我们需要将它们很好管理起来,将相应的数据和资源开放给对应的用户使用,防止被窃取、被破坏等,这就涉及到大数据安全。
目前我们大数据集群的现状是处于裸奔状态,只要可以登录linux机器即可对集群继续相关操作
所以集群安全对于我们来说迫在眉睫,主要需求有以下几个方面:
目前比较常见的安全方案主要有三种:
Kerberos是一种基于对称密钥的身份认证协议,它作为一个独立的第三方的身份认证服务,可以为其它服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务如HBase/HDFS等)。
服务名 | 作用 |
---|---|
KDC | Kerberos的服务端程序,用于验证各个模块 |
Client | 需要访问服务的用户,KDC和Service会对用户的身份进行认证 |
Service | 即集成了Kerberos的服务,如HDFS/YARN/HBase等 |
Kerberos协议过程主要有三个阶段,第一个阶段Client向KDC申请TGT,第二阶段Client通过获得的TGT向KDC申请用于访问Service的Ticket,第三个阶段是Client用返回的Ticket访问Service。
优点:
服务认证,防止broker datanode regionserver等组件冒充加入集群
解决了服务端到服务端的认证,也解决了客户端到服务端的认证
缺点:
kerberos为了安全性使用临时ticket,认证信息会失效,用户多的情况下重新认证繁琐
kerberos只能控制你访问或者拒绝访问一个服务,不能控制到很细的粒度,比如hdfs的某一个路径,hive的某一个表,对用户级别上的认证并没有实现(需要配合LDAP)
Apache Sentry是Cloudera公司发布的一个Hadoop安全开源组件,它提供了细粒度级、基于角色的授权.
优点:
Sentry支持细粒度的hdfs元数据访问控制,对hive支持列级别的访问控制
Sentry通过基于角色的授权简化了管理,将访问同一数据集的不同特权级别授予多个角色
Sentry提供了一个统一平台方便管理
Sentry支持集成Kerberos
缺点:
Apache Ranger是Hortonworks公司发布的一个Hadoop安全组件开源组件
优点:
综上:我们考虑到和开放平台的集成,以及我们的技术栈和集群操作的审计等几个问题最终选用了apache ranger
以RESTFUL形式提供策略的增删改查接口,同时内置一个Web管理页面。
嵌入到各系统执行流程中,定期从RangerAdmin拉取策略,根据策略执行访问决策树,并且记录访问审计
插件名称 | 安装节点 |
---|---|
Hdfs-Plugin | NameNode |
Hbase-Plugin | HMaster+HRegionServer |
Hive-Plugin | HiveServer2 |
Yarn-Plugin | ResourceManager |
对接开放平台,实现对用户、组、策略的管理
访问权限无非是定义了”用户-资源-权限“这三者间的关系,Ranger基于策略来抽象这种关系,进而延伸出自己的权限模型。”用户-资源-权限”的含义详解:
用户
由User或Group来表达,User代表访问资源的用户,Group代表用户所属的用户组。
资源
不同的组件对应的业务资源是不一样的,比如
权限
由(AllowACL, DenyACL)来表达,类似白名单和黑名单机制,AllowACL用来描述允许访问的情况,DenyACL用来描述拒绝访问的情况,不同的组件对应的权限也是不一样的。
插件 | 权限项 |
---|---|
Hdfs | Read Write Execute |
Hbase | Read Write Create Admin |
Hive | Select Create Update Drop Alter Index Lock Read Write All |
Yarn | submit-app admin-queue |
Ranger-Admin职责:
Service Plugin职责:
决策下放:
如果没有policy能决策访问,一般情况是认为没有权限拒绝访问,然而Ranger还可以选择将决策下放给系统自身的访问控制层
组件集成插件原理:
Service | Extensible Interface | Ranger Implement Class |
---|---|---|
HDFS | org.apache.hadoop.hdfs.server.namenode.INodeAttributeProvider | org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer |
HBASE | org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService.Interface | org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor |
Hive | org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAuthorizerFactory | org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory |
YARN | org.apache.hadoop.yarn.security.YarnAuthorizationProvider | org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer |
ranger通过实现各组件扩展的权限接口,进行权限验证
hdfs-site.xml会修改如下配置:
<property>
<name>dfs.permissions.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.permissionsname>
<value>truevalue>
property>
<property>
<name>dfs.namenode.inode.attributes.provider.classname>
<value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizervalue>
property>
加载过程:
在安装完hbase插件后,hbase-site.xml会修改如下配置:
<property>
<name>hbase.security.authorizationname>
<value>truevalue>
property>
<property>
<name>hbase.coprocessor.master.classesname>
<value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessorvalue>
property>
<property>
<name>hbase.coprocessor.region.classesname>
<value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessorvalue>
property>
加载过程:
hiveserver2-site.xml
<property>
<name>hive.security.authorization.enabledname>
<value>truevalue>
property>
<property>
<name>hive.security.authorization.managername>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactoryvalue>
property>
加载过程:
yarn-site.xml
<property>
<name>yarn.acl.enablename>
<value>truevalue>
property>
<property>
<name>yarn.authorization-providername>
<value>org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizervalue>
property>
加载过程:
由于在调用各服务过程中使用hdfs shell、hbase-shell、hive-jdbc只能获取到用户信息,在只有组策略时会匹配不成功,认为没有权限,实现办法是加入ldap组件同步用户组信息,这样增加了系统的复杂性,我们通过改写ranger-admin代码,在客户端plugin获取策略时,将组权限赋予用户,这样就实现了组策略功能。