kerberos 与 sentry 原理及使用

教程 犀牛 ⋅ 于 2021-06-04 15:18:20 ⋅ 1530 阅读

安全认证与权限管理的必要性

  • 非安全集群

file

file

  • 安全认证集群

file

  • 多租户设计愿景

file

kerberos

kerberos原理

Kerberos是一个用于鉴定身份(authentication)的协议, 它采取对称密钥加密(symmetric-key cryptography),密钥不会在网络上传输。在Kerberos中,未加密的密码(unencrypted password)不会在网络上传输,因此攻击者无法通过嗅探网络来偷取用户的密码。

在cdh大数据平台中充当这秘钥的角色,cdh平台中组件会集成kerberos服务,意味着一旦开启,在请求访问组件服务时必须先通过kerberos秘钥认证。

file

认证流程解读:

  1. 用户向KDC的AS请求身份验证

  2. AS给用户返回TGT和SK_TGS包,TGT使用TGS的密码加密,TGT里包含user、address、tgs_name、start_time、lifetime、SK_TGS,其中SK_TGS为用户与TGS的临时sessionkey

  3. 用户封装一个authenticator数据包并使用SK_TGS进行加密,authenticator包含user、address、start_time、lifetime,将封装好的authenticator和第二步AS给发过来的TGT一并发送给TGS

  4. TGS收到用户的数据包之后,使用自己密码解密出来TGT的内容,再使用SK_TGS解密authenticator,对比TGT里用户信息与authenticator里用户信息,验证信息一致后,发送包含SK_server和ST给用户,其中SK_server是用户与server的临时sessionkey,SK_server使用SK_TGS加密,ST包包含user、address、start_time、lifetime、SK_server,ST使用server密码进行加密

  5. 用户收到包之后使用SK_TGS解密SK_server,使用SK_server加密一个authenticator包,包含user、address、start_time、lifetime内容,然后将ST包与authenticator一并发送给server

  6. server收到后使用自己密码解密ST包,得到用户信息与SK_server,再使用SK_server解密authenticator得到用户发来的用户信息,对比两个用户信息是否一致,通过验证后给用户发送ack消息,ack消息里面会包含用户server信息,供用户验证server是否为伪造

kerberos使用

  • 管理员模式进入
kadmin.local
  • 创建principal
addprinc -pw password hdfs@HADOOP.CN
  • 生成keytab
xst -norandkey -k /data/hdfs.keytab hdfs
  • kerberos认证
#认证方式一,使用keytab认证
kinit -kt /data/hdfs.keytab hdfs
#认证方式二,是用主体加密码的方式认证
kinit hdfs
password
  • 查看当前票据
klist
  • 验证hadoop操作
hadoop fs -mkdir -p /data/test

file

  • 注销当前票据
kdestroy
  • 删除主体
delprinc '主体名'
  • 启用kerberos认证环境下连接hive
1. kinit -kt /data/xxxx.keytab xxxx或者kinit xxxx 输入密码
2. beeline -u "jdbc:hive2://worker-1:10000/;principal=hive/worker-1@HADOOP.CN"

sentry

sentry原理

sentry是Cloudera公司开源开源组件,后贡献给给Apache,提供数据访问控制,并且支持细粒度权限控制,支持hive、impala、hbase等

sentry组成分为三部分:

  1. binding层

本层有两个功能实现:

  • 实现请求拦截

  • 接管grant/revoke功能
  1. policy engine层
  • 接收到binding层权限请求,对比provider层查询返回的服务端权限是否一致
  1. policy provider层
  • 查询服务端权限,沟通sentry权限管理元数据库

sentry权限管理流程图:

file

sentry权限管理-hive

  • 通过kerberos认证连接hive
kinit /data/hive.keytab hive
  • 使用kerberos认证方式登录hive
beeline -u "jdbc:hive2://worker-1:10000/;principal=hive/worker-1@HADOOP.CN"
  • sentry操作
