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 安全问题):
版权声明: 本文为 InfoQ 作者【明哥的IT随笔】的原创文章。
原文链接:【http://xie.infoq.cn/article/d983006cc5a1058804ee41087】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论