E-MapReduce从2.7.x和3.5.x版本开始支持创建安全类型的集群。高安全类型集群中的开源组件以Kerberos的安全模式启动,因此只有经过认证的客户端(Client)才能访问集群的服务(例如HDFS)。
背景信息
对于客户端而言,集群开启Kerberos之后,可以对可信任的客户端提供认证,使得可信任客户端能够正确提交作业,恶意用户无法伪装成其他用户侵入到集群当中,能够有效防止恶意冒充客户端提交作业的情况。对于服务端而言,集群开启Kerberos之后,集群中的服务都是可以信任的,集群服务之间使用密钥进行通信,避免了冒充服务的情况。
开启Kerberos能够提升集群的安全性,但是也会增加用户使用集群的复杂度,提交作业的方式与没有开启Kerberos前会有一些区别,需要对作业进行改造,增加Kerberos认证的相关内容。开启Kerberos前需要用户对Kerberos的原理、使用有一些了解,才能更好地使用Kerberos。此外,由于集群服务间的通信加入了Kerberos认证机制,认证过程会有一些轻微的时间消耗,相同作业相较于没有开启Kerberos的同规格集群执行速度会有一些下降。
开启Kerberos

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)。

- 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
- 在集群管理页面,单击待操作集群所在行的详情,然后在 页面,您可以执行查看、修改配置和重启等操作。
- 非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.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。
- 如果有通过控制台运行作业,您可以
export HAS_CONF_DIR=/path/to/has-client.conf
临时Export环境变量,设置has-client.conf的auth_type为RAM。
访问方式: 客户端需要使用集群中的软件包(例如Hadoop和HBase),详情请参见RAM认证。
- 数据开发认证
如果您使用E-MapReduce控制台的数据开发提交作业,则不能修改emr-header-1节点的配置,即使用默认配置。
客户端配置:
在emr-header-1节点上,设置/etc/ecm/hadoop-conf/core-site.xml中hadoop.security.authentication.use.has为true,/etc/has/has-client.conf中auth_type设置为EMR。
访问方式:跟非Kerberos安全集群使用方式一致,详情请参见数据开发认证。
- 兼容MIT 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/
。