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 之後才可用。

實用連結