安全叢集中的 YARN 容器使用作業系統設施來提供容器的執行隔離。安全容器在工作使用者憑證下執行。作業系統強制執行容器的存取限制。容器必須以提交應用程式的使用者身分執行。
安全容器僅在安全 YARN 叢集的環境中運作。
容器執行器必須存取容器需要的本機檔案和目錄,例如 jar、組態檔、記錄檔、共用物件等。儘管是由 NodeManager 啟動,但容器不應存取 NodeManager 的私人檔案和組態。由不同使用者提交的容器執行應用程式應予隔離,且無法存取彼此的檔案和目錄。類似需求也適用於其他系統非檔案可安全物件,例如命名管線、臨界區、LPC佇列、共用記憶體等。
在 Linux 環境中,安全容器執行器為 LinuxContainerExecutor
。它使用稱為 container-executor 的外部程式啟動容器。此程式已設定 setuid
存取權限旗標,允許它以 YARN 應用程式使用者的權限啟動容器。
針對 yarn.nodemanager.local-dirs
和 yarn.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 環境安全容器執行器為 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 之後才可用。