Windows 服務帳戶選定 ── LocalSystem、虛擬帳戶與 gMSA

· · Windows, Windows 服務, 服務帳戶, gMSA, LocalSystem, 虛擬帳戶, 安全性, Active Directory, 最小權限

「我們『暫時』用 LocalSystem 跑的內部服務,在安全性稽核被點名『權限過大』。該改成什麼?」「服務存不到共用資料夾,所以用網域使用者在跑。密碼到期服務就停,於是設成永不到期,還把明文寫進操作手冊。」── 客戶 Windows 服務相關諮詢裡,這兩則是固定班底。

兩邊現場的共通點是:服務的登入帳戶被凍成「碰巧能跑的設定」,而不是設計決策。Windows 服務一定在某個帳戶的安全性內容中執行,那個帳戶決定它本機能做什麼、從網路另一端看起來是誰、密碼由誰管理。把這裡留在預設值,單一服務的弱點就直接變成整台機器被接管,明文密碼也散進操作手冊與指令碼。

登入帳戶決定的三件事服務一定在某個帳戶的安全性內容中執行,該帳戶決定本機能做什麼、從網路另一端看起來是誰、密碼由誰管理服務的登入帳戶本機能做什麼從網路另一端看起來是誰密碼由誰管理

圖 1: 選定登入帳戶是同時決定本機權限、網路身分與密碼管理的設計決策。

實務上有六種選擇 ── LocalSystem、LocalService、NetworkService、虛擬帳戶(NT SERVICE\<服務名稱>)、網域使用者,以及 gMSA(群組受控服務帳戶)。本文面向中小企業資訊人員與 Windows 應用程式開發者,把這六種的權限、網路身分與密碼管理整理成一張表,並依 2026 年 8 月當下的 Microsoft Learn 一手資料整理到判斷流程。

服務本身怎麼做(與工作排程器的取捨、用 .NET Worker Service 實作)見「Windows 服務的建立與維運」。本文集中在出事最多的「登入帳戶」。

1. 先講結論

  • 拿不定主意時,在單一機器內做完的服務以虛擬帳戶為第一候選;要以服務專屬身分存取網域內資源的服務以 gMSA 為第一候選。 Microsoft 也指導盡可能使用受控帳戶(MSA / 虛擬帳戶)。12
  • 不要因為「能跑」就選 LocalSystem。 權杖含 SYSTEM 與 BUILTIN\Administrators,並持有 SeDebugPrivilege 等強特權,被接管就幾乎失去該機器上的一切。sc.exe create 預設是 LocalSystem,正是這類事故的溫床。34
  • LocalService 與 NetworkService 的差別是網路身分。 本機權限兩者都最小,但對遠端來說 LocalService 是匿名,NetworkService 是電腦帳戶。5
  • **虛擬帳戶(NT SERVICE\<服務名稱>)是現代預設:不必管密碼,又能依服務分開身分。** 可在 ACL 上直接指定「NT SERVICE\\服務名稱」,SQL Server 的預設服務帳戶也是這個。[^understand-service-accounts][^sql-service-accounts]
  • LocalSystem、NetworkService 或虛擬帳戶走到網路上時,會變成電腦帳戶(DOMAIN\電腦名稱$)。 在共用資料夾或 SQL Server 的 ACL 授與 PC$,常常就能不用網域使用者。36
  • 把網域使用者用在服務上,會在密碼營運與 Kerberoasting 兩邊都變成負債。 SCM 用儲存的密碼登入,到期就啟動失敗;為了避開而採用「永不到期 + 明文備忘」等於送給攻擊者。78
  • gMSA 由 Active Directory 自動產生並輪替密碼。 要件是網域與 KDS 根金鑰,服務設成「DOMAIN\帳戶名稱$」且密碼欄留空。有些應用程式不支援,需事先驗證。910
  • 改帳戶會改掉設定檔、%TEMP%、DPAPI 的前提。 舊帳戶 DPAPI 保護的資料,新帳戶解不開。
  • 現況盤點可由服務清單的登入帳戶,以及事件識別碼 4624(登入類型 5)確認。11

一句話總結,本文結論是:把「不把人類密碼交給服務」的組態(內建帳戶、虛擬帳戶、gMSA)當預設,網域使用者當最後手段

2. 選項全貌 ── 六種登入帳戶一張表

先複習一層前提。服務啟動時,服務控制管理員(SCM)以設定的帳戶登入,成功後建立存取權杖並指派給服務處理程序。之後檔案、管道等一切資源存取,都靠這個權杖與 ACL 比對來判定。7 所以選定登入帳戶就是 決定交給服務處理程序的權杖內容的設計。以下列出六種選擇。

服務啟動時 SCM 做的事SCM 以設定的帳戶登入,成功後建立存取權杖並指派給服務處理程序,之後資源存取由權杖與 ACL 比對決定SCM以設定的帳戶登入建立存取權杖指派給服務處理程序存取檔案或管道ACL 允許嗎?存取成功存取被拒

圖 2: 服務的每一次資源存取,都由啟動時 SCM 建立的權杖與 ACL 比對決定。

帳戶 本機權限 網路身分 密碼管理 典型用途
LocalSystem 幾乎無限制(SYSTEM+Administrators) 電腦帳戶(PC$) 不需要(無密碼) 與作業系統一體運作的例外服務
LocalService 最小(Users 級) 匿名 不需要 不需要網路身分的本機處理
NetworkService 最小(Users 級) 電腦帳戶(PC$) 不需要 機器級身分就夠用的低權限處理
虛擬帳戶 NT SERVICE\<名稱> 最小 + 在 ACL 個別授與 電腦帳戶(PC$) 不需要(自動管理) 跑在單一伺服器上的業務服務預設
網域使用者 只限你授與的 該使用者本身 手動(到期、外洩、輪替都交給人) 不支援 gMSA 的應用程式的最後手段
gMSA 只限你授與的 該 gMSA 本身 AD 自動產生並輪替 網域環境需要服務專屬身分時

