当前位置: 首页 > news >正文

《Windows Internals》10.2.10 服务隔离:为什么 Service SID 能让服务拥有自己的安全身份?


🔥个人主页:杨利杰YJlio
❄️个人专栏:《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》
《微信助手》 《锤子助手》 《Python》 《Kali Linux》
《那些年未解决的Windows疑难杂症》
🌟让复杂的事情更简单,让重复的工作自动化


文章目录

  • 1. 《Windows Internals》10.2.10 服务隔离:为什么 Service SID 能让服务拥有自己的安全身份?
  • 2. 先说结论:服务隔离解决的是“同账户多服务边界不清”的问题
  • 3. 为什么仅靠服务账户隔离不够?
    • 3.1 只靠服务账户的典型问题
  • 4. 什么是 Service SID?
    • 4.1 Service SID 和服务账户有什么区别?
  • 5. Service SID 是如何参与访问控制的?
  • 6. Service SID 在服务启动时是如何进入 Token 的?
  • 7. 如何查看一个服务的 Service SID?
  • 8. Unrestricted 和 Restricted 有什么区别?
    • 8.1 Unrestricted:服务 SID 进入 Token,用于正常 ACL 授权
    • 8.2 Restricted:进一步限制服务访问边界
  • 9. 从桌面支持视角,如何理解服务隔离?
    • 9.1 一个推荐排查思路
    • 9.2 常用排查命令
      • 查看服务配置
      • 查看服务 SID
      • 查看服务 SID 类型
      • 查看服务对应进程
      • 查看某个 svchost 托管哪些服务
      • 查看目录 ACL
      • 给服务授权目录访问
  • 10. 服务隔离的核心流程
    • 10.1 SCM 启动服务
    • 10.2 生成服务身份
    • 10.3 注入 Service SID
    • 10.4 按 ACL 访问资源
  • 11. 服务隔离和虚拟服务账户有什么关系?
  • 12. 常见误区:服务隔离不是“绝对安全”,而是降低影响范围
    • 12.1 误区一:服务有了 Service SID 就绝对安全
    • 12.2 误区二:服务隔离可以替代最小权限运行
    • 12.3 误区三:只要服务运行在 LocalSystem 下,Service SID 就没意义
    • 12.4 误区四:共享 svchost 中的服务隔离效果和独立进程完全一样
  • 13. 总结提升
    • 下一篇预告

1. 《Windows Internals》10.2.10 服务隔离:为什么 Service SID 能让服务拥有自己的安全身份?

在学习《Windows Internals》10.2.10 服务隔离(Service isolation)这一小节时,我觉得它对 Windows 桌面支持、系统服务排障、安全加固都非常有价值。

很多人理解 Windows 服务时,容易停留在一个比较简单的层面:

服务运行在LocalSystemLocalServiceNetworkService或某个域账户下面,所以服务的权限主要由运行账户决定。

这个理解没错,但还不够细。

因为在真实系统里,很多服务可能运行在同一个账户下。如果只靠账户做隔离,就会出现一个问题:

多个服务共享同一个账户身份时,系统很难精确区分“到底是哪一个服务”在访问资源。

这就引出了 Windows 服务隔离机制中的关键能力:

Service SID。

简单理解,Service SID 就是 Windows 为每个服务生成的一种独立安全身份
它可以被加入服务进程的访问令牌中,然后被写入文件、注册表、命名管道、互斥体等资源的 ACL 中,用来实现更细粒度的访问控制。

这一篇文章就围绕Service isolation 服务隔离,从概念、原理、Service SID、ACL 授权、桌面支持排障价值几个角度,把这一节讲清楚。


2. 先说结论:服务隔离解决的是“同账户多服务边界不清”的问题

Windows 服务经常运行在以下账户下:

服务账户常见用途风险点
LocalSystem高权限系统服务权限极大,被滥用风险高
LocalService本地低权限服务多个服务可能共享同一身份
NetworkService需要网络身份的服务网络访问相关风险更明显
域账户企业业务服务凭据、权限、横向访问风险
NT SERVICE\<ServiceName>虚拟服务账户更适合服务级隔离

如果只按账户区分服务,会出现一个很现实的问题:

