CDH 安全
hadoop的HDFS和mapreduce均缺乏相应的安全机制,比如在HDFS中,用户只要知道某个block的blockID,便可以绕过NameNode直接从DataNode上读取该block,用户可以向任意DataNode上写block;在MapReduce中,用户可以修改或者杀掉任意其他用户的作业等。为了增强hadoop的安全机制,从2009年起,Apache专门抽出一个团队,从事为hadoop增加基于kerberos和Deletion token的安全认证和授权机制工作。
下面我就会通过实际的配置案例来演示hadoop的认证(kerberos)和授权(sentry)实现。
特别说明:本次试验环境,基于上一篇博文(CDH和CM介绍及搭建)的环境进行操作。
hadoop集群的认证安全kerberos
Kerberos 介绍
Kerberos 几乎是hadoop集群唯一可用的安全认证的保证机制。为什么我要需要kerberos呢?因为hadoop集群默认采用基于操作系统账号的simple认证,基本没有安全性保证,用户只需要在客户端的操作系统上建立一个同名账号,就可以伪装成任何用户访问集群。为此我们就需要更强的认证机制。
Kerberos的认证过程如下图所示:
kerberos几个重要的基础概念如下表:
kerberos 的配置
在Hadoop1上执行以下操作,安装kerberos服务器和客户端
# yum -y install krb5-server krb5-libs krb5-workstation
修改kdc.conf配置文件,设置租约续期的最长时间,其余均为默认设置
[root@hadoop1-fblinux ~]# cat /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] HADOOP.COM = { # 起的名字 #master_key_type = aes256-cts # 此配置项是加密的算法,如果启用aes256,需要JDK上打过JCE补丁,我们已经打过,实际上可以启用。 max_renewable_life = 7d 0h 0m 0s # 为租约续期的最长时间 acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal }
修改krb5配置文件,设置kdc server信息和认证的域
[root@hadoop1-fblinux ~]# cat /etc/krb5.conf # Configuration snippets may be placed in this directory as well includedir /etc/krb5.conf.d/ [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] dns_lookup_realm = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt default_realm = HADOOP.COM [realms] HADOOP.COM = { kdc = 192.168.201.151 admin_server = 192.168.201.151 } [domain_realm] .hadoop.com = HADOOP.COM hadoop.com = HADOOP.COM
初始化kerberos数据库,这里会要求输入一个密码,这个密码是kbs的管理员密码,一定要记住,忘记是很难办的
[root@hadoop1-fblinux ~]# kdb5_util create -s Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'HADOOP.COM', master key name 'K/M@HADOOP.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify:
创建管理员用户,创建张三李四用户,并导出证书
[root@hadoop1-fblinux ~]# kadmin.local Authenticating as principal root/admin@HADOOP.COM with password. kadmin.local: addprinc admin/admin # 创建管理员用户 WARNING: no policy specified for admin/admin@HADOOP.COM; defaulting to no policy Enter password for principal "admin/admin@HADOOP.COM": Re-enter password for principal "admin/admin@HADOOP.COM": Principal "admin/admin@HADOOP.COM" created. kadmin.local: addprinc zhangsan # 创建张三普通用户 WARNING: no policy specified for zhangsan@HADOOP.COM; defaulting to no policy Enter password for principal "zhangsan@HADOOP.COM": Re-enter password for principal "zhangsan@HADOOP.COM": Principal "zhangsan@HADOOP.COM" created. kadmin.local: addprinc lisi # 创建李四普通用户 WARNING: no policy specified for lisi@HADOOP.COM; defaulting to no policy Enter password for principal "lisi@HADOOP.COM": Re-enter password for principal "lisi@HADOOP.COM": Principal "lisi@HADOOP.COM" created. kadmin.local: xst -k /etc/security/zhangsan.keytab zhangsan # 导出用户密钥,可以使用户免密钥登陆 Entry for principal zhangsan with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type camellia256-cts-cmac added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type camellia128-cts-cmac added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type des-hmac-sha1 added to keytab WRFILE:/etc/security/zhangsan.keytab. Entry for principal zhangsan with kvno 2, encryption type des-cbc-md5 added to keytab WRFILE:/etc/security/zhangsan.keytab. kadmin.local: xst -k /etc/security/lisi.keytab lisi Entry for principal lisi with kvno 4, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type arcfour-hmac added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type camellia256-cts-cmac added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type camellia128-cts-cmac added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type des-hmac-sha1 added to keytab WRFILE:/etc/security/lisi.keytab. Entry for principal lisi with kvno 4, encryption type des-cbc-md5 added to keytab WRFILE:/etc/security/lisi.keytab.
修改acl的权限
[root@hadoop1-fblinux ~]# cat /var/kerberos/krb5kdc/kadm5.acl */admin@HADOOP.COM *
如上内容,配置含义为,任何以/admin结尾的用户,并在HADOOP.com里面,均为管理员用户
启动kerberos服务
[root@hadoop1-fblinux ~]# systemctl start krb5kdc [root@hadoop1-fblinux ~]# systemctl start kadmin [root@hadoop1-fblinux ~]# systemctl enable krb5kdc [root@hadoop1-fblinux ~]# systemctl enable kadmin
认证用户
[root@hadoop1-fblinux ~]# kinit -kt /etc/security/zhangsan.keytab zhangsan
用户认证完成之后,使用klist查看认证的用户列表就出现了刚才认证的zhangsan用户
[root@hadoop1-fblinux ~]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: zhangsan@HADOOP.COM Valid starting Expires Service principal 2019-01-20T19:24:21 2019-01-21T19:24:21 krbtgt/HADOOP.COM@HADOOP.COM renew until 2019-01-27T19:24:21
安装kerberos客户端
在hadoop2-5节点安装kerberos客户端
[root@hadoop2-fblinux ~]# yum -y install krb5-libs krb5-workstation
复制krb5.conf 配置文件到其他节点
[root@hadoop1-fblinux ~]# scp /etc/krb5.conf 192.168.201.152:/etc/krb5.conf [root@hadoop1-fblinux ~]# scp /etc/krb5.conf 192.168.201.153:/etc/krb5.conf [root@hadoop1-fblinux ~]# scp /etc/krb5.conf 192.168.201.154:/etc/krb5.conf [root@hadoop1-fblinux ~]# scp /etc/krb5.conf 192.168.201.155:/etc/krb5.conf
CDH启用kerberos认证
(1)在集群选项中选择“启用kerberos”
(2)检查相关配置是否都正确,如果都正确就打勾
(3)设置安全域信息,和KDC server地址,续约时间改为7天
(4)是否需要用CM来管理krb5,这里有小bug,我们不选这项
(5)填写管理员账号和密码
(6)在集群上启动kerberos服务
(7)这一页不用管之间继续就OK
(8)确认是否要重启集群
(9)启动之后,可以在CM中看到启用kerberos是灰色的,说明kerberos已经启用成功
我们使用kerberos完成用户认证之后,接下来就配置我们的用户授权服务sentry
hadoop集群的授权安全sentry
Apache Sentry是一个细粒度的、基于角色的Hadoop授权模块。Sentry 供了对Hadoop集群中经过身份验证的用户和程序的数据进行精确控制 执行权限的能力。Sentry目前可以与Apache Hive、Hive Metastore/ HCatalog、Apache Solr、Impala和HDFS良好结合。
Sentry被设计作为Hadoop组件的可插拔授权引擎。它允许用户定义授权 规则,来验证用户或应用对Hadoop资源的访问请求。Sentry是高度模块化的,可以支持Hadoop中各种数据模型的授权。
授权过程主要有三个部件参与:
Sentry Server:Sertry RPC Server管理授权元数据。它支持检索和操作元数据的安全接口。在CDH5.13及以上,可以配置多个Sentry Server以获得高可用性。
Data Engine:是一个数据处理应用,例如Hive或Impala,其需要授权访问数据或元数据资源。Data Engine加载Sentry Plugin,所有访问资源的客户端请求都被截获并路由到Sentry Plugin进行验证。
Sentry Plugin:在Data Engine中运行。它提供了处理Sentry Server中存储的授权元数据的接口,并且包括了使用从服务器检索的授权元数据来评估访问请求的授权策略引擎。
Sentry关系概念如下所示:
Sentry依靠底层认证系统来鉴别用户,如Kerberos或LDAP。它也使用 Hadoop中配置的组映射机制,以保证Sentry和其他Hadoop组件看到相同 的组映射。
Sentry使用基于角色的存取控制(RBAC),这是一种企业内管理大量用 户和数据对象的授权的有力机制。当建立一个新用户时,只需将其加入 一个指定的组,即可使该用户具备该组所拥有的所有角色。
因此Sentry的授权控制过程为:
1、建立用户时,为其分配一个组(通过 操作系统或LDAP);
2、创建Sentry的角色;
3、将一个或多个细粒度的权限 赋给角色;
4、将一个或多个角色赋给组。
这样,该组下的用户就具备这 些角色所对应的权限了。
测试没有配置sentry的用户是什么权限
kerberos配置完成之后,我们就需要配置sentry,配置sentry之前,我会先通过hue导入hive测试数据,使用集群认证的用户,验证权限访问,用此验证的结果和配置sentry的用户进行对比。
(1)登陆hue
第一次登陆hue,可以自己设置任意的用户名和密码,后续要记住。
(2)导入测试数据
登陆后,在右上角,admin中点击check configuration,进入快速入门向导
在examples中点击hive,导入hive测试数据
数据导入完成后回到主界面,找到default数据库,就可以看到里面的测试数据了
(3)集群认证lisi用户
[root@hadoop1-fblinux ~]# kinit -kt /etc/security/lisi.keytab lisi [root@hadoop1-fblinux ~]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: lisi@HADOOP.COM Valid starting Expires Service principal 2019-01-24T19:52:42 2019-01-25T19:52:42 krbtgt/HADOOP.COM@HADOOP.COM renew until 2019-01-31T19:52:42
(4)登陆hive
[root@hadoop1-fblinux ~]# beeline Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0 Beeline version 1.1.0-cdh5.13.0 by Apache Hive beeline> !connect jdbc:hive2://hadoop2-fblinux.com:10000/default;principal=hive/hadoop2-fblinux.com@HADOOP.COM # 连接hive,hadoop2-fblinux.com是hiveserver节点 scan complete in 3ms Connecting to jdbc:hive2://hadoop2-fblinux.com:10000/default;principal=hive/hadoop2-fblinux.com@HADOOP.COM Connected to: Apache Hive (version 1.1.0-cdh5.13.0) Driver: Hive JDBC (version 1.1.0-cdh5.13.0) Transaction isolation: TRANSACTION_REPEATABLE_READ 0: jdbc:hive2://hadoop2-fblinux.com:10000/def> show tables; INFO : Compiling command(queryId=hive_20190124195555_6afa2584-9930-4dbc-b7b9-82a139558c74): show tables INFO : Semantic Analysis Completed INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:tab_name, type:string, comment:from deserializer)], properties:null) INFO : Completed compiling command(queryId=hive_20190124195555_6afa2584-9930-4dbc-b7b9-82a139558c74); Time taken: 0.053 seconds INFO : Executing command(queryId=hive_20190124195555_6afa2584-9930-4dbc-b7b9-82a139558c74): show tables INFO : Starting task [Stage-0:DDL] in serial mode INFO : Completed executing command(queryId=hive_20190124195555_6afa2584-9930-4dbc-b7b9-82a139558c74); Time taken: 0.062 seconds INFO : OK +------------+--+ | tab_name | +------------+--+ | customers | | sample_07 | | sample_08 | | web_logs | +------------+--+ 4 rows selected (0.432 seconds)
执行如下select查询语句也可以正常查出数据
0: jdbc:hive2://hadoop2-fblinux.com:10000/def> select * from sample_07;
说明我们通过kerberos建立的账号,授权通过以后,可以任意的访问数据库,但是只有身份验证,并没有给用户设置他的权限。
安装sentry服务
(1)在CDH界面中,选择添加服务,在里面找到sentry服务
(2)选择sentry安装的节点
(3)配置sentry连接的数据库
安装成功如下所示
hive支持sentry配置
修改hive的配置,将sentry服务配置的值从“none”修改为sentry
启用数据库的存储通知
关闭hive server2模拟,不然会报错
hive metastore访问控制和代理添加三个组,分别是hive,hue,sentry
这样hive的配置就做完了
hue支持sentry配置
hue只需要配置一项内容,就是启用sentry服务即可
hdfs支持sentry配置
hdfs我们要配置它启用acl,以及权限和sentry进行同步
yarn 支持sentry配置
确认yarn允许的系统用户中是否包括hive,如果包括则不需要配置,不包括则添加hive
下发配置并重启集群
下发配置
重启集群
到此我们的sentry就配置完成了,接下来会验证在hadoop集群中使用sentry进行用户授权,并验证授权是否成功
验证sentry授权
服务器创建用户和组
在集群中的每一台服务器上创建如下用户和组,为sentry做基本的身份认证
groupadd selector groupadd inserter useradd -u 1001 -g selector zhangsan useradd -u 1002 -g inserter lisi
说明,如果是规模比较大的集群可以配置ldap来实现用户管理,但是社区版的CDH不支持ldap,需要企业版。
Sentry授权配置
在Hadoop 2 授权hive可以登录集群
[root@hadoop2-fblinux ~]# kinit -kt /run/cloudera-scm-agent/process/80-hive-HIVEMETASTORE/hive.keytab hive/hadoop2-fblinux.com
连接hive
[root@hadoop2-fblinux ~]# beeline beeline> !connect jdbc:hive2://hadoop2-fblinux.com:10000/default;principal=hive/hadoop2-fblinux.com@HADOOP.COM
以下步骤建立admin角色并赋给hive组,设置完成后如果你将系统用户授权给hive组也可以获得admin权限
CREATE ROLE admin; GRANT ALL ON SERVER server1 TO ROLE admin; GRANT ROLE admin TO GROUP hive; show tables;
以下步骤建立reads角色(读default库)并赋给selector组;建立writes角色(读写default库下的sample_07表)并赋给inserter组
CREATE ROLE reads; CREATE ROLE writes; REVOKE ALL ON DATABASE default FROM ROLE reads; GRANT SELECT ON DATABASE default TO ROLE reads; GRANT ROLE reads TO GROUP selector; REVOKE ALL ON DATABASE default FROM ROLE writes; GRANT ALL ON default.sample_07 TO ROLE writes; GRANT ROLE writes TO GROUP inserter;
验证sentry配置
在Hadoop1上执行以下操作:
验证zhangsan可以查询表,但不能插入
kinit -kt /etc/security/zhangsan.keytab zhangsan beeline !connect jdbc:hive2://hadoop2-fblinux.com:10000/default;principal=hive/hadoop2-fblinux.com@HADOOP.COM show tables; select * from sample_07;
通过以上命令验证可以正常进行查询操作,但是执行插入操作会报错,提示如下
0: jdbc:hive2://hadoop2-fblinux.com:10000/def> insert into sample_07 values('test','test',1,1); Error: Error while compiling statement: FAILED: SemanticException No valid privileges User zhangsan does not have privileges for QUERY The required privileges: Server=server1->Db=default->Table=sample_07->action=insert; (state=42000,code=40000)
验证lisi只能看到sample_07
[root@hadoop1-fblinux ~]# kdestroy [root@hadoop1-fblinux ~]# kinit -kt /etc/security/lisi.keytab lisi [root@hadoop1-fblinux ~]# beeline beeline> !connect jdbc:hive2://hadoop2-fblinux.com:10000/default;principal=hive/hadoop2-fblinux.com@HADOOP.COM 0: jdbc:hive2://hadoop2-fblinux.com:10000/def> show tables; +------------+--+ | tab_name | +------------+--+ | sample_07 | +------------+--+ 1 row selected (0.592 seconds)
李四向sample_07中插入数据也是可以,通过如下命令即可测试,但是hive的插入会提交mapreduce任务,所以速度比较慢。
> insert into sample_07 values('test','test',1,1);
禁用kerberos认证的方法
1、修改ZooKeeper的Enable Kerberos Authentication为FALSE
2、修改HDFS的Authentication为SIMPLE,Authorization为旧值, dfs.datanode.address从1004改为50010,dfs.datanode.http.address从 1006改为50075,Data Directory Permissions从700改为755。
3、取消Hive使用Sentry。
4、取消Hue使用Sentry。
5、关闭HDFS的ACL和Sentry权限同步。
转载请注明:西门飞冰的博客 » hadoop集群认证和授权