LocalSystem、LocalService、NetworkService、虛擬帳戶都 完全沒有密碼這個概念。用 SCM 儲存的密碼登入(= 可能到期與外洩)的只有網域使用者與本機使用者。73

下面依列逐一深入。

3. LocalSystem 有什麼問題

3.1. 比「以系統管理員身分執行」更強

LocalSystem(顯示名稱 Local System,NT AUTHORITY\SYSTEM)是 SCM 使用的預先定義帳戶,在本機電腦持有廣泛權限。權杖含 NT AUTHORITY\SYSTEMBUILTIN\Administrators 的 SID,可存取系統上大多數物件。此外,可偵錯其他處理程序的 SeDebugPrivilege,以及作為作業系統一部分運作的 SeTcbPrivilege,預設就已啟用。3

這份強大等同於被接管時的傷害規模。以 LocalSystem 執行的服務只要有一個任意程式碼執行弱點,攻擊者一口氣就能讀改該機器上所有使用者的檔案(SYSTEM 在 NTFS 預設具有完全控制5)、用 SeDebugPrivilege 讀其他處理程序記憶體,再從那裡竊取認證並橫向移動(Pass-the-Hash 等的起點)。認證竊取與橫向移動的鏈條見「圖解NTLM與Kerberos」與「Windows LAPS 實務指南」。

LocalSystem 服務被接管時的傷害以 LocalSystem 執行的服務只要有一個任意程式碼執行弱點,攻擊者就能讀改所有使用者檔案、讀其他處理程序記憶體,並竊取認證後橫向移動一個任意程式碼執行弱點攻擊者取得 SYSTEM 權限讀取與竄改檔案讀其他處理程序記憶體竊取認證橫向移動到另一台機器

圖 3: LocalSystem 服務的一個弱點,就能一口氣走到整機接管與橫向移動的起點。

3.2. 為什麼還是被選

理由很單純:它是預設值,而且不會出現存取被拒sc.exe create 省略 obj= 時預設是 LocalSystem,4 許多舊範例程式與安裝程式範本仍假設 LocalSystem。開發期間可以遠離權限錯誤,於是大量產出「能跑就先這樣」的結構。Microsoft 自己的文件也寫道,多數服務不需要這麼高的權限層級,若不需要就應考慮 LocalService 或 NetworkService。3

LocalSystem 持續被選的結構sc.exe create 預設是 LocalSystem,舊範例與範本也假設 LocalSystem,開發時不會出現存取被拒,於是大量產出能跑就先這樣的組態sc.exe create 的預設建成 LocalSystem舊範例與範本開發時沒有存取被拒能跑就先這樣權限過大的服務被量產

圖 4: 預設值加上「沒有存取被拒」的開發體驗,量產了凍在 LocalSystem 的服務。

3.3. 與 TrustedInstaller 的差別 ── LocalSystem 也不是無限

把 LocalSystem 叫成「Windows 最強帳戶」並不準確。Windows Vista 起的 Windows 資源保護(WRP)只允許 TrustedInstaller(Windows Modules Installer 服務)變更重要的作業系統系統檔、資料夾與登錄機碼,連 SYSTEM 或系統管理員改寫都會存取被拒。12 Explorer 的「您需要來自 TrustedInstaller 的權限」就是這個機制。反過來說,LocalSystem 幾乎能碰到 WRP 保護區以外的一切,通常沒有理由把這個給業務服務。

WRP 保護區與 TrustedInstaller 的關係WRP 保護的重要系統檔與登錄機碼,只允許 TrustedInstaller 變更,連 SYSTEM 或系統管理員都會存取被拒可以變更存取被拒幾乎全部允許TrustedInstallerWRP 保護的系統檔等SYSTEM 與系統管理員WRP 保護區以外

圖 5: LocalSystem 也不是無限;WRP 保護區的變更只允許 TrustedInstaller。

3.4. LocalSystem 合理的情況

例外合理的是 所需權限本來就超過系統管理員級 的服務 ── 與裝置驅動程式緊密配合、操作作業系統安全性基礎、管理其他服務或工作階段等。備份代理程式或 EDR 這類軟體屬此。即便如此,仍值得確認是否真有用到該權限的程式碼路徑,並考慮能否把需要權限的工作分開(怎麼分辨見「Windows 什麼時候需要系統管理員權限」)。

4. LocalService 與 NetworkService ── 最小權限的內建帳戶

LocalService(NT AUTHORITY\LOCAL SERVICE,SID: S-1-5-19)與 NetworkService(NT AUTHORITY\NETWORK SERVICE,SID: S-1-5-20)是為低權限服務準備的內建帳戶。兩者在本機都只有最小權限,能做的事比 Users 群組成員多不了多少。51

兩者差別只有一點:從網路另一端看起來是誰5

  • LocalService:以 匿名認證 連到遠端。無法存取需要驗證的資源。
  • NetworkService:向遠端出示 電腦的認證(網域環境為 DOMAIN\電腦名稱$)。

切分是「不上網路,或上了也不需要身分」用 LocalService,「要以機器身分存取網域內資源」用 NetworkService。

LocalService 與 NetworkService 的差別本機權限兩者都最小,但對遠端 LocalService 以匿名認證連線,NetworkService 出示電腦的認證LocalService以匿名認證連線需要驗證的資源做不到NetworkService出示電腦的認證網域環境看起來像 PC$

圖 6: 本機權限同為最小,但從網路另一端看到的身分分成匿名或電腦帳戶。

不過從現代觀點,這兩者有弱點。同一個帳戶被許多服務共用。 若五個服務都以 LocalService 執行,只要 ACL 是依帳戶,五個就能互相存取對方的資源。SQL Server 不支援 Local Service 帳戶也是同一理由:它是共用帳戶,無法與其他服務分開。1

共用帳戶無法分開若多個服務共用同一個 LocalService,只要 ACL 依帳戶,就能互相存取對方的資源服務 A同一個 LocalService服務 B服務 C能互相存取對方的資源因為 ACL 是依帳戶

圖 7: 共用同一帳戶的服務,無法用 ACL 把彼此的資源分開。

解決「維持低權限,但依服務分開」的,就是下一題的虛擬帳戶。

5. 虛擬帳戶(NT SERVICE\<服務名稱>)── 現代預設

5.1. 不必密碼就能有每服務身分

虛擬帳戶是 Windows Server 2008 R2 / Windows 7 起可用的「受控本機帳戶」。特性有三。6

  • 帳戶 自動管理;不必建立也不必設密碼
  • 名稱是 NT SERVICE\<服務名稱>,成為 每個服務獨有的身分
  • 在網域環境可用 電腦帳戶的認證(DOMAIN\電腦名稱$) 存取網路

也就是保住 LocalService/NetworkService「不必管密碼」的優點,拿掉「帳戶共用所以分不開」的缺點。SQL Server 安裝預設用 NT SERVICE\MSSQLSERVER 這類虛擬帳戶,也是這個原因。1

虛擬帳戶讓什麼得以並存虛擬帳戶保住 LocalService 與 NetworkService 不必管密碼的優點,拿掉因共用而分不開的缺點,並具備每個服務獨有的身分保住拿掉優點(不必管密碼)虛擬帳戶缺點(共用而分不開)每個服務獨有的身分不必建立也不必設密碼

圖 8: 虛擬帳戶保住內建帳戶的優點,只拿掉因共用而分不開的缺點。

5.2. 可在 ACL 上直接寫「NT SERVICE\服務名稱」

實務上的方便是 可以依名稱只把該服務加進 ACL。「只有這個服務能寫這個資料資料夾」不必建群組也不必管密碼就能做到。

# Change the service's logon account to a virtual account
# The value of obj= is "NT SERVICE\service-name". Do not specify a password
sc.exe config MyAppService obj= "NT SERVICE\MyAppService"

# Confirm the configuration (check SERVICE_START_NAME)
sc.exe qc MyAppService

# Grant modify rights on the data folder to this service only
icacls "C:\ProgramData\MyApp" /grant "NT SERVICE\MyAppService:(OI)(CI)M"

在 GUI 裡,於 services.msc 開啟服務內容 →「登入」索引標籤 → 在「此帳戶」輸入 NT SERVICE\服務名稱密碼欄留空(虛擬帳戶或 MSA 不指定密碼是 SCM 的規格)。變更後重新啟動服務即套用。

5.3. 限制 ── 出了機器就不是「那個服務」

虛擬帳戶的身分是機器本機的,網域認不出來。到了網路上會如後文所述縮成電腦帳戶,所以 遠端分不出「是哪個服務」,也不能在多台伺服器共用同一身分。10

虛擬帳戶的身分在機器外會縮水在機器內每個服務獨有的虛擬帳戶,到了網路上也縮成電腦帳戶,遠端分不出是哪個服務虛擬帳戶 A電腦帳戶 PC$虛擬帳戶 B遠端看到的身分分不出是哪個服務

圖 9: 即使機器內身分獨有,在網路另一端每個服務看起來都是同一個 PC$。

這個限制 ── 需要在網路另一端有服務專屬身分、需要在多台伺服器共用同一身分 ── 成為問題的那一刻,就是該叫出 gMSA(第 8 章)的時候。

6. 走上網路時的身分 ── 電腦帳戶(PC$)的實務

6.1. 「服務存不到共用資料夾」是誤解

在已加入網域的機器上,以 LocalSystem、NetworkService 或虛擬帳戶執行的服務存取遠端資源時,會以電腦帳戶(DOMAIN\電腦名稱$)驗證36 開頭那些「存不到共用資料夾所以改成網域使用者」的諮詢,其實多半這樣就解了。只是目的端 ACL 沒有允許 PC$。

以電腦帳戶進行遠端存取已加入網域的機器上,LocalSystem、NetworkService 或虛擬帳戶服務以電腦帳戶向遠端驗證,目的端 ACL 允許 PC$ 就能存取服務(LocalSystem、虛擬帳戶等)以 PC$ 驗證目的端 ACL 允許 PC$ 嗎?共用資料夾或資料庫存取成功存取被拒

圖 10: 在網域環境,只要在目的端 ACL 授與 PC$,不必網域使用者也能建立遠端存取。

檔案伺服器端的授與與一般 ACL 操作相同;帳戶名稱指定 電腦名稱$(GUI 物件選擇對話方塊請把物件類型含「電腦」)。

# On the file-server side: grant a service on APPSV01 modify rights on the shared folder
# You need to grant both share permissions and NTFS permissions
Grant-SmbShareAccess -Name "AppData" -AccountName "CORP\APPSV01$" -AccessRight Change -Force
icacls "D:\Shares\AppData" /grant "CORP\APPSV01$:(OI)(CI)M"

SQL Server 也一樣:把電腦帳戶建成登入,連線字串用 Integrated Security=true 即可,不必密碼。

-- On the DB-server side: permit Windows integrated authentication from a service on APPSV01
CREATE LOGIN [CORP\APPSV01$] FROM WINDOWS;

6.2. 認清 PC$ 做法的極限

這種做法有兩個極限。

  1. 粒度是整台機器。 同一機器上的 LocalSystem、NetworkService 與所有虛擬帳戶服務,從遠端看起來都是同一個 PC$。無法在目的端「只允許這個服務」,也無法稽核是哪個服務用了該帳戶。2
  2. 工作群組環境不能用。 電腦帳戶是 Active Directory 物件,未加入網域的機器沒有。需要明確處理目的端帳戶認證的設計。

想越過極限 1 時,2026 年的答案不是下一章的網域使用者……而是跳過那個問題,直接走向 gMSA。

PC$ 做法的兩個極限以 PC$ 驗證的粒度是機器級,無法做每服務允許或稽核;工作群組環境沒有電腦帳戶本身,因此不能用PC$ 做法極限 1:整台機器極限 2:沒有工作群組沒有每服務允許或稽核使用明確認證越過這裡:gMSA

圖 11: 想越過機器級粒度與網域前提這兩個極限時,跳過網域使用者,走向 gMSA。

7. 把網域使用者用在服務上的問題

7.1. 密碼的結構性問題

若把網域使用者(或本機使用者)指派給服務,SCM 會儲存該密碼,每次啟動都用它登入。SCM 不管到期,所以 密碼到期登入就失敗,服務不會啟動7

從那裡開始,現場常見的負向螺旋出現。

  1. 發生因到期而服務停止的事故
  2. 為防再發,設成「密碼永不到期」
  3. 變更程序從未建立,同一密碼以明文寫進多台伺服器的操作手冊、指令碼與工作排程器
  4. 即使有人離職也不改密碼(一改就不知道什麼會停)
以網域使用者營運的負向螺旋密碼到期服務停止,為防再發設成永不到期,明文密碼散進操作手冊與指令碼,即使有人離職也改不了1. 到期讓服務停止2. 為防再發設成永不到期3. 明文密碼擴散操作手冊、指令碼、工作4. 即使有人離職也改不了

圖 12: 從到期事故開始,永不到期與明文密碼擴散就此固定。

Microsoft 也指出,服務使用網域帳戶的組態,在密碼與 SPN 的手動管理上耗費可觀營運力氣,維護還可能導致服務停止。1

7.2. Kerberoasting ── 服務帳戶成為目標

網域使用者服務帳戶特有的另一種攻擊是 Kerberoasting。接受 Kerberos 驗證的服務會在登入帳戶上登錄 SPN(服務主體名稱)。網域內任何已驗證使用者都能向已登錄 SPN 的帳戶要求服務票證,攻擊者取得票證後離線暴力破解密碼。人類決定的 10 到 16 字元密碼擋不住這次攻擊。

Kerberoasting 的流程對已登錄 SPN 的服務帳戶的服務票證,任何已驗證使用者都能要求,攻擊者取得票證後離線暴力破解密碼網域內已驗證的使用者要求該 SPN 的票證取得服務票證離線暴力破解大約 10 到 16 字元就會被破解

圖 13: 任何已驗證使用者都能要求票證,人類決定長度的密碼擋不住離線暴力破解。

有效對應是 把密碼做成人類猜不到也破解不了的強度。Microsoft 也列出強制長密碼,以及使用密碼為機器產生長隨機值的 gMSA。8 同一文件也提到 Kerberos 裝甲(FAST),但 FAST 保護預先驗證資料與對抗 KDC 詐騙;它並不阻止已驗證使用者向 SPN 要求服務票證,因此不能替代服務帳戶的密碼強度。SPN 與 Kerberos 的關係、驗證退回 NTLM 的條件,圖解於「圖解NTLM與Kerberos」。

7.3. 若仍使用網域使用者