-- 创建角色
create role user1_role;
-- 给角色赋予数据库权限
grant all on database db1 to role user1_role;
-- 给角色赋予表权限
grant select on table db2.test2 to role user1_role;
-- 给角色赋予表中的某一列的权限
grant select(id) on table db2.test2 to role user1_role;
-- 授权角色给用户组
grant role user1_role to group user1;
-- 删除角色
drop role user1_role;
-- 查看角色权限
show grant role user1_role on database db1;
show grant role user1_role on table test1;
-- 权限收回
revoke select on table db2.test2 from role user1_role;
revoke all on database db2 from role user2;
-- 查看某个组都授权了哪些角色
show role grant group hainiu;

sentry权限管理-hbase

  • HBase ACLs的访问分为5个级别:

    Read(R) : 可以读取给定范围内数据的权限

    Write(W) : 可以在给定范围内写数据

    Executor(X) : 可以在指定表执行Endpoints类型的协处理

    Create(C) : 可以在给定范围内创建和删除表(包括非该用户创建的表)

    Admin(A) : 可以执行集群操作,如平衡数据等

  • hbase权限验证

使用xinniu用户登录hbase

kinit -kt /data/xinniu.keytab xinniu
whoami
list
create 'testacl','cf'

file

开启sentry后因为没有给xinniu用户授权所以该用户没有任何权限,list为空,也没有创建表的权限。

使用超级管理员测试

kinit -kt /data/hbase.keytab hbase
hbase shell
list
create 'testacl','cf'

file

可以发现超级用户是可以操作的,但是这不符合我们多租户设计的愿景

  • 使用超级用户给普通用户授权
grant '@xinniu','CA'
#当@出现在第一个参数位置的时候,代表的是用户组
user_permission '.*'

file

给xinniu组赋予创建和admin全局权限

当为用户或用户组拥有CA权限时,用户和用户组创建表时会默认的为当前操作用户添加该表的RWXCA权限;

通过user_permission ‘.*’查看当前HBase所有的授权;

拥有Admin(A)权限的用户,可以为其它用户进行任何级别授权,在使用HBase授权时需要慎用;

在CDH中HBase支持Global、NameSpace、Table、ColumnFamily范围授权,无法支持Row级别授权;

  • 再次验证xinniu用户组权限

file

命名空间acl授权

上面我们使用xinniu用户创建了命名空间‘xinniu’,接下来对‘xinniu’命名空间进行权限管理,将命名空间权限赋予其他用户liukunfeng

#当@出现在第三个参数位置的时候代表的是命名空间,第一个参数是你给哪个用户赋权,第二个参数代表给什么权限,第三个参数是命名空间
grant 'liukunfeng','RWXCA','@xinniu'

file

如上,该用户可以操作xinniu命名空间。

file

但是当该用户再去操作默认命名空间default的时候就报错了。

表acl授权

file

#使用超级管理员用户,创建一个新的命名空间,并且创建两张表,同时插入数据
create_namespace 'xinniu1'
create 'xinniu1:tableacl','cf'
put 'xinniu1:tableacl','x0002','cf:datadate','20210518'
create 'xinniu1:tableacl1','cf'
put 'xinniu1:tableacl1','x0002','cf:datadate','20210518'

file

#给liukunfeng用户xinniu1:tableacl的所有权限
grant 'liukunfeng','RWXCA','xinniu1:tableacl'

使用liukunfeng用户进行测试

file

此时发现该用户只能查看到tableacl表,不能看到tableacl1。

列族acl授权

使用超级管理员创建新的命名空间,并且创建表(多列族)

create_namespace 'xinniu2'
create 'xinniu2:cfacl','cf1','cf2'
put 'xinniu2:cfacl','x0001','cf1:datadate','20210518'
put 'xinniu2:cfacl','x0002','cf2:etldate','20210518'

给其他用户授权指定列族

grant 'liukunfeng','RW','xinniu2:cfacl','cf1'

file

权限收回

收回谁在哪里的权限

revoke 'liukunfeng', 'xinniu2:cfacl', 'cf1'

file

file

本章小结

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-犀牛,http://hainiubl.com/topics/75614
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter