[小ネタ] EC2 Image Builderでコンポーネントを実行するユーザー (Windows編) #reinvent

2019.12.24

しばたです。
先日弊社内藤により以下の記事が公開されました。

[小ネタ]EC2 Image Builderでコンポーネントを実行するユーザを調べてみた

こちらの記事ではEC2 Image BuilderでLinuxイメージを作る際のコンポーネントをビルドするユーザーについて試した内容が記載されています。
ではWindowsイメージを作る場合はどうなのか?というのをこの記事で試してみました。

TL;DR

はじめにネタバレというか結論から書いておきます。

先の記事や私のre:Growhthでの発表でも触れていますが、EC2 Image BuilderにおいてコンポーネントのビルドはSSM Agentによって行われます。
このためLinuxインスタンスにおいてはrootユーザーとなり、Windowsにおいてはローカルシステムユーザー(NT AUTHORITY\System)となります。

こちらはSSM Agentのサービスを見てみるとすぐわかります。

調べてみた

せっかくなのでLinuxの場合と似た様な感じで、以下のカスタムコンポーネントを作って調べてみました。

name: builder-check-windows
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: check-whoami
        action: ExecutePowerShell
        inputs:
          commands:
            - |
              $logPath = Join-Path $env:TEMP "check-whoami.log"
              "pwd: $pwd" | Out-File $logPath
              $CurrentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
              $isElevated = (New-Object Security.Principal.WindowsPrincipal $CurrentUser).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
              "Elevated: $isElevated" | Out-File $logPath -Append
              whoami /user /priv | Out-File $logPath -Append

Windowsにもwhoamiコマンドは存在しており現在のユーザーに対する多くの情報を提供してくれます。
あとは初期状態でのカレントディレクトリと昇格済みかどうかを調べています。

実行結果

Windows Server 2019の適当なイメージを作り、出力されたファイルは以下の様になりました。
(ローカルシステムユーザーの場合$env:TEMPC:\Windows\Tempになります)

pwd: C:\
Elevated: True

USER INFORMATION
----------------

User Name           SID     
=================== ========
nt authority\system S-1-5-18


PRIVILEGES INFORMATION
----------------------

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                                      Disabled
SeRestorePrivilege                        Restore files and directories                                      Disabled
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 

実行結果からもちゃんとローカルシステムユーザー(NT AUTHORITY\System)で実行されていることがわかります。
ローカルシステムユーザーはAdministratorsグループと同等の権限を持ち、この結果からも昇格済み・特権モリモリであることがわかりますね。
あと初期ディレクトリはC:\の様でした。

最後に

小ネタですがWindows向けコンポーネントを作る方の役に立てれば幸いです。