若因應用程式不支援 gMSA 等原因別無選擇,把以下當作最低限度的緩解。

  • 把密碼做成隨機產生的 25 字元以上,除密碼管理工具外(操作手冊、指令碼、共用 Excel)哪裡都不寫
  • 做成服務專用帳戶並依服務拆開(不要與人類帳戶共用2
  • 拒絕互動式登入與遠端桌面,只允許「以服務身分登入」
  • 所屬群組最小化(加入 Domain Admins 想都別想)
  • 建立定期輪替程序,把變更會影響的地方列入清冊

全部做完仍比遷到 gMSA 更不安全也更不省事 ── 那就是下一章。

8. gMSA ── 把密碼管理交給 Active Directory

8.1. 機制與效果

gMSA(群組受控服務帳戶)是把密碼管理交給網域控制站的網域帳戶。密碼由網域控制站從 KDS(Key Distribution Service)根金鑰計算,只有獲准的主機能取得。13

gMSA 如何管理密碼網域控制站從 KDS 根金鑰計算密碼,只有獲准的主機取得並用來執行服務,密碼預設每 30 天自動輪替KDS 根金鑰DC 計算密碼獲准的主機取得用來執行服務預設每 30 天自動輪替

圖 14: 網域控制站承擔產生、發佈與更新密碼,人可以在不知道密碼的情況下營運。

效果很清楚。9

  • 240 位元組隨機產生的密碼:暴力破解與字典攻擊變得不實際,Kerberoasting 抗性大幅上升
  • 預設每 30 天自動輪替:人不需要規劃變更,服務也不需要停
  • 可在多台伺服器共用同一身分:負載平衡下的伺服器陣列能以同一主體互相驗證
  • 更單純的 SPN 管理:SPN 的登錄與管理也可委派並簡化

人可以在不知道密碼的情況下營運 ── 若把它理解成 Windows LAPS 對本機系統管理員密碼所做的事,套到服務帳戶上的機制,位置就比較好抓。

8.2. 要件

gMSA 有前提。10

  • Active Directory 網域環境(工作群組做不到)
  • 網域與樹系功能等級為 Windows Server 2012 或更高
  • KDS 根金鑰已經建立
  • gMSA 名稱在樹系內唯一,不只是網域內
  • 密碼變更間隔只能在建立時設定

建立 KDS 根金鑰是一次性工作,但 建立後最多 10 小時不能建立 gMSA,因為要等複寫到每一台網域控制站。這是防止複寫尚未完成就取密碼失敗的安全裝置。14

從建立 KDS 根金鑰到建立 gMSA建立 KDS 根金鑰後要等複寫到每一台網域控制站,因此最多 10 小時不能建立 gMSA;複寫完成後才能建立建立 KDS 根金鑰最多 10 小時等待複寫防止取回失敗事故的安全裝置已複寫到每一台 DC可以建立 gMSA

圖 15: 建立根金鑰後最多 10 小時的等待,是為了避免複寫尚未完成就取回失敗。

# Run as a domain administrator, on a domain controller (or an administrative
# workstation with the AD PowerShell module)

# Confirm whether a KDS root key exists, and create one if not (once per forest)
Get-KdsRootKey
Add-KdsRootKey -EffectiveImmediately   # Actually usable after up to 10 hours

8.3. 從建立到設定的程序

程序分四階段:「① 建立獲准取回的群組 → ② 建立 gMSA → ③ 安裝到伺服器 → ④ 設定到服務」。10

導入 gMSA 的四個階段以四個階段導入:建立獲准取回密碼的群組、建立 gMSA、安裝到各伺服器、設為服務的登入帳戶① 建立獲准取回的群組② 建立 gMSA加入伺服器的 PC$③ 安裝到各伺服器用 Test 命令驗證取回④ 設定到服務

圖 16: 從建立群組到設定服務,導入 gMSA 分四個階段進行。

# ① Create a security group permitted to retrieve the password,
#    and add the computer accounts of the servers that will run the service
New-ADGroup -Name "GG-SvcBatchHosts" -GroupScope Global
Add-ADGroupMember -Identity "GG-SvcBatchHosts" -Members "APPSV01$", "APPSV02$"
# Group membership is evaluated at computer logon, so
# restarting the target servers after adding is the reliable approach

# ② Create the gMSA
New-ADServiceAccount -Name "svc-batch" `
    -DNSHostName "svc-batch.corp.example.com" `
    -PrincipalsAllowedToRetrieveManagedPassword "GG-SvcBatchHosts"

# ③ On each server that will run the service, install the gMSA and validate
Install-ADServiceAccount -Identity "svc-batch"
Test-ADServiceAccount -Identity "svc-batch"   # True means retrieval is working

# ④ Set it as the service's logon account. Append $ to the name, and do not specify a password
sc.exe config MyBatchService obj= "CORP\svc-batch$"
Restart-Service MyBatchService

從 services.msc 設定時,帳戶名稱也像 CORP\svc-batch$ ── 結尾加上 $,密碼欄留空。MSA 系列帳戶不能用於互動式登入。1 之後在共用資料夾或 SQL Server 的 ACL 授與 CORP\svc-batch$ 取代 PC$,以服務專屬身分的網路存取就完成了,而且不必密碼。

8.4. 有些應用程式不支援

要注意的是,不是每套軟體都能以 gMSA 執行。透過標準機制設定登入身分的 ── Windows 服務、IIS 應用程式集區、工作排程器工作 ── 支援面很廣,但也有限制,例如容錯移轉叢集本身不支援 gMSA,以及內部要求密碼的應用程式不能用。10 Microsoft 也明白寫道,正式上線前應在測試環境確認以 gMSA 執行的行為。9

如何判斷是否支援 gMSA透過標準機制設定登入身分的應用程式廣泛支援 gMSA,但容錯移轉叢集與內部要求密碼的應用程式不能用,因此正式上線前要在測試環境確認標準機制要求密碼目標應用程式登入怎麼設定?支援 gMSA服務、IIS、工作不能用 gMSA容錯移轉叢集正式上線前測試

圖 17: 透過標準機制設定登入的應用程式廣泛支援,但也有不支援的設計,正式上線前的驗證不可或缺。

還有兄弟帳戶:單一伺服器的 sMSA(獨立受控服務帳戶),以及 Windows Server 2025 導入、綁定裝置身分以對抗認證竊取的 dMSA(委派受控服務帳戶)。新建時以 gMSA 為基準,再依需求考慮。6

9. 隨附設計 ── 登入權利、設定檔、DPAPI、稽核

還有四件會隨帳戶改變的事要記住。

9.1. 「以服務身分登入」權利(SeServiceLogonRight)

要以服務啟動,帳戶需要「以服務身分登入」使用者權利。LocalSystem、LocalService、NetworkService 內建就有,但 其他帳戶(網域使用者、gMSA 等)需要明確指派15

若從 services.msc GUI 的「登入」索引標籤設定,嵌入式管理單元會自動授與此權利。另一方面,CreateService / ChangeServiceConfigsc.exe config 呼叫的 API)並不驗證指定帳戶是否有此權利。用指令碼設定的服務在啟動時以「因登入失敗而無法啟動服務」停下,典型原因就是這個。不要依賴工具的副作用;把明確加入本機安全性原則(secpol.msc)的「以服務身分登入」,或透過 GPO/Intune 設定,寫進部署程序(若此權利由群組原則設定,原則套用時會覆寫本機授與,這一點也要注意)。反過來說,服務專用帳戶的標準動作是一併設定「拒絕本機登入」。

「以服務身分登入」權利因設定路徑而異services.msc GUI 會自動授與權利,但 sc.exe config 呼叫的 API 不驗證權利,沒有權利的帳戶會在啟動時因登入失敗而停下在 services.msc 設定權利自動授與服務可以啟動用 sc.exe config 設定不驗證權利有權利嗎?服務可以啟動因登入失敗停下用 secpol.msc 或 GPO 明確授與

