E-MapReduce从2.7.x和3.5.x版本开始支持创建安全类型的集群。高安全类型集群中的开源组件以Kerberos的安全模式启动,因此只有经过认证的客户端(Client)才能访问集群的服务(例如HDFS)。

背景信息

对于客户端而言,集群开启Kerberos之后,可以对可信任的客户端提供认证,使得可信任客户端能够正确提交作业,恶意用户无法伪装成其他用户侵入到集群当中,能够有效防止恶意冒充客户端提交作业的情况。对于服务端而言,集群开启Kerberos之后,集群中的服务都是可以信任的,集群服务之间使用密钥进行通信,避免了冒充服务的情况。

开启Kerberos能够提升集群的安全性,但是也会增加用户使用集群的复杂度,提交作业的方式与没有开启Kerberos前会有一些区别,需要对作业进行改造,增加Kerberos认证的相关内容。开启Kerberos前需要用户对Kerberos的原理、使用有一些了解,才能更好地使用Kerberos。此外,由于集群服务间的通信加入了Kerberos认证机制,认证过程会有一些轻微的时间消耗,相同作业相较于没有开启Kerberos的同规格集群执行速度会有一些下降。

开启Kerberos

创建集群时,在软件配置页面的高级设置区域中,打开Kerberos集群模式开关。Kerberos

Kerberos组件列表

E-MapReduce中支持的Kerberos的组件列表如下所示。
组件名称 组件版本
HDFS 2.8.5及后续版本
YARN 2.8.5及后续版本
Spark 2.4.3
Hive 2.3.5及后续版本
Tez 0.9.1及后续版本
Zookeeper 3.5.5及后续版本
Hue 4.4.0
Zeppelin 0.8.1
Oozie 5.1.0
Sqoop 1.4.7
HBase 1.4.9及后续版本
Phoenix 4.14.1及后续版本
Druid 0.13.0及后续版本
Flink 1.5.6及后续版本
Impala 2.12.2及后续版本
Kafka 2.11/1.1.1及后续版本
Presto prestodb 0.213及以上/prestosql 310
Ranger 1.0.0及后续版本
Storm 1.2.2

Kerberos身份认证原理

Kerberos是一种基于对称密钥技术的身份认证协议,可以为其他服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务,例如HBase和HDFS)。

Kerberos协议过程主要有两个阶段,第一个阶段是KDC对Client身份认证,第二个阶段是Service对Client身份认证。Kerberos身份认证原理
  • KDC:Kerberos的服务端程序。
  • Client:需要访问服务的用户(Principal),KDC和Service会对用户的身份进行认证。
  • Service:集成了Kerberos的服务。例如,HDFS、YARN和HBase。
  • 第一阶段:KDC对Client身份认证

    当客户端用户(Principal)访问一个集成了Kerberos的服务之前,需要先通过KDC的身份认证。

    如果身份认证通过,则客户端会获取到一个TGT(Ticket Granting Ticket),后续就可以使用该TGT去访问集成了Kerberos的服务。

  • 第二阶段:Service对Client身份认证

    当用户获取TGT后,就可以继续访问Service服务。

    使用TGT以及需要访问的服务名称(例如HDFS)去KDC获取SGT(Service Granting Ticket),然后使用SGT去访问Service。Service会利用相关信息对Client进行身份认证,认证通过后就可以正常访问Service服务。

Kerberos实践

E-MapReduce的Kerberos安全集群中的服务,在创建集群的时候会以Kerberos安全模式启动。

  • Kerberos服务端程序为HASServer
    • 集群管理页面,单击待操作集群所在行的详情,然后在集群服务 > Has页面,您可以执行查看、修改配置和重启等操作。
    • 非HA集群部署在emr-header-1节点,HA集群部署在emr-header-1和emr-header-2两个节点。
  • HASServer支持以下三种身份认证方式

    HASServer可以同时支持以下三种身份认证方式,客户端可以通过配置相关参数来指定HASServer使用哪种方式进行身份认证。

    • 兼容MIT Kerberos的身份认证方式
      客户端配置:
      • 如果在集群的某个节点上执行客户端命令,则需要将/etc/ecm/hadoop-conf/core-site.xml中的hadoop.security.authentication.use.has设置为false
      • 如果通过控制台运行作业,您可以使用export HADOOP_CONF_DIR=/etc/has/hadoop-conf命令,临时Export环境变量,设置hadoop.security.authentication.use.hasfalse

      访问方式:Service的客户端包完全可使用开源的。例如HDFS客户端。详情请参见兼容MIT Kerberos认证

    • RAM身份认证
      客户端配置:
      • 如果在集群的某个节点上执行客户端命令,则需要将/etc/ecm/hadoop-conf/core-site.xml中的hadoop.security.authentication.use.has设置为false/etc/has/has-client.conf中的auth_type设置为RAM
      • 如果有通过控制台运行作业,您可以export HAS_CONF_DIR=/path/to/has-client.conf临时Export环境变量,设置has-client.confauth_typeRAM

      访问方式: 客户端需要使用集群中的软件包(例如Hadoop和HBase),详情请参见RAM认证

    • 数据开发认证

      如果您使用E-MapReduce控制台的数据开发提交作业,则不能修改emr-header-1节点的配置,即使用默认配置。

      客户端配置:

      在emr-header-1节点上,设置/etc/ecm/hadoop-conf/core-site.xmlhadoop.security.authentication.use.hastrue/etc/has/has-client.confauth_type设置为EMR

      访问方式:跟非Kerberos安全集群使用方式一致,详情请参见数据开发认证

  • 其他

    登录Master节点访问集群

    集群管理员也可以登录Master节点访问集群服务,登录Master节点切换到has账号(默认使用兼容MIT Kerberos的方式),即可访问集群服务,例如排查问题或者运维等。
    sudo su has
    hadoop fs -ls /
    说明 您也可以登录其他账号操作集群,前提是该账号可以通过Kerberos认证。另外,如果在Master节点上需要使用兼容MITKerberos的方式,需要在该账号下先Export一个环境变量export HADOOP_CONF_DIR=/etc/has/hadoop-conf/