🎼
AKS で Host Process Container を動かしてみた
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
...
azurediskplugin
や winlogon
など、ホスト側と見られるプロセスを確認することができます。
通常のコンテナ
下記のように、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