E-MapReduce从2.7.x/3.5.x版本开始支持创建安全类型的集群,支持的集群类型包括Hadoop、Kafka、Druid和Flink。高安全类型集群中的开源组件以Kerberos的安全模式启动,在这种安全环境下只有经过认证的客户端(Client)才能访问集群的服务(Service,如 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可同时支持以下4种身份认证方式,客户端可以通过配置相关参数来指定HASServer使用哪种方式进行身份认证。

    • 兼容MIT Kerberos的身份认证方式
      客户端配置:
      • 如果在集群的某个节点上执行客户端命令,则需要将/etc/ecm/hadoop-conf/core-site.xml中的hadoop.security.authentication.use.has设置为false
      • 如果通过控制台的执行计划运行作业,则不能修改master节点上面/etc/ecm/hadoop-conf/core-site.xml中的值,否则执行计划的作业认证就会失败,可以使用下面的方式export HADOOP_CONF_DIR=/etc/has/hadoop-conf临时export环境变量,将该路径下的hadoop.security.authentication.use.has设置为false

      访问方式: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
      • 如果有通过控制台的执行计划运行作业,则不能修 master 节点上面/etc/ecm/hadoop-conf/core-site.xml以及/etc/has/has-client.conf中的值,否则执行计划的作业认证就会失败,可以使用下面的方式export HADOOP_CONF_DIR=/etc/has/hadoop-confexport HAS_CONF_DIR=/path/to/has-client.conf临时export环境变量,其中HAS_CONF_DIR文件夹下的has-client.confauth_type设置为RAM

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

    • LDAP身份认证

      客户端配置:

      • 如果在集群的某个节点上执行客户端命令,则需要将/etc/ecm/hadoop-conf/core-site.xmlhadoop.security.authentication.use.has设置为true/etc/has/has-client.confauth_type设置为LDAP
      • 如果有通过控制台的执行计划运行作业,则不能修改master节点上面/etc/ecm/hadoop-conf/core-site.xml以及 /etc/has/has-client.conf中的值,否则执行计划的作业认证就会失败,可以使用下面的方式export HADOOP_CONF_DIR=/etc/has/hadoop-confexport HAS_CONF_DIR=/path/to/has-client.conf临时export环境变量,其中HAS_CONF_DIR文件夹下的has-client.confauth_type设置为LDAP

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

    • 执行计划认证

      如果用户有使用E-MapReduce控制台的执行计划提交作业,则emr-header-1节点的配置必须不能被修改(默认配置)。

      客户端配置:

      emr-header-1上面的/etc/ecm/hadoop-conf/core-site.xmlhadoop.security.authentication.use.has设置为true/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/