🎼

AKS で Host Process Container を動かしてみた

2022/05/03に公開

AKS にて、Host Process Container がプレビュー機能としてリリースされているとのことです。

Windows ノード上の仕組みですが、興味深かったので試してみました。

環境・準備

  • Azure Kubernetes Service (v1.23.5)
    • Kubernetes 1.23 以上が必要
  • Windows 10
  • Windows PowerShell
  • Azure CLI (v2.30.0)

ドキュメント

その仕組みについては、下記のドキュメントが参考になると思います。

ホストの特権を利用できる Pod を起動させることができる仕組みです。

やってみた

Get-Process

Host Process Container

Windows のノードプールを作成しておき、下記の YAML ファイルをデプロイしてみます。

apiVersion: v1
kind: Pod
metadata:
  name: test-1-1
spec:
  containers:
  - name: test-1-1
    image: mcr.microsoft.com/windows/servercore:ltsc2019
    command: [powershell, -command]
    args: [Get-Process]
  securityContext:
    windowsOptions:
      hostProcess: true
      runAsUserName: "NT AUTHORITY\\SYSTEM"
  hostNetwork: true
  nodeSelector:
    "kubernetes.io/os": windows

kubectl logs <Pod名> で、出力を確認することができます。

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    130      13    20836      27024       1.28   6776  11 azurediskplugin
    156      13    20728      26724       0.84  10536  13 azurefileplugin
    261      11    16584      13640       0.69   3776   0 azure-vnet-telemetry
    115       5     1100       4568       0.13   1972   7 CExecSvc
    115       5     1128       4564       0.25   3304   9 CExecSvc
...

azurediskpluginwinlogon など、ホスト側と見られるプロセスを確認することができます。

通常のコンテナ

下記のように、hostProcess を設定しないコンテナも実行してみました。

apiVersion: v1
kind: Pod
metadata:
  name: test-1-2
spec:
  containers:
  - name: test-1-2
    image: mcr.microsoft.com/windows/servercore:ltsc2019
    command: [powershell, -command]
    args: [Get-Process]
  nodeSelector:
    "kubernetes.io/os": windows

kubectl logs <Pod名> で、出力を確認。

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    114       6     1164       4816       0.03   3196  15 CExecSvc
     18       4      416       1216       0.00   5996  15 CompatTelRunner
    123       7     4864       9264       0.03   9456  15 conhost
     49       6     1000       3356       0.00   8176  15 fontdrvhost
      0       0       56          8                 0   0 Idle
    783      20     4368      12928       0.44   1796  15 lsass
    538      45    61772      75988       7.56   1940  15 powershell
    356      13     2868       9952       0.09    924  15 svchost
    531      23    11960      25324       1.55   1136  15 svchost
    760      27     6108      18508       0.27   4320  15 svchost
    430      16     8484      14540       0.28   5452  15 svchost
    120       7     1360       5776       0.02   6668  15 svchost
    185      15     3060       8968       0.09   8460  15 svchost
    312      16     2436       8108       0.16   9376  15 svchost
    579      33     5740      17624       0.30   9932  15 svchost
    142       9     1720       6496       0.05  10144  15 svchost
  15836       0      192        156      13.73      4   0 System
    186      12     1868       7112       0.05   8536  15 wininit

先ほどの出力よりも大幅に少ない結果となりました。

whoami (特権の確認)

どんな感じの特権が有効になっているのか気になったので、whoami /priv を実行してみました。

通常のコンテナ

まずは通常のコンテナの方から。下記の YAML ファイルをデプロイしてみます。

apiVersion: v1
kind: Pod
metadata:
  name: test-2-1
spec:
  containers:
  - name: test-2-1
    image: mcr.microsoft.com/windows/servercore:ltsc2019
    command: [powershell, -command]
    args: [whoami, /priv]
  nodeSelector:
    "kubernetes.io/os": windows

kubectl logs <Pod名> で、出力を確認。

