10.2.4 服务账户(Service accounts):为什么“服务能不能运行”和“服务该以谁的身份运行”,是两个完全不同层级的问题?
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化文章目录10.2.4 服务账户Service accounts为什么“服务能不能运行”和“服务该以谁的身份运行”是两个完全不同层级的问题1、为什么服务账户问题比普通应用更敏感2、三大内置服务账户Windows 为什么不只给你一个 SYSTEM3、本地系统账户LocalSystem为什么说它不是“管理员加强版”而是系统级超强身份3.1 它是谁3.2 它为什么这么强第一它属于本地 Administrators 组第二它可以启用几乎所有特权第三它对大量文件和注册表键拥有完全访问3.3 它用的是哪个用户配置文件3.4 它在域环境里还会带上机器身份3.5 它对网络资源并不是无限制通吃4、网络服务账户Network Service为什么它像“削弱版 SYSTEM但还保留了网络身份”4.1 它存在的目的是什么4.2 它比 LocalSystem 弱在哪里4.3 它用的是自己的专属 profile5、本地服务账户Local Service为什么它更像“只在本机低权限活动不代表机器去认证网络”5.1 它和 Network Service 的关系是什么5.2 它的组成员和 profile 在哪里5.3 哪些服务适合它6、三者放在一起看才能真正理解服务账户设计逻辑7、这一节最值得运维人员记住的实战启发7.1 服务启动失败不一定是程序坏了可能是账户权限不够7.2 服务权限过高不一定立刻出故障但会把风险推高7.3 服务拿不到当前用户设置可能不是没权限而是 profile 不是那个用户的7.4 网络访问异常要分清“本机权限”和“网络身份”是两回事8、我对这一节的理解服务账户的本质是 Windows 给后台能力画“权力边界”9、总结提升10.2.4 服务账户Service accounts为什么“服务能不能运行”和“服务该以谁的身份运行”是两个完全不同层级的问题如果说前面的Service characteristics解决的是“这个服务什么时候启动、怎么启动、失败后怎么处理。”那么Service accounts这一节解决的就是另一个更关键、也更容易被低估的问题“这个服务启动以后到底是以谁的安全身份去访问系统资源”《Windows Internals》这里开门见山地指出服务的安全上下文security context对服务开发者和系统管理员都非常重要因为它直接决定了该进程能够访问哪些资源。书中同时说明很多内置服务都会运行在合适的服务账户下而在安装服务时安装程序或管理员往往会默认指定LocalSystem这个账户非常强大另外还有两个能力较弱的内置账户Network Service和Local Service。这句话其实已经点出了服务账户这一节的核心服务账户不是“登录名”那么简单而是服务权限边界、资源可达范围、网络身份和风险暴露面的总开关。也就是说一个服务“能不能跑”和它“跑起来以后能碰到什么资源”根本不是同一个问题。很多服务故障、很多服务安全风险最终都不是出在 EXE 本身而是出在账户太强导致攻击面过大账户太弱导致资源访问失败本地权限够了但网络身份不对能读取系统配置却拿不到用户配置能访问本机却不能正确认证到其他机器所以这一节真正要建立的认知是服务账户决定的不只是进程归属而是这个服务在 Windows 安全模型里“能走到哪里”。1、为什么服务账户问题比普通应用更敏感普通交互式应用一般随当前登录用户运行所以大家天然知道“我是谁我就有什么权限。”但服务不一样。服务很多时候是在没有用户登录系统刚启动后台长期驻留需要跨机器通信需要接触系统级对象的条件下运行。因此服务账户本质上是在替系统回答一个问题“这个后台能力到底应该被赋予多大权力”书中明确说明大多数内置服务会运行在适合自己的 Service account 下而不是一律使用最强账户。原因很简单如果所有服务都跑在最高权限下那系统管理虽然方便但安全面会急剧扩大。所以服务账户这一节的底层逻辑不是“账户分类介绍”而是Windows 在后台服务世界里如何平衡“功能可用性”和“最小权限原则”。2、三大内置服务账户Windows 为什么不只给你一个 SYSTEM从 Windows 的设计看最经典的内置服务账户主要有三个LocalSystemNetwork ServiceLocal Service它们并不是平级替代关系而是权限、能力和网络行为逐级收缩的三种运行身份。书中也正是围绕这三个账户来展开说明。可以先用一句话粗略理解服务账户本机权限网络身份风险级别LocalSystem非常强可携带机器身份最高Network Service较低可用计算机账户做网络认证中Local Service较低基本只可匿名访问网络资源更低也就是说Windows 并不是只提供一个“后台运行账号”而是给出了不同安全强度的运行档位。你选的不是一个名字你选的是本机权限边界网络访问方式配置可见范围潜在攻击后果3、本地系统账户LocalSystem为什么说它不是“管理员加强版”而是系统级超强身份3.1 它是谁书中指出LocalSystem就是很多核心 Windows 用户态系统组件运行所使用的同一个账户包括Session ManagerSmss.exeWindows 子系统进程Csrss.exe本地安全机构进程Lsass.exe登录进程Winlogon.exe这说明一件很重要的事LocalSystem 不是某个普通服务专用的便利账户而是系统核心组件本身就在使用的高权力身份。所以一旦服务被配置成以 LocalSystem 运行它获得的就不是“差不多够用的权限”而是非常接近系统核心进程的能力范围。3.2 它为什么这么强书中对 LocalSystem 的描述非常直白从安全角度看LocalSystem 在本机上的安全能力比任何本地账户或域账户都更强。它之所以强主要体现在几个方面第一它属于本地 Administrators 组这意味着它天然拥有非常高的对象访问能力。书中表 10-9 也显示LocalSystem 属于Administrators、Everyone、Authenticated Users并处于System integrity level。第二它可以启用几乎所有特权书中指出LocalSystem 有权启用所有 privilege甚至包括一些普通本地管理员通常不会被授予的能力例如创建安全令牌。表 10-10 中列出的权限也远多于其他服务账户。第三它对大量文件和注册表键拥有完全访问即便某些对象没有直接授予它完全控制运行在 LocalSystem 下的进程还可以通过take-ownership privilege进一步取得访问权。这三点放在一起就能解释为什么把服务跑在 LocalSystem 下功能上最省事但安全上也最危险。3.3 它用的是哪个用户配置文件书中还提到一个很多人容易忽略的点运行在 LocalSystem 下的进程使用的是默认用户配置文件HKU\.DEFAULT。因此它们不能直接访问其他真实用户 profile 中存储的配置除非显式调用LoadUserProfile。这句话对运维和开发都很重要因为它解释了很多“为什么服务拿不到当前用户设置”的问题。也就是说即使 LocalSystem 权限极高它默认看到的也不是“某个登录用户的 HKCU”而是自己的系统默认配置上下文。所以要特别注意高权限不等于天然拥有用户级上下文LocalSystem 能碰很多系统对象但它默认并不活在某个真实登录用户的配置空间里这也是服务场景和普通用户应用场景非常不一样的地方。3.4 它在域环境里还会带上机器身份书中继续指出当计算机属于 Windows 域时LocalSystem 还会包含该计算机的 machine SID。这意味着运行在 LocalSystem 下的服务在同一 forest 的其他机器上可以自动使用这台机器的计算机账户完成身份验证。这其实是一个非常关键的网络语义差异你以为它只是“本机最强账户”但到了网络侧它还会带着“这台机器”的身份去说话所以 LocalSystem 的问题不只是“本机太强”还包括它在网络中的行为也不再是普通匿名调用。这也是为什么企业环境中服务账户选型经常会影响远程共享访问域内资源认证跨机器命名管道调用机器账户授权策略3.5 它对网络资源并不是无限制通吃书中也给了一个很有边界感的补充除非该机器账户被明确授予某些资源访问权限否则 LocalSystem 进程访问网络资源时主要能访问的是那些允许null session的资源。相关共享和命名管道可以通过HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下的NullSessionPipes和NullSessionShares来控制。这说明 LocalSystem 不是“网络随便通行证”而是在本机极强在网络上可带机器身份但是否真正能访问远端对象还取决于对方资源 ACL 和相关配置4、网络服务账户Network Service为什么它像“削弱版 SYSTEM但还保留了网络身份”4.1 它存在的目的是什么书中对Network Service的定位非常明确它用于那些希望在网络上用计算机账户进行身份验证但又不需要 LocalSystem 那么强本机能力的服务。这句话特别值得细想因为它说明 Network Service 的设计目标非常清晰保留“我代表这台机器去和别的机器说话”的能力但削弱“我在本机上无所不能”的能力。也就是说它不是 LocalService 的网络加强版也不是 LocalSystem 的轻量版而是一个专门为“需要网络身份、但不该拿太高本机权限”的服务准备的中间档位。4.2 它比 LocalSystem 弱在哪里书中指出因为 Network Service不属于 Administrators 组所以默认情况下它能访问的注册表键、文件夹和文件都会比 LocalSystem 少很多同时它拥有的 privilege 也更少。比如一个被攻破的 Network Service 进程通常无法去加载驱动也不能任意打开其他进程。这意味着它的一个核心优势是即使服务被利用攻击者能借它进一步横向或纵向扩展的空间也更有限。从系统安全设计角度看这就叫典型的缩小爆炸半径。4.3 它用的是自己的专属 profile书中还特别给出了一条很实用的信息运行在 Network Service 下的进程会使用Network Service 自己的 profile它的注册表部分加载到HKU\S-1-5-20而相关文件和目录位于%SystemRoot%\ServiceProfiles\NetworkService这一点对理解服务配置、分析服务残留文件、处理 profile 相关故障都很有帮助。5、本地服务账户Local Service为什么它更像“只在本机低权限活动不代表机器去认证网络”5.1 它和 Network Service 的关系是什么书中给出的描述非常精炼Local Service 与 Network Service 几乎相同最重要的区别在于它只能访问允许匿名访问的网络资源。这句话直接就把两者差异点钉死了两者在本机权限层面都比 LocalSystem 弱两者 privilege 级别相近真正拉开差距的是网络身份行为也就是说Network Service需要在网络侧代表本机说话Local Service基本不代表本机说话更多是本机内低权限运行5.2 它的组成员和 profile 在哪里书中说明Local Service 与 Network Service 在 group membership 上非常接近只是它属于Local Service group而不是Network Service group同时它的 profile 会加载到HKU\S-1-5-19对应目录位于%SystemRoot%\ServiceProfiles\LocalService这也意味着在实际系统中如果你看到服务读取或写入这些 profile 路径不要以为是“普通用户 profile”而要想到它可能是某个服务账户的独立配置空间。5.3 哪些服务适合它书中举的例子包括Remote Registry ServiceLmHosts service前者允许远程访问本地注册表后者负责 NetBIOS 名称解析。这类服务的共同点通常是需要后台驻留需要一定系统能力但没有必要拿到 LocalSystem 那种过大的本机权限也不需要在网络上以“本机账户”身份去大范围认证所以 Local Service 的存在本质上是在告诉你不是所有后台基础能力都需要把自己做成“系统最强权限代理”。6、三者放在一起看才能真正理解服务账户设计逻辑很多人平时会机械记忆LocalSystem 最强Network Service 次之Local Service 更弱但真正重要的不是记结论而是看出 Windows 的设计思路非常高较低需要不需要只需匿名/本地低权限活动服务需要运行需要多大本机权限?LocalSystem是否需要在网络上代表本机认证?Network ServiceLocal Service这张图对应的核心思想就是服务账户不是按名字选而是按“本机权限需求”和“网络身份需求”两个维度选。这也是为什么“默认用 SYSTEM 最省事”虽然短期上看方便但从长期稳定性和安全性看往往并不是最优解。7、这一节最值得运维人员记住的实战启发7.1 服务启动失败不一定是程序坏了可能是账户权限不够如果服务需要访问某个注册表键、系统目录、命名管道或端口而当前服务账户拿不到就会表现成启动超时、初始化失败、功能异常。7.2 服务权限过高不一定立刻出故障但会把风险推高把本来只需要普通后台能力的服务一股脑跑在 LocalSystem 下短期问题少长期风险大。因为一旦该服务被利用攻击者拿到的就是一个极强落点。7.3 服务拿不到当前用户设置可能不是没权限而是 profile 不是那个用户的LocalSystem 默认用HKU\.DEFAULTNetwork Service 和 Local Service 也各自有独立的 profile。所以服务访问不到“当前登录用户的 HKCU”并不奇怪很多时候这是模型设计使然。7.4 网络访问异常要分清“本机权限”和“网络身份”是两回事某服务在本机能读能写不代表它在网络上就能正确认证反过来一个需要代表本机到别处认证的服务也不一定需要 LocalSystem 那么高的本机权限。这正是 Local Service 与 Network Service 分离出来的意义。8、我对这一节的理解服务账户的本质是 Windows 给后台能力画“权力边界”10.2.4 表面上看是在介绍三个账户实际上真正讲的是一套很成熟的系统治理思想给后台服务足够的能力去完成工作但不要无条件给它最高权限把“本机能力”和“网络身份”拆开设计把不同服务放到不同风险档位上运行这套思路非常符合现代系统安全的基本原则能少给就少给能拆开就拆开能限制影响面就不要把所有能力绑死在一个超强身份上。所以如果要给这一节写一句最适合放在结尾的话我会这样写服务账户的选择本质上不是“这个服务用哪个账号启动”而是“这个后台能力应该被允许拥有多大的系统权力和多强的网络身份”。9、总结提升这一节最核心的内容可以压缩成下面几条服务账户决定服务进程能访问哪些资源因此是服务设计和系统管理中的关键安全变量。LocalSystem权限极强属于 Administrators可启用大量 privilege默认使用HKU\.DEFAULT在域环境下还能携带机器身份进行网络认证。Network Service本机权限明显弱于 LocalSystem但仍可以在网络上以计算机账户身份进行认证profile 位于HKU\S-1-5-20和%SystemRoot%\ServiceProfiles\NetworkService。Local Service与 Network Service 类似但网络侧基本只访问允许匿名访问的资源profile 位于HKU\S-1-5-19和%SystemRoot%\ServiceProfiles\LocalService。所以站在《Windows Internals》这一章的主线上看10.2.4 真正想让你理解的不是“三个账户的定义”而是 Windows 如何通过不同服务账户把后台服务的权限边界做细、做弱、做分层。下一段如果继续顺着写最自然的衔接就是10.2.5 以其他账户运行服务Running services in alternate accounts因为前面讲的是内置服务账户后面就顺势进入那如果内置账户都不合适服务还能不能跑在别的账号下