圖 18: GUI 會自動授與權利,但指令碼設定不驗證,因此程序裡必須包含明確授與。

9.2. 設定檔、%TEMP%、HKEY_CURRENT_USER 會變

SCM 在服務啟動時載入該帳戶的使用者設定檔。7 因此實際的 %TEMP%%APPDATA%HKEY_CURRENT_USER 依登入帳戶而不同,切換帳戶後,舊帳戶設定檔裡存的設定與快取看起來像「消失了」。

設計上的對應很單純:把服務資料不要放在設定檔底下,而是放在 C:\ProgramData\<應用程式名稱> 這類明確路徑,并把該 ACL 授與登入帳戶。這樣帳戶變更就不必伴隨資料移轉。

設定檔依賴與資料放置的對應實際設定檔依登入帳戶而不同,切換帳戶會讓舊設定檔資料看起來像消失,但放在明確路徑並授與 ACL 就不必移轉對應切換登入帳戶載入不同的設定檔舊資料看起來像消失放到 ProgramData 底下把 ACL 授與登入帳戶帳戶變更也不必移轉

圖 19: 避開設定檔、把資料放在明確路徑,帳戶變更就不再伴隨資料移轉。

9.3. 以 DPAPI 保護的資料綁在帳戶上

更容易漏掉的是 DPAPI。以使用者範圍 DPAPI(CryptProtectData 或 .NET 的 ProtectedData)加密的資料,原則上只有當初保護它的同一個帳戶才能解密。一改帳戶,存好的連線字串或 API 金鑰就讀不到 ── 那是 DPAPI 在正確做事,但若不在移轉程序裡就會變成事故。

DPAPI 保護資料與帳戶變更的關係以使用者範圍 DPAPI 保護的資料只能由當初保護它的同一個帳戶解密,因此變更登入帳戶後需要重新輸入祕密同一個舊帳戶新帳戶用舊帳戶做 DPAPI 保護受保護的連線字串等哪個帳戶在解密?能解密不能解密重新輸入祕密

圖 20: DPAPI 保護的資料綁在當初保護它的帳戶上,帳戶切換後需要重新輸入。

對應是把「帳戶切換後重新輸入祕密」寫進移轉計畫(儲存在哪裡的設計見「Windows 應用程式不要把機密資訊以明文存進設定檔的最佳實踐」)。此外,能用 gMSA 或 PC$ 以 Windows 整合式驗證做完的組態,可以根本不必儲存祕密。正確順序是先考慮「能否不存」,再考慮「存在哪裡」

若服務想「以呼叫者的權限」處理,不要把帳戶變得更強,而是用模擬。那見「正確處理 Windows 偽裝權杖」。

9.4. 稽核 ── 看 4624 登入類型 5

服務啟動會以事件識別碼 4624(帳戶已成功登入)的 登入類型 5(Service:SCM 啟動了服務) 寫入安全性事件記錄。事件中的「Virtual Account」欄位指出登入是否由 MSA / 虛擬帳戶進行,也可用來監看受控帳戶的使用。11

稽核服務啟動的流程SCM 啟動服務會記錄為事件識別碼 4624 登入類型 5,Virtual Account 欄位可識別是否為受控帳戶登入SCM 啟動服務記錄事件識別碼 4624登入類型 5(Service)Virtual Account 欄位監看受控帳戶

圖 21: 服務啟動記錄為登入類型 5 的 4624,連受控帳戶的使用都能追蹤。

現況盤點的快方法是彙總服務清單的登入帳戶。

# Aggregate which services are running as which account
Get-CimInstance Win32_Service |
    Group-Object StartName |
    Sort-Object Count -Descending |
    Select-Object Count, Name

# Inventory non-standard services running as LocalSystem (tell in-house / third-party by the path)
Get-CimInstance Win32_Service |
    Where-Object { $_.StartName -eq 'LocalSystem' -and $_.PathName -notlike '*\Windows\*' } |
    Select-Object Name, DisplayName, PathName

若這份輸出排著「以 LocalSystem 執行的業務服務」與「以網域使用者執行的服務」,就該叫出下一章的判斷流程。

10. 判斷流程 ── 用四個問題決定

把到目前為止的內容收成選擇程序。依序回答四個問題。

登入帳戶的判斷流程依序回答是否有網路存取、是否加入網域、機器級身分是否足夠、是否支援 gMSA 這四個問題,決定登入帳戶對端要 Windows 驗證?虛擬帳戶需要時用 LocalSystem已加入網域?保護儲存的認證機器級就夠?虛擬帳戶 + PC$應用程式支援 gMSA?gMSA使用者 + 緩解

圖 22: 依序回答四個問題,六種選擇該用哪一種就定了。

問題 1:該服務是否以 Windows 驗證存取網路上的另一台機器(共用資料夾、資料庫、API 等)?

若否,虛擬帳戶是預設。只有需要特殊本機權限時,先確認需求再考慮 LocalSystem。

問題 2:(若有存取)機器是否已加入網域?

工作群組既不能用 PC$ 也不能用 gMSA。使用明確處理目的端帳戶認證的設計(用 DPAPI 等保護儲存),或考慮加入網域。

問題 3:(在網域內)機器級身分(PC$)夠用嗎?

夠用就 虛擬帳戶(或 NetworkService)+ 在目的端 ACL 授與 PC$ 即完成。若需要服務專屬身分,或跨多台伺服器的共同身分,進問題 4。

問題 4:應用程式支援 gMSA 嗎?