Privilege Name                            Description                                                        State
========================================= ================================================================== ========
SeIncreaseQuotaPrivilege                  Adjust memory quotas for a process                                 Disabled
SeSecurityPrivilege                       Manage auditing and security log                                   Disabled
SeTakeOwnershipPrivilege                  Take ownership of files or other objects                           Disabled
SeLoadDriverPrivilege                     Load and unload device drivers                                     Disabled
SeSystemProfilePrivilege                  Profile system performance                                         Disabled
SeSystemtimePrivilege                     Change the system time                                             Disabled
SeProfileSingleProcessPrivilege           Profile single process                                             Disabled
SeIncreaseBasePriorityPrivilege           Increase scheduling priority                                       Disabled
SeCreatePagefilePrivilege                 Create a pagefile                                                  Disabled
SeBackupPrivilege                         Back up files and directories                                      Disabled
SeRestorePrivilege                        Restore files and directories                                      Disabled
SeShutdownPrivilege                       Shut down the system                                               Disabled
SeDebugPrivilege                          Debug programs                                                     Enabled
SeSystemEnvironmentPrivilege              Modify firmware environment values                                 Disabled
SeChangeNotifyPrivilege                   Bypass traverse checking                                           Enabled
SeRemoteShutdownPrivilege                 Force shutdown from a remote system                                Disabled
SeUndockPrivilege                         Remove computer from docking station                               Disabled
SeManageVolumePrivilege                   Perform volume maintenance tasks                                   Disabled
SeImpersonatePrivilege                    Impersonate a client after authentication                          Enabled
SeCreateGlobalPrivilege                   Create global objects                                              Enabled
SeIncreaseWorkingSetPrivilege             Increase a process working set                                     Disabled
SeTimeZonePrivilege                       Change the time zone                                               Disabled
SeCreateSymbolicLinkPrivilege             Create symbolic links                                              Disabled
SeDelegateSessionUserImpersonatePrivilege Obtain an impersonation token for another user in the same session Disabled

Host Process Container

次は、特権で動作するコンテナ。

apiVersion: v1
kind: Pod
metadata:
  name: test-2-1
spec:
  containers:
  - name: test-2-1
    image: mcr.microsoft.com/windows/servercore:ltsc2019
    command: [powershell, -command]
    args: [whoami, /priv]
  securityContext:
    windowsOptions:
      hostProcess: true
      runAsUserName: "NT AUTHORITY\\SYSTEM"
  hostNetwork: true
  nodeSelector:
    "kubernetes.io/os": windows

kubectl logs <Pod名> で、出力を確認。

Privilege Name                            Description                                                        State
========================================= ================================================================== ========
SeAssignPrimaryTokenPrivilege             Replace a process level token                                      Disabled
SeLockMemoryPrivilege                     Lock pages in memory                                               Enabled
SeIncreaseQuotaPrivilege                  Adjust memory quotas for a process                                 Disabled
SeTcbPrivilege                            Act as part of the operating system                                Enabled
SeSecurityPrivilege                       Manage auditing and security log                                   Disabled
SeTakeOwnershipPrivilege                  Take ownership of files or other objects                           Disabled
SeLoadDriverPrivilege                     Load and unload device drivers                                     Disabled
SeSystemProfilePrivilege                  Profile system performance                                         Enabled
SeSystemtimePrivilege                     Change the system time                                             Disabled
SeProfileSingleProcessPrivilege           Profile single process                                             Enabled
SeIncreaseBasePriorityPrivilege           Increase scheduling priority                                       Enabled
SeCreatePagefilePrivilege                 Create a pagefile                                                  Enabled
SeCreatePermanentPrivilege                Create permanent shared objects                                    Enabled
SeBackupPrivilege                         Back up files and directories                                      Enabled
SeRestorePrivilege                        Restore files and directories                                      Enabled
SeShutdownPrivilege                       Shut down the system                                               Disabled
SeDebugPrivilege                          Debug programs                                                     Enabled
SeAuditPrivilege                          Generate security audits                                           Enabled
SeSystemEnvironmentPrivilege              Modify firmware environment values                                 Disabled
SeChangeNotifyPrivilege                   Bypass traverse checking                                           Enabled
SeUndockPrivilege                         Remove computer from docking station                               Disabled
SeManageVolumePrivilege                   Perform volume maintenance tasks                                   Disabled
SeImpersonatePrivilege                    Impersonate a client after authentication                          Enabled
SeCreateGlobalPrivilege                   Create global objects                                              Enabled
SeIncreaseWorkingSetPrivilege             Increase a process working set                                     Enabled
SeTimeZonePrivilege                       Change the time zone                                               Enabled
SeCreateSymbolicLinkPrivilege             Create symbolic links                                              Enabled
SeDelegateSessionUserImpersonatePrivilege Obtain an impersonation token for another user in the same session Enabled

ご覧の通り、権限に差がでていることと、その違いも確認することができました!

まとめ

利用用途的には、コンテナからホスト側のドライバ更新などの用途があるようです。

便利な反面、簡単に特権が使用できることには注意を払う必要がありますね。色々な意味で研究のしがいがありそうな機能です。

Discussion