YARN 远程代码执行(RCE)安全漏洞问题分析与解决方案
1 YARN RCE 漏洞问题问题现象
某客户使用Tenable.sc扫描安全漏洞后反馈,YARN 存在Remote code execution (RCE) 安全漏洞问题,攻击者可在未经过身份验证的情况下通过该漏洞在受影响主机执行任意命令,最终控制服务器。 问题描述及细节情况如下图所示:
2 YARN RCE 漏洞问题分析与复现
- YARN 内置了Jetty并基于Jetty提供了 restful api,用户可以访问这些 restful api 以获得YARN集群中集群、节点和用用的相关信息。
- 在未作特殊配置的情况下,普通用户确实可以在未认证的情况下访问yarn这些restful api,通过巧妙地构建特定的JSON输入数据,确实可以通过Remote code execution (RCE) 安全漏洞在受影响主机执行任意命令,最终控制服务器。
- 我们可以通过开启kerberos安全认证(hadoop.security.authentication=kerberos),来阻止针对整个hadoop集群(包括hdfs/yarn)的基于RPC的未授权访问;
- 我们可以通过进一步开启 HTTP Web 控制台的 Kerberos 身份验证(hadoop.http.authentication.type=kerberos),来阻止针对整个hadoop集群(包括hdfs/yarn)的基于http的未授权访问;
2.1 未开启kerberos安全认证
在未开启kerberos安全认证的集群中(core-site.xml中hadoop.security.authentication=simple):
- 用户在未经安全认证的情况下,可以正常使用yarn application -list等客户端命令(底层基于rpc协议):
- 用户在未经安全认证的情况下,也可以正常访问yarn的restful api(底层基于http协议):
2.2 开启kerberos安全认证
在开启了kerberos安全认证的集群中(core-site.xml中hadoop.security.authentication=kerberos):
- 用户只有在经过 kinit安全认证的情况下,才可以使用yarn application -list等客户端命令(底层基于rpc协议);
- 但可以在未经任何认证的情况下,使用curl等命令或浏览器等正常访问yarn的restful api(底层基于http协议):
2.3 开启kerberos安全认证和 HTTP Web 控制台的 Kerberos 身份验证
在开启了kerberos安全认证且启用了 HTTP Web 控制台的 Kerberos 身份验证的集群(core-site.xml中hadoop.security.authentication=Kerberos,且hadoop.http.authentication.type=kerberos):
- 用户只有在经过 kinit安全认证后,才可以正常使用yarn application -list等客户端命令(底层基于rpc协议);
- 且只有在经过配置和认证的情况下,才可以使用curl等命令或浏览器正常访问yarn的restful api(底层基于http协议):
3.问题解决
- 综上所述,可以更改服务端配置,开启集群的kerberos的安全认证和 HTTP Web 控制台的 Kerberos 身份验证(core-site.xml中hadoop.security.authentication=Kerberos,且hadoop.http.authentication.type=kerberos),来阻止YARN的各种未授权访问漏洞,包括未认证Remote code execution (RCE) 安全漏洞;
- 在CDH/CDP等大数据平台中,可以通过CM界面完成上述操作变更,开启kerberos的安全认证:管理=》安全=》启用kerberos;
- 在CDH/CDP等大数据平台中,可以通过CM界面一键完成上述操作变更,开启HTTP Web 控制台的 Kerberos 身份验证;
4. 技术背景
- 在未开启kerberos安全认证的集群中(core-site.xml中hadoop.security.authentication=simple),用户在未经安全认证的情况下,可以正常使用yarn/hdfs等客户端命令(底层基于rpc协议),也可以正常访问yarn/hdfs等的web控制台或restful api(底层基于http协议);
- 我们可以通过开启kerberos安全认证(hadoop.security.authentication=kerberos),来阻止针对整个hadoop集群(包括hdfs/yarn)的基于RPC的未授权访问,此时客户端通过 rpc 协议访问大数据服务如 hdfs/yarn/hive/hbase/kafka/zookeeper/spark 等服务端时,只有在经过 kerberos 认证后才能访问成功;
- 我们可以通过进一步开启 HTTP Web 控制台的 Kerberos 身份验证(hadoop.http.authentication.type=kerberos),来阻止针对整个hadoop集群(包括hdfs/yarn)的基于http的未授权访问,此时用户在通过 web 浏览器或curl等命令基于 http/https访问大数据服务如 namenode/resourceManager/hive hs2/spark History Server 等的 webui或restful api时,spnego 会对用户进行身份验证,用户只有在成功通过了 kerberos 认证拿到了 ticket 后,才能成功访问对应服务的 web ui(需要在浏览器或curl等命令中做相应配置);
- 开启hdfs/yarn的HTTP Web 控制台的 Kerberos 身份验证,其背后更改的是配置文件core-site.xml中的hadoop.http.authentiation.* 等配置项,如下图所示:
- 配置hdfs/yarn之外的其它服务的HTTP Web 控制台的 Kerberos 身份验证,比如Hive等服务,在CDH/CDP中部分版本可能没有一键进行开启或关闭的功能,此时需要通过高级代码端的方式进行配置,且如果配置参数不全的话,对应的服务可能会启动失败:(当然如果这些服务只是提供了web ui页面而没有提供restful api, 也不会有未认证的RCE安全问题):
5. 相关命令与参数
# 相关命令: curl -H "Content-Type: application/json" -X GET "http://10.20.39.42:8088/ws/v1/cluster/apps" curl -H "Content-Type: application/json" -X GET "http://10.20.25.28:8088/ws/v1/cluster/info" curl "http://10.20.25.28:8088/ws/v1/cluster/apps" -H "Content-Type: application/json" -X POST -d {"am-container-spec":{"commands":{"command":"ping -c 3 -s 500 10.20.25.28"}},"application-id":"application_xx_xx","application-type":"YARN","application-name":"xx"} #core-site.xml中相关参数: <name>hadoop.http.authentication.type</name> <value>kerberos</value> <name>hadoop.http.authentication.signature.secret.file</name> <value>/var/run/cloudera-scm-agent/process/4215-yarn-RESOURCEMANAGER/http-auth-signature-secret</value> <name>hadoop.http.authentication.cookie.domain</name> <value></value> <name>hadoop.http.authentication.kerberos.principal</name> <value>HTTP/_HOST@CDH.COM</value> <name>hadoop.http.authentication.kerberos.keytab</name> <value>yarn.keytab</value>