多个服务共用一个账户时,系统只能看到“这个账户在访问资源”,但不能天然精确区分“具体是哪一个服务”。

例如两个服务都运行在LocalService下:

ServiceA → LocalService ServiceB → LocalService

如果某个资源只授予LocalService访问权限,那么 ServiceA 和 ServiceB 都可能获得访问能力。
这就不是精细化隔离,而是账户级粗粒度隔离。

Service SID 的价值就在于:

即使多个服务运行在同一个账户下,Windows 仍然可以为每个服务提供一个唯一的服务级安全身份。

也就是说,隔离粒度从:

账户级别

进一步细化到:

服务级别

这就是服务隔离的核心。


3. 为什么仅靠服务账户隔离不够?

如果一个服务单独使用一个专用账户,隔离效果当然更好。
但在实际 Windows 系统中,服务数量很多,如果每个服务都创建一个完整用户账户,会带来明显管理成本。

因此 Windows 长期存在大量共享账户运行服务的情况,例如:

  • 多个服务运行在LocalSystem
  • 多个服务运行在LocalService
  • 多个服务运行在NetworkService
  • 多个服务托管在同一个svchost.exe进程中

这就形成了一个经典矛盾:

账户越共享,管理越简单;但安全边界越模糊。

3.1 只靠服务账户的典型问题

如果只靠服务账户做隔离,会带来几个问题:

  1. 身份粒度太粗
    只能识别账户,不能精确识别服务。

  2. 资源授权不够细
    资源 ACL 只能写账户,不能只授权某个具体服务。

  3. 横向影响范围大
    一个服务被利用后,攻击者可能借同一账户访问其他资源。

  4. 审计不够清晰
    安全日志里可能只看到账户,难以判断具体服务来源。

所以从安全设计角度看:

账户身份只能解决“谁运行”,Service SID 才能进一步解决“是哪一个服务在运行”。


4. 什么是 Service SID?

Service SID可以理解为 Windows 为服务生成的唯一安全标识符。

它的名称形式通常类似:

NT SERVICE\<ServiceName>

例如:

NT SERVICE\CryptSvc NT SERVICE\WinDefend NT SERVICE\Spooler

它底层对应的 SID 通常类似:

S-1-5-80-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx

其中:

  • S-1-5-80表示服务 SID 命名空间;
  • 后面的长数字通常根据服务名称生成;
  • 每个服务拥有自己独立的 Service SID。

你可以把它理解为:

服务在 Windows 安全模型中的身份证。

4.1 Service SID 和服务账户有什么区别?

对比项服务账户Service SID
表示对象运行服务的账户某一个具体服务
粒度账户级服务级
是否唯一对应服务不一定
是否适合 ACL 授权可以,但较粗更适合精确授权
典型形式LocalSystemNetworkServiceNT SERVICE\CryptSvc
主要价值提供运行上下文提供服务级安全身份

一句话总结:

服务账户决定服务“以谁的权限运行”,Service SID 决定系统能否“把某个服务单独识别出来”。


5. Service SID 是如何参与访问控制的?

Service SID 最大的价值,不是“看起来多了一个身份”,而是它可以被用于ACL 访问控制

Windows 中很多资源都可以配置 ACL,例如:

  • 文件夹
  • 文件
  • 注册表项
  • 命名管道
  • 事件日志
  • 互斥体
  • 服务对象
  • 其他内核对象

如果资源 ACL 中写入某个服务的 Service SID,那么就可以做到:

只允许这个服务访问,而不是允许整个账户下的所有服务访问。

例如某个服务叫:

ContosoUpdateSvc

可以把某个目录只授权给这个服务:

icacls "C:\ProgramData\Contoso" /grant "NT SERVICE\ContosoUpdateSvc:(OI)(CI)M"

含义是:

  • NT SERVICE\ContosoUpdateSvc:服务身份;
  • (OI)(CI):继承到文件和子文件夹;
  • M:Modify 修改权限。

这样授权后,就可以实现:

ContosoUpdateSvc 可以访问 其他同账户服务不能随便访问 普通 Users 也不能随便访问

这就是服务隔离真正落地的地方。