支援(透過標準機制設定登入的 ── SCM、IIS 應用程式集區、工作排程器 ── 一般支援)就用 gMSA。別忘了在驗證環境做行為檢查。再怎樣都不支援,就在套用 7.3 節全部緩解後使用 專用網域使用者

做成表如下。

狀況 建議 備註
僅本機、一般權限 虛擬帳戶 把 ACL 授與 NT SERVICE\<名稱>
僅本機、需要超出系統管理員的權限 LocalSystem 先驗證權限需求
不需要網路身分的本機處理 LocalService 維持既有服務現狀時可接受
以機器身分存取網域內資源 虛擬帳戶(或 NetworkService) 在目的端 ACL 授與 PC$
以服務專屬身分存取網域內資源 gMSA KDS 根金鑰 + 確認支援
多台伺服器同一身分(負載平衡等) gMSA 虛擬帳戶做不到
不支援 gMSA 的應用程式 + 需要特定身分 專用網域使用者 需要 7.3 節的緩解
工作群組 + 需要遠端存取 保護並儲存明確認證 也考慮重新檢視設計

11. 總結

  • 服務的登入帳戶是同時決定本機權限、網路身分與密碼管理的設計決策。不要留在預設(LocalSystem)。
  • LocalSystem 持有 SYSTEM+Administrators 權杖與強特權,被接管時傷害最大化。多數業務服務不需要這個權限。
  • LocalService 與 NetworkService 都是低權限;差別是網路身分(匿名,或電腦帳戶)。但帳戶由多個服務共用,因此分不開。
  • 虛擬帳戶(NT SERVICE\<服務名稱>)是現代預設:不必管密碼又能依服務分開。可直接指定到 ACL,設定只需改登入帳戶名稱。
  • LocalSystem、NetworkService、虛擬帳戶在網域環境走上網路時是 DOMAIN\PC$。在共用資料夾或 SQL Server 的 ACL 授與 PC$,常常就能不用網域使用者。
  • 把網域使用者用在服務上,有到期停擺、明文密碼擴散、Kerberoasting 這些結構性問題。若要用,需要專用帳戶 + 長隨機密碼 + 登入限制。
  • gMSA 是 AD 自動產生並輪替密碼的機制;要件是網域、功能等級 2012 或更高、KDS 根金鑰。服務設成「DOMAIN\名稱$」且密碼欄留空。
  • 改帳戶時,把「以服務身分登入」權利、設定檔與 %TEMP% 的搬移、DPAPI 保護資料的重新輸入寫進移轉程序。稽核可用事件識別碼 4624 登入類型 5 確認。

下次安裝服務時,在登入設定畫面停一下,再問一次。這個服務應該以誰的身分、存取到多遠? 答案應該是本文判斷表的某一列。

相關文章

相關諮詢領域

小村軟體有限公司承接 Windows 服務與常駐應用程式的登入帳戶設計與最小權限強化、把以 LocalSystem 為前提打造的既有服務遷到虛擬帳戶或 gMSA,以及帳戶變更後因存取被拒、DPAPI、設定檔引起的故障調查。從「稽核被點名了,但不知道從哪裡開始」這個階段開始也可以。

