YARN 安全容器

概述

安全集群中的 YARN 容器使用操作系统设施为容器提供执行隔离。安全容器在作业用户的凭据下执行。操作系统强制执行容器的访问限制。容器必须作为提交应用程序的用户运行。

安全容器仅在安全 YARN 集群的上下文中工作。

容器隔离要求

容器执行程序必须访问容器所需的本地文件和目录,例如 jar、配置文件、日志文件、共享对象等。尽管它是由 NodeManager 启动的,但容器不应该能够访问 NodeManager 私有文件和配置。由不同用户提交的运行应用程序的容器应该被隔离,并且无法访问彼此的文件和目录。类似的要求适用于其他可保护的非文件系统对象,例如命名管道、临界区、LPC 队列、共享内存等。

Linux 安全容器执行程序

在 Linux 环境中,安全容器执行器是 LinuxContainerExecutor。它使用一个名为 container-executor 的外部程序来启动容器。此程序具有 setuid 访问权限标志设置,允许它使用 YARN 应用程序用户的权限启动容器。

配置

yarn.nodemanager.local-dirsyarn.nodemanager.log-dirs 配置的目录必须由已配置的 NodeManager 用户 (yarn) 和组 (hadoop) 所有。在这些目录上设置的权限必须是 drwxr-xr-x

container-executor 程序必须由 root 所有并具有 ---Sr-s--- 权限设置。

要配置 NodeManager 以使用 LinuxContainerExecutor,请在 conf/yarn-site.xml 中设置以下内容

<property>
  <name>yarn.nodemanager.container-executor.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>

<property>
  <name>yarn.nodemanager.linux-container-executor.group</name>
  <value>hadoop</value>
</property>

此外,LCE 需要 container-executor.cfg 文件,该文件由 container-executor 程序读取。

yarn.nodemanager.linux-container-executor.group=#configured value of yarn.nodemanager.linux-container-executor.group
banned.users=#comma separated list of users who can not run applications
allowed.system.users=#comma separated list of allowed system users
min.user.id=1000#Prevent other super-users
feature.terminal.enabled=1

终端功能 (feature.terminal.enabled) 允许通过 YARN UI2 进入安全容器的受限 shell。

Windows 安全容器执行器 (WSCE)

Windows 环境安全容器执行器是 WindowsSecureContainerExecutor。它使用 Windows S4U 基础设施以 YARN 应用程序用户的身份启动容器。WSCE 需要 hadoopwinutilsvc 服务。此服务由 %HADOOP_HOME%\bin\winutils.exe 托管,并使用 service 命令行参数启动。此服务提供一些需要 LocalSystem 权限的特权操作,以便 NM 不需要在提升的上下文中运行整个 JVM 和所有 NM 代码。NM 通过 JNI 调用托管在 hadoop.dll 中的 RCP 客户端,通过本地 RPC (LRPC) 与 hadoopwintulsvc 服务交互。

配置

要配置 NodeManager 以使用 WindowsSecureContainerExecutor,请在 conf/yarn-site.xml 中设置以下内容

        <property>
          <name>yarn.nodemanager.container-executor.class</name>
          <value>org.apache.hadoop.yarn.server.nodemanager.WindowsSecureContainerExecutor</value>
        </property>

        <property>
          <name>yarn.nodemanager.windows-secure-container-executor.group</name>
          <value>yarn</value>
        </property>

hadoopwinutilsvc 使用 %HADOOP_HOME%\etc\hadoop\wsce_site.xml 来配置对特权操作的访问。

<property>
 <name>yarn.nodemanager.windows-secure-container-executor.impersonate.allowed</name>
  <value>HadoopUsers</value>
</property>

<property>
  <name>yarn.nodemanager.windows-secure-container-executor.impersonate.denied</name>
  <value>HadoopServices,Administrators</value>
</property>

<property>
  <name>yarn.nodemanager.windows-secure-container-executor.allowed</name>
  <value>nodemanager</value>
</property>

<property>
  <name>yarn.nodemanager.windows-secure-container-executor.local-dirs</name>
  <value>nm-local-dir, nm-log-dirs</value>
</property>

<property>
  <name>yarn.nodemanager.windows-secure-container-executor.job-name</name>
  <value>nodemanager-job-name</value>
</property>  

yarn.nodemanager.windows-secure-container-executor.allowed 应包含运行 nodemanager 的服务帐户的名称。此用户将被允许访问 hadoopwintuilsvc 函数。

yarn.nodemanager.windows-secure-container-executor.impersonate.allowed 应包含允许在集群中创建容器的用户。hadoopwinutilsvc 将被允许模拟这些用户。

yarn.nodemanager.windows-secure-container-executor.impersonate.denied 应包含明确禁止创建容器的用户。hadoopwinutilsvc 将拒绝模拟这些用户。

yarn.nodemanager.windows-secure-container-executor.local-dirs 应包含 nodemanager 本地目录。hadoopwinutilsvc 将仅允许在这些目录下进行文件操作。这应包含与 $yarn.nodemanager.local-dirs, $yarn.nodemanager.log-dirs 相同的值,但请注意 hadoopwinutilsvc XML 配置处理不执行替换,因此该值必须为最终值。所有路径都必须是绝对路径,并且不会执行任何环境变量替换。路径使用 LOCAL_INVARIANT 大小写不敏感字符串比较,验证的文件路径必须以 local-dirs 配置中列出的某个路径开头。使用逗号作为路径分隔符:,

yarn.nodemanager.windows-secure-container-executor.job-name 应包含应将所有容器添加到其中的 Windows NT 作业名称。此配置是可选的。如果未设置,则不会将容器添加到全局 NodeManager 作业。通常,这应设置为 NM 分配到的作业,以便在终止 NM 时也终止所有容器。Hadoopwinutilsvc 不会尝试创建此作业,该作业必须在启动容器时存在。如果设置了该值且作业不存在,则容器启动将失败,并出现错误 2 系统找不到指定的文件。请注意,此全局 NM 作业与容器作业无关,后者始终为每个容器创建,并以容器 ID 命名。此设置控制跨越所有容器和父 NM 的全局作业,因此它需要嵌套作业。嵌套作业仅在 Windows 8 和 Windows Server 2012 之后可用。

有用的链接