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组件列表
目前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身份认证。

- 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可同时支持以下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-conf
;export HAS_CONF_DIR=/path/to/has-client.conf
临时export环境变量,其中HAS_CONF_DIR文件夹下的has-client.conf的auth_type设置为RAM。
访问方式: 客户端需要使用集群中的软件包(如Hadoop/HBase等),详情请参见RAM认证。
- LDAP身份认证
客户端配置:
- 如果在集群的某个节点上执行客户端命令,则需要将/etc/ecm/hadoop-conf/core-site.xml中hadoop.security.authentication.use.has设置为true,/etc/has/has-client.conf中auth_type设置为LDAP。
- 如果有通过控制台的执行计划运行作业,则不能修改master节点上面/etc/ecm/hadoop-conf/core-site.xml以及 /etc/has/has-client.conf中的值,否则执行计划的作业认证就会失败,可以使用下面的方式
export HADOOP_CONF_DIR=/etc/has/hadoop-conf
;export HAS_CONF_DIR=/path/to/has-client.conf
临时export环境变量,其中HAS_CONF_DIR文件夹下的has-client.conf的auth_type设置为LDAP。
访问方式:客户端需要使用集群中的软件包(如Hadoop/HBase等),详情请参见LDAP 认证。
- 执行计划认证
如果用户有使用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/
。