セキュアクラスタ内の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
プログラムによって読み取られるcontainer-executor.cfg
ファイルが必要です。
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を介してセキュアコンテナへの制限付きシェルが許可されます。
Windows環境のセキュアコンテナ実行プログラムはWindowsSecureContainerExecutor
です。これは、Windows S4Uインフラストラクチャを使用して、YARNアプリケーションユーザーとしてコンテナを起動します。WSCEは、hadoopwinutilsvc
サービスの存在を必要とします。このサービスは、%HADOOP_HOME%\bin\winutils.exe
によってホストされ、service
コマンドライン引数で起動されます。このサービスは、NMが昇格されたコンテキストでJVMとすべてのNMコード全体を実行する必要がないように、LocalSystem権限を必要とするいくつかの特権操作を提供します。NMは、hadoop.dll
にホストされているRCPクライアントへのJNI呼び出しを介して、ローカルRPC(LRPC)によってhadoopwinutilsvc
サービスと対話します。
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
には、ノードマネージャーを実行しているサービスアカウントの名前が含まれている必要があります。このユーザーは、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
には、ノードマネージャーのローカルディレクトリが含まれている必要があります。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以降でのみ使用できます。