參考連結

  1. Microsoft Learn, Configure Windows service accounts and permissions. SQL Server 的預設服務帳戶是虛擬帳戶(NT SERVICE\MSSQLSERVER 等)、指定虛擬帳戶或 MSA 時密碼欄留空、MSA 名稱結尾為 $ 且不能用於互動式登入、Local Service 是共用帳戶故分不開且 SQL Server 不支援、使用網域帳戶在密碼與 SPN 的手動管理上耗費力氣且維護可能導致服務停止,以及應一律以最小權限帳戶執行服務。  2 3 4 5 6

  2. Microsoft Learn, Securing on-premises service accounts. 內部部署服務的優先順序是先 gMSA、不能用再用 sMSA、然後電腦帳戶、最後使用者帳戶;使用電腦帳戶時無法得知哪個服務在用該帳戶也不能稽核變更;以及服務帳戶的角色(識別、驗證並啟動服務)。  2 3

  3. Microsoft Learn, LocalSystem Account. LocalSystem 在本機電腦持有廣泛權限且權杖含 NT AUTHORITY\SYSTEM 與 BUILTIN\Administrators 的 SID、沒有密碼、向遠端伺服器出示電腦的認證、含 SE_DEBUG_NAME 與 SE_TCB_NAME 的特權清單,以及多數服務不需要這個權限層級、應考慮使用 LocalService/NetworkService。  2 3 4 5 6

  4. Microsoft Learn, sc.exe config. 用 obj= 參數指定服務的登入帳戶、預設是 LocalSystem,以及使用 LocalSystem 以外的使用者帳戶時的 password= 參數。  2

  5. Microsoft Learn, Local accounts. SYSTEM(S-1-5-18)在 NTFS 磁碟區預設具有完全控制、NETWORK SERVICE(S-1-5-20)向遠端伺服器出示電腦的認證,以及 LOCAL SERVICE(S-1-5-19)本機權限最小、向網路出示匿名認證。  2 3 4

  6. Microsoft Learn, Service accounts. 虛擬帳戶是不需密碼管理的自動管理本機帳戶、名稱為 NT SERVICE<SERVICENAME> 形式、在網域環境以電腦帳戶認證(\$)存取網路,以及在 sMSA、gMSA、dMSA、虛擬帳戶之間選擇的準則。  2 3 4

  7. Microsoft Learn, Service User Accounts. 服務在使用者帳戶的安全性內容中執行、SCM 在啟動時登入帳戶並把存取權杖關聯到服務處理程序、SCM 載入使用者設定檔,以及 SCM 不管密碼到期,到期會讓登入失敗、服務無法啟動。  2 3 4 5

  8. Microsoft Learn, Protect SMB traffic from interception. 包含以 gMSA 作為服務帳戶保護(機器產生的長隨機密碼使暴力破解或字典攻擊不實際)、強制長密碼,以及提及 Kerberos 裝甲(FAST)等建議。  2

  9. Microsoft Learn, Secure group managed service accounts. gMSA 密碼是難以暴力破解或字典攻擊的 240 位元組隨機產生、Windows 作業系統每 30 天變更密碼故系統管理員不必規劃變更或停止服務、部署到伺服器陣列與更單純的 SPN 管理、若服務不支援 gMSA 就用 sMSA、再不行就用有強密碼管理的標準使用者帳戶,以及正式上線前應在測試環境確認以 gMSA 執行的行為。  2 3

  10. Microsoft Learn, Manage group Managed Service Accounts. gMSA 前提(網域/樹系功能等級 2012 或更高、建立 KDS 根金鑰)、gMSA 名稱必須在樹系內唯一、密碼變更間隔只能在建立時設定、用 New-ADServiceAccount 的 -PrincipalsAllowedToRetrieveManagedPassword 指定獲准取回密碼的群組、Install-ADServiceAccount/Test-ADServiceAccount 程序、虛擬帳戶身分是機器本機且網域認不出、容錯移轉叢集不支援 gMSA,以及 SCM、IIS 應用程式集區、工作排程器支援把登入設成 gMSA。  2 3 4 5

  11. Microsoft Learn, 4624(S): An account was successfully logged on. 建立登入工作階段時事件 4624 記錄在被存取的電腦上、登入類型 5 表示服務(SCM 啟動服務),以及「Virtual Account」欄位可識別 MSA 或虛擬帳戶的登入,可用來監看受控服務帳戶。  2

  12. Microsoft Learn, About Windows Resource Protection. Windows 資源保護(WRP)防止重要系統檔、資料夾與登錄機碼被取代、對 WRP 保護資源的完全存取限於 TrustedInstaller 且變更只能透過 Windows Modules Installer 服務的支援取代機制進行,以及試圖變更受保護資源的應用程式會收到存取被拒。 

  13. Microsoft Learn, Group Managed Service Accounts overview. gMSA 是把密碼管理交給 Windows 的網域帳戶、網域控制站從 Key Distribution Service(kdssvc.dll)共用祕密計算密碼且成員主機向網域控制站查詢目前與先前密碼,以及它讓伺服器陣列能以同一主體互相驗證。 

  14. Microsoft Learn, Create a Key Distribution Service (KDS) root key. 網域控制站開始產生 gMSA 密碼需要根金鑰、用 Add-KdsRootKey -EffectiveImmediately 建立的程序、建立後最多 10 小時因等待 AD 複寫收斂而不能建立 gMSA,以及複寫不完整可能讓密碼取回失敗。 

  15. Microsoft Learn, Policy CSP - UserRights: LogOnAsService. 「以服務身分登入」權利讓安全性主體能以服務登入、Local System、Local Service、Network Service 內建此權利、以其他帳戶執行的服務需要指派此權利,以及群組原則設定路徑。 

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

目前以 LocalSystem 執行的服務,應該立刻改掉嗎?
並非一律立刻變更才正確。先確認該服務是否真的需要 LocalSystem 級的本機權限(超出系統管理員的強特權)。若只是檔案讀寫與網路通訊,第一候選是改到虛擬帳戶(NT SERVICE\服務名稱)。移轉時請確認對所需資料夾與登錄機碼的存取授與、依賴設定檔或 DPAPI 的資料如何處理,以及是否具備「以服務身分登入」權利。在驗證環境確認啟動與主要功能後,再切換正式環境。
應該選虛擬帳戶還是 NetworkService?
新選時建議虛擬帳戶。兩者在網路上都顯示為電腦帳戶(DOMAIN\電腦名稱$),本機權限也都偏小。但 NetworkService 由多個服務共用,無法用 ACL 做到「只允許這個服務」。虛擬帳戶每個服務都有獨立身分,可在 ACL 上直接指定 NT SERVICE\服務名稱。SQL Server 等近年 Microsoft 產品的預設也是虛擬帳戶。
gMSA 能在工作群組環境(沒有網域)使用嗎?
不能。gMSA 是由 Active Directory 網域控制站產生並管理密碼的機制,前提是網域與建立 KDS 根金鑰。工作群組環境的基本做法是用虛擬帳戶或 LocalService/NetworkService 把本機處理做完。若需要存取另一台機器,就要改成明確使用目的端準備好的帳戶認證等其他設計。以電腦帳戶(PC$)進行的網路存取也只在網域環境成立。
改了服務的登入帳戶後,先前儲存的設定與認證就讀不到了。為什麼?
因為每個登入帳戶都綁定自己的使用者設定檔、%TEMP%、HKEY_CURRENT_USER 與 DPAPI 金鑰。尤其以使用者範圍 DPAPI(CryptProtectData 等)保護的資料,原則上只有當初保護它的同一個帳戶才能解密。存在設定檔底下(AppData 等)的檔案,對新帳戶也是另一條路徑。切換帳戶前,請規劃重新建立 DPAPI 保護資料的程序(例如重新輸入 API 金鑰)以及設定檔底下檔案的移轉。
只想讓服務存取共用資料夾,需要網域使用者嗎?
多數情況不需要。在網域環境中,以 LocalSystem、NetworkService 或虛擬帳戶執行的服務,會以電腦帳戶(DOMAIN\電腦名稱$)向遠端驗證。把該 PC$ 加到共用權限與 NTFS 權限即可讀寫。若要以服務專屬身分做存取控制,或在多台伺服器上需要同一身分,請考慮 gMSA 而不是網域使用者。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