写点什么

YARN 远程代码执行(RCE)安全漏洞问题分析与解决方案

  • 2023-04-26
    湖北
  • 本文字数:1955 字

    阅读完需:约 6 分钟

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 安全问题):




发布于: 刚刚阅读数: 2
用户头像

Keep Striving! 2018-04-25 加入

明哥,十四年 IT经验,六年大数据经验; 做过大数据集群的搭建运维,大数据应用系统的开发优化,也做过大数据平台的技术选型以及架构咨询; 目前聚焦于泛大数据生态,包括数据仓库/数据湖,云计算和人工智能。

评论

发布
暂无评论
YARN 远程代码执行(RCE)安全漏洞问题分析与解决方案_大数据_明哥的IT随笔_InfoQ写作社区