Service SID + ACL,才是服务隔离真正发挥作用的组合。


6. Service SID 在服务启动时是如何进入 Token 的?

Windows 服务启动时,SCM 不只是简单调用CreateProcess
它还会围绕服务账户、Token、Service SID、权限、profile 等信息构造一个完整运行上下文。

Service SID 参与的大致流程如下:

SCM 准备启动服务

读取服务配置

确定服务账户

创建服务进程 Token

将 Service SID 注入 Token

服务进程启动

访问资源时参与 ACL 检查

其中关键点是:

Service SID 必须进入服务进程的访问令牌,后续访问资源时才可能被 ACL 识别。

访问资源时,Windows 的安全检查会综合判断:

  • 用户 SID;
  • 组 SID;
  • Service SID;
  • 权限;
  • Restricted SID;
  • 资源 ACL;
  • 访问类型。

所以 Service SID 并不是一个“显示名称”,而是实实在在参与安全访问检查的身份元素。


7. 如何查看一个服务的 Service SID?

在 Windows 中,可以使用sc showsid查看服务对应的 SID。

例如查看CryptSvc

sc showsid CryptSvc

可能会看到类似结果:

名称: CryptSvc 服务 SID: S-1-5-80-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx 状态: 已启用

也可以查看某个服务的 SID 类型:

sc qsidtype CryptSvc

常见 SID 类型包括:

SID 类型含义
NONE不使用服务 SID
UNRESTRICTED将 Service SID 加入服务 Token,可用于 ACL 授权
RESTRICTED以更受限制方式参与访问检查,隔离更强

如果需要配置服务 SID 类型,可以使用:

sc sidtype <服务名> unrestricted

例如:

sc sidtype ContosoUpdateSvc unrestricted

如果希望更强隔离,可以考虑:

sc sidtype ContosoUpdateSvc restricted

但需要注意:

修改服务 SID 类型可能影响服务访问资源,生产环境必须先测试验证。


8. Unrestricted 和 Restricted 有什么区别?

Service SID 不是只有“有或没有”。
它还涉及不同启用模式。

8.1 Unrestricted:服务 SID 进入 Token,用于正常 ACL 授权

UNRESTRICTED可以理解为:

把 Service SID 加入服务进程 Token,使资源 ACL 可以识别这个服务。

这种模式常用于:

  • 给某个服务单独授权目录;
  • 给某个服务单独授权注册表项;
  • 给某个服务单独授权命名管道;
  • 让日志和安全审计更容易区分服务来源。

它适合大多数服务隔离场景。

8.2 Restricted:进一步限制服务访问边界

RESTRICTED更严格。
它不仅让服务拥有 Service SID,还会让访问检查更加受限制。

通俗理解就是:

服务访问资源时,除了要满足普通账户权限外,还要满足受限 SID 相关访问条件。

这可以减少服务越权访问资源的机会,但也更容易导致服务因为权限不足而异常。

所以企业桌面支持中要注意:

Restricted 更安全,但兼容性风险更高;Unrestricted 更常用,也更适合作为服务级 ACL 授权基础。


9. 从桌面支持视角,如何理解服务隔离?

对桌面支持工程师来说,服务隔离不是纯内核理论。
它和日常排障非常相关。

当一个服务访问资源失败时,不要只看:

这个服务是什么账户运行的?

还要继续看:

这个服务有没有 Service SID? 资源 ACL 有没有授权给这个 Service SID? 这个服务是否运行在共享 svchost 中? 当前 Token 里到底有哪些 SID 和权限?

9.1 一个推荐排查思路

可以按下面顺序排查:

确认服务名

确认运行账户

查看 Service SID

确认 SID Type

查看资源 ACL

检查实际 Token

定位访问失败原因

9.2 常用排查命令

查看服务配置

sc qc CryptSvc

查看服务 SID

sc showsid CryptSvc

查看服务 SID 类型

sc qsidtype CryptSvc

查看服务对应进程

Get-CimInstanceWin32_Service-Filter"Name='CryptSvc'"|Select-ObjectName,DisplayName,State,ProcessId,StartName

查看某个 svchost 托管哪些服务

tasklist /svc /fi "imagename eq svchost.exe"

查看目录 ACL

icacls "C:\ProgramData\Contoso"

给服务授权目录访问

icacls "C:\ProgramData\Contoso" /grant "NT SERVICE\ContosoUpdateSvc:(OI)(CI)M"

这些命令组合起来,可以帮助我们判断:

问题到底是服务账户权限不足、Service SID 未启用,还是资源 ACL 没有正确授权。


10. 服务隔离的核心流程

可以把服务隔离理解成 4 个步骤:

10.1 SCM 启动服务

SCM 根据服务配置启动服务进程,并确定服务运行账户。

10.2 生成服务身份

Windows 根据服务名称生成唯一的 Service SID。

10.3 注入 Service SID

SCM 将 Service SID 注入服务进程 Token 中。

10.4 按 ACL 访问资源

服务访问资源时,Windows 根据资源 ACL 判断是否允许访问。

整体逻辑如下:

允许

拒绝

SCM 启动服务

确定服务账户

生成或加载 Service SID

Service SID 注入 Token

服务访问资源

资源 ACL 是否允许该 Service SID

访问成功

访问被拒绝

这一套流程的最终效果是:

  • 减少攻击面
  • 实现更精细授权
  • 降低服务间越权访问风险
  • 提高系统安全性和稳定性

11. 服务隔离和虚拟服务账户有什么关系?

这两个概念很容易混在一起,但它们不是一回事。

概念重点例子
Service SID服务的唯一安全身份NT SERVICE\CryptSvc
虚拟服务账户服务运行账户的一种形式NT SERVICE\MyService
服务隔离使用服务身份限制资源访问ACL 授权给 Service SID

虚拟服务账户通常长得也像:

NT SERVICE\<ServiceName>

所以初学者容易觉得它和 Service SID 是完全同一个东西。

更准确地理解是:

虚拟服务账户解决“服务以什么账户运行”的问题,Service SID 解决“如何在访问控制中精确识别某个服务”的问题。

在很多场景下,它们可以配合使用,从而让服务拥有更清晰的身份边界。


12. 常见误区:服务隔离不是“绝对安全”,而是降低影响范围

12.1 误区一:服务有了 Service SID 就绝对安全

不对。

Service SID 只是提供服务级身份。
它能不能发挥作用,还取决于:

  • SID 是否启用;
  • Token 中是否包含该 SID;
  • 资源 ACL 是否正确授权;
  • 服务是否运行在共享进程中;
  • 是否存在过宽的账户权限。

12.2 误区二:服务隔离可以替代最小权限运行

不对。

服务隔离和最小权限运行是互补关系:

  • 最小权限运行:减少服务 Token 中不必要的权限;
  • 服务隔离:让服务拥有独立身份并参与 ACL 控制。

两者配合使用,效果更好。

12.3 误区三:只要服务运行在 LocalSystem 下,Service SID 就没意义

不对。

即使服务运行在LocalSystem下,Service SID 仍然可以用来做服务级资源授权。
例如只允许某个 LocalSystem 服务访问特定目录,而不是让所有 LocalSystem 服务都能访问。

12.4 误区四:共享 svchost 中的服务隔离效果和独立进程完全一样

不完全一样。

共享进程意味着多个服务共用一个进程 Token。
因此在高安全要求场景中,需要结合:

  • 服务是否拆分;
  • svchost 分组;
  • Service SID;
  • 权限并集;
  • 资源 ACL;

综合判断隔离效果。


13. 总结提升

如果让我用一句话总结《Windows Internals》10.2.10 服务隔离(Service isolation),我会这样说:

Service SID 让 Windows 服务不再只依赖运行账户进行粗粒度隔离,而是让每个服务都可以拥有属于自己的安全身份,并通过 ACL 对文件、注册表、命名管道等资源进行服务级精确授权。

这篇文章最值得记住的 8 个结论是:

  1. 仅靠服务账户隔离,粒度比较粗。
  2. 多个服务共享同一账户时,安全边界容易模糊。
  3. Service SID 为每个服务提供唯一安全身份。
  4. Service SID 可以进入服务进程 Token。
  5. 资源 ACL 可以直接授权给NT SERVICE\<ServiceName>
  6. 服务隔离可以减少服务间越权访问。
  7. 桌面支持排障时要同时看账户、Service SID、Token 和资源 ACL。
  8. Service SID、最小权限运行、虚拟服务账户、svchost 拆分应结合理解。

我觉得这一节真正给我的启发是:

服务账户决定服务运行在哪个身份基础上,Service SID 决定系统能不能把某个服务单独识别并精确授权。

这也是从“会看服务”走向“理解 Windows 服务安全模型”的关键一步。


下一篇预告

下一篇可以继续写:

《Windows Internals》10.2.11 虚拟服务账户(The virtual service account):为什么NT SERVICE\<ServiceName>既不是普通本地用户,也不是域账户,却能成为服务专属运行身份?》

这一篇可以继续把:

  • 虚拟服务账户
  • NT SERVICE\<ServiceName>
  • 服务账户与 Service SID 的区别
  • 服务 profile
  • HKCU
  • 密码管理
  • 企业桌面支持排障价值

全部串起来。


🔝 返回顶部

点击回到顶部

http://www.jsqmd.com/news/705294/

相关文章:

  • 文墨共鸣大模型企业级部署架构:高可用与内网穿透访问方案
  • 封神!广州空调拆装靠谱公司TOP5,凭一个细节圈粉,告别安装隐患 - 广州搬家老班长
  • 2026年最新好用的客户关系管理系统推荐!6款热门客户关系管理系统盘点
  • GESP2023年6月认证C++三级( 第三部分编程题(1、春游))
  • 司拉德帕seladelpar治原发性胆汁性胆管炎每天吃一次还是分两次,出现肌痛时要不要减量?
  • 《Windows Internals》10.2.11 学习笔记:虚拟服务账户(The Virtual Service Account)——为什么 Windows 服务不再只依赖普通账号?
  • 成都短视频制作运营哪家好?本地优质服务商精准推荐 - 企业推荐师
  • 5分钟快速上手:崩坏星穹铁道自动化工具StarRailCopilot终极指南
  • 封神!广州靠谱废品/废旧金属回收TOP5,凭1个细节圈粉,回收后还帮你保洁场地 - 广州搬家老班长
  • C C++指针的优缺点,如何理解指针的灵活性
  • 2026年3月有实力洗涤机供应商口碑推荐分析,专业的洗涤机企业甄选实力品牌 - 品牌推荐师
  • 天赐范式第23天:深研AI算子化“精准高效多级流水线”工艺,打造MOF引擎叩门化学界!
  • Dockerfile系列(二) 镜像分层与缓存-为什么你的构建这么慢
  • GESP2023年6月认证C++三级( 第三部分编程题(2、密码合规检测))
  • 从TTL到免拆:详解海信IP108H盒子S905L2芯片三种刷机方式的原理与选择
  • APL:几近完美的编程语言,兼具法式韵味与独特魅力!
  • 《Windows Internals》10.2.12 学习笔记:交互式服务与 Session 0 隔离——为什么现代 Windows 服务不能再直接弹窗到桌面?
  • RimSort:RimWorld模组管理的智能管家,告别模组冲突与加载混乱
  • 海口攻略新
  • Arcana:Elixir原生嵌入式RAG库,一体化智能检索与生成方案
  • 从AI智能体到PPT自动化:TrainPPTAgent项目深度解析与实践指南
  • io_uring 凭什么比 epoll 快——从共享环形缓冲区到内核线程池,拆解零拷贝提交的3层设计
  • HSTracker:macOS炉石传说智能套牌追踪器完整指南
  • Dockerfile系列(三) 多阶段构建-告别镜像obesity
  • E-Hentai漫画下载器终极教程:5步轻松批量下载完整漫画合集
  • ARM处理器预取与分支预测技术解析
  • Onekey:一键自动化获取Steam Depot清单的终极解决方案
  • 3步解锁:让任天堂控制器在Windows上重获新生的终极兼容方案
  • 天赐范式第23天:数理化炼金术公式效验器技术确权报告——原数学毒丸公式效验器升级
  • 小型语言模型(SLM)实战:高效部署与成本优化指南