hadoop大数据中认证一般用keberos,授权用ranger,kerberos和Ldap组件共同组成整个集群的安全鉴权体系,Ldap负责用户数据存储。
kerberos
Kerberos 是一种网络认证协议,用于在不安全的网络中以安全的方式对用户和服务进行身份验证。它通过使用密钥加密技术来防止数据被窃听或篡改,确保了认证过程的安全性。kerberos所管理的一个用户或者服务叫Principal,其格式通常如下:primary/instance@realm
默认情况下,Hadoop 集群是没有启用安全认证的,我们可以直接连接。然而,在生产环境中,Hadoop 集群通常会启用安全认证,例如 Kerberos 认证。在TBDS产品中创建hadoop集群时,可以选择是否开启kerberos认证,并且每个用户创建时,系统会生成一个keytab文件。
Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件。Keytab文件作为向Kerberos系统提供服务的凭证,在不需要用户提供用户名和密码的情况下进行身份验证。
生成keytab文件:
#登录
kadmin -p your_principal@YOUR_REALM -r YOUR_REALM#添加用户:
addprinc new_principal
#生成keytab
ktadd -k /home/user01/user01.keytab -norandkey user01
#认证
kinit -kt /home/user01/user01.keytab user01
以Java为例,使用kerberos生成的keytab文件认证进行登录hadoop的主要api和代码如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.fs.FileSystem;public static void main(String[] args) throws Exception {System.setProperty("java.security.krb5.conf", "/path/to/krb5.conf");Configuration configuration = new Configuration();configuration.set("hadoop.security.authentication", "Kerberos");// 使用UserGroupInformation登录UserGroupInformation.setConfiguration(configuration);UserGroupInformation.loginUserFromKeytab("kerberos_user_principal", "/path/to/kerberos_user.keytab");// 获取认证后的UserGroupInformation实例UserGroupInformation ugi = UserGroupInformation.getLoginUser();// 使用doAs方法执行需要认证的操作ugi.doAs(new PrivilegedExceptionAction<Void>() {public Void run() throws Exception {FileSystem fileSystem = FileSystem.get(configuration);// 执行文件系统操作return null;}}
如果将kerberos与LDAP集成通常采用以下架构:
客户通过kerberos获取票据,然后使用LDAP进行用户身份验证。LDAP服务器作为用户身份信息的存储库,使用kerberos票据进行身份验证。流程如下:
ldap
https://cloud.tencent.com/developer/article/2040490
Ldap是一种轻量级目录访问协议,数据被组织成树状目录,访问速度非常快,但是写性能差,且不支持事务。适用于数据量少,一次写多次读的场景,基本局限于用户、账户数据存储。Linux系统开源Ldap软件是OpenLDAP,Windows系统则是AD(Active Directory)。Ldap目录数据库中数据组织结构实例如下:
数据的最小粒度是Entry(条目),每个条目用户唯一标识名(例如admin用户的标识名就是User=admin: Group:干部:OU=人事部:O=A公司)。每个Entry可以有多个属性(Attribute)(例如邮箱、地址等)。条目相当于关系https://cloud.tencent.com/solution/database?from_column=20065&from=20065中表的记录;条目是具有区别名DN(Distinguished Name)的属性(Attribute)集合,DN相当于关系数据库表中的关键字(Primary Key);属性由类型(Type)和多个值(Values)组成,相当于关系数据库中的域(Field)由域名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率使用基于索引的文件数据库,而不是关系数据库。
大数据各服务组件不会直接去访问操作系统Ldap去获取用户数据,避免大量客户端连接造成认证服务器负载过高,客户端访问操作系统sssd服务(操作系统缓存服务守护进程)去获取用户数据(执行id命令),而sssd会从Ldap中获取用户信息。
LDAP是一个存储静态相关信息的服务,适合“一次记录多次读取”。LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
LDAP目录和UNIX文件系统之间有三点不同:
第一是LDAP模型没有真正的根条目。文件系统有一个根目录,它是所有文件和目录的祖先。在LDAP目录中,根条目是概念性的,不作为一个可以存放数据的条目存在。
第二是目录的每个节点都可以包含数据,任何节点都可能作为一个容器,即LDAP条目允许在他的下面有子节点。文件系统的每个节点或者是文件或者是目录,但不能同时是二者。在文件系统中,只有目录可以有子节点,而且只有文件可以包含数据。LDAP中的条目既可以是数据同时也可以兼任目录的角色。
第三是节点命名方式的不同。LDAP名称与文件系统名称的方向是相反的。文件系统的表示方法是从根目录到深层目录一层一层表示,而LDAP则相反,将叶子节点放在前面逐层目录向上推导,最后写出根目录
LDAP中记录的表示方法,首先确认以下几个概念:
dn :Distinguished Name;唯一可区别的名称,记录了一条记录的位置,相当于主键
dc :domain component一条记录所属区域(域名)
ou :Organization Unit;一条记录所属组织(组织机构,部门)
cn/uid:Common Name;可用来区分身份的属性,等同于一条记录的名字/ID
一个完整的dn如下所示,以此查询得到一条完整的记录,然后再根据需要取出其中的指定的属性(Attribute)的值。
dn:cn=cc,ou=imcuser-test-ld,dc=zhjdtest,dc=com
dn是从树的叶子节点逐层向根节点推导出的一条唯一路径,表明了这个数据结构中的唯一一条记录。
ranger
ranger允许用户使用一个管理工具对hadoop中的组件和工具进行细粒度的授权,支持对hadoop组件所有设计安全的审计行为集中化管理,它支持的框架包括hadoop、hive、hbase、knox、kafka、yarn,比如对于hive来说,安装ranger hive-plugin插件,通过页面可以用ranger来授予用户对于库、表、函数的权限。对于hdfs,可以为hdfs用户配置hdfs文件或目录的读写执行权限。
总的来说ranger可以设置对于各个资源的读、写、执行权限,Raner是由三个部分组件:Ranger Admin 、Ranger Usersync 与Ranger plugin组成
组件名称 说明
Admin Ranger Admin Portal是安全管理的中心接口。 用户可以创建和更新策略,这些策略存储在策略数据库中。 每个组件内的Plugins会定期轮询这些策略。Portal还包括一个审计服务器,它发送从插件收集的审计数据,以便存储在HDFS或关系数据库中
UserSync 同步实用工具来从Unix或LDAP或Active Directory中拉取用户和组。 用户或组信息存储在Ranger门户中,用于策略定义。
PlugIn 插件是嵌入每个集群组件进程的轻量级Java程序。 例如,Apache Hive的Apache Ranger插件嵌入在Hiveserver2中。 这些插件从中央服务器提取策略,并将它们本地存储在一个文件中。 当用户请求通过组件时,这些插件拦截请求并根据安全策略进行评估。 插件还可以从用户请求中收集数据,并按照单独的线程将此数据发送回审计服务器
在ranger部署好后,可以直接通过ui界面进行授权: