上一篇 下一篇 分享链接 返回 返回顶部

如何在香港服务器运行 Windows Server 时,启用基于角色的访问控制(RBAC),降低越权风险?

发布人:Minchunlin 发布时间:2025-08-30 08:46 阅读量:728


那晚我在香港葵涌机房值班,Nagios + WEF(Windows Event Forwarding)推来一条高优先级:一名外包账号在文件服务器 HK-FS01 上尝试读取“薪酬”共享。账号属于“桌面支持”,按理只该重置密码与重启服务。好消息是 ACL 拦住了;坏消息是我意识到我们的权限边界设计并不系统——一些临时加权还在,JEA 只部署在少数主机上,WAC(Windows Admin Center)的网关权限也没有做到“最小集”。第二天,我立下一个目标:用 RBAC 把权限收紧到“只够用,不好用”的程度,并让一线同事“该做的能做,做不了的有申请,有审计”。

1. 现场环境与目标

1.1 机房与硬件(部分关键参数)

设备/角色 型号/规格 关键参数
文件/应用服务器(若干台) Dell PowerEdge R650xs Xeon Gold 6330×2、内存 256GB、NVMe U.2 1.92TB×4(RAID10)、Broadcom 10GbE SFP+ ×2、iDRAC9
域控制器(双活) HPE DL360 Gen10 Xeon Silver、内存 64GB、SAS 600GB×2(RAID1)
核心交换 Arista 7050 系列 上行 40G,下联 10G
管理网段 10.20.0.0/24 仅堡垒机、WAC 网关、域控、跳板可达
业务网段 10.21.0.0/22 应用/文件/数据库
OOB 独立带外 仅 iDRAC/iLO,不走生产网

1.2 操作系统与管理组件

  • Windows Server 2019/2022 Datacenter(混部)
  • Active Directory(林/域:corp.example.com)
  • Windows Admin Center(WAC)网关(Server 2022,上 443)
  • PowerShell 5.1 + 部分主机 PowerShell 7(管理端)
  • WEF(订阅安全与目录相关审计)
  • LAPS(Windows LAPS,管理本地管理员密码)

1.3 RBAC 目标(对齐“最小权限 + 可审计 + 易运营”)

  • 角色清晰:按“岗位/任务”授予权限,而不是“给你管理员你自己看着办”。
  • 多层防护:WAC 网关 RBAC + AD 组 + NTFS/Share ACL + JEA(Just Enough Administration)组合拳。
  • 短时提权:非常规操作走 JIT(Just-In-Time)工作流,峰终留痕。
  • 可观测:关键事件统一写入 WEF,再进 SIEM 做关联。

2. 设计总图(从“谁做什么”开始)

我先画了张“角色—对象—动作—工具—审计”的映射表,供审批与后续实施参照:

角色 目标主机/资源 允许动作 实现/入口 审计点
Helpdesk(桌面支持) 所有服务器 重启指定服务、读事件日志、重置用户密码(仅 OU=Workstations) JEA 会话 JEA_ServerMaintenance(WAC/PS Remoting) 4688/4769/5145、PowerShell transcript、WEC
AppOps(应用运维) 应用服务器 OU 部署应用、管理 App 服务/目录 JEA(App 角色)、NTFS ACL(部署目录) 4663(对象访问)、PowerShell transcript
SecOps(安全) 全域 查看安全日志、拉取配置、执行只读扫描 WAC(Readers 工具集)、只读 JEA 端点 WAC 网关审计、WEF
StorageAdmin(存储) 文件/DFS 服务器 配置共享/NTFS、管理配额 WAC + JEA(Storage 角色) 5140/5145、WMI 操作审计
EmergencyAdmin(应急) 指定范围 临时本地管理员(JIT 1-4 小时) PIM 流程/变更审批脚本 4670/4732 等

3. 域与本地:从“身份”和“边界”下手

3.1 基础 OU 与 AD 组(PowerShell 实操)

建议在管理工作站用 RSAT 或 PowerShell 远程执行,避免在生产服务器上直接操刀。

# 1) 创建基础 OU
New-ADOrganizationalUnit -Name "Servers" -Path "DC=corp,DC=example,DC=com"
New-ADOrganizationalUnit -Name "Groups"  -Path "DC=corp,DC=example,DC=com"
New-ADOrganizationalUnit -Name "Workstations" -Path "DC=corp,DC=example,DC=com"

# 2) 创建角色组(全局组,授权对象是资源)
$groups = @(
  "RBAC-Helpdesk-Servers",
  "RBAC-AppOps-Servers",
  "RBAC-SecOps-Readers",
  "RBAC-Storage-Admins",
  "RBAC-Emergency-Admins"
)
$groups | ForEach-Object {
  New-ADGroup -Name $_ -GroupScope Global -Path "OU=Groups,DC=corp,DC=example,DC=com" -Verbose
}

规范:永远把权限授予“角色组”而不是“个人账号”。成员变动只改组,审计也清晰。

3.2 本地管理员与 LAPS

通过 GPO(首选项) 管控各服务器的本地 Administrators 组,仅允许最小集合角色组加入。

Windows LAPS 管理本地管理员密码,禁用共享密码和口口相传。

GPO 大纲:

1)计算机配置 → 首选项 → 本地用户和组:替换 Administrators 成员为 RBAC-Emergency-Admins(再追加域控维护组等最小集合)。
2)计算机配置 → 管理模板 → Windows 组件 → Windows LAPS:启用密码备份到 AD、轮换周期、密码复杂度。

4. WAC(Windows Admin Center)网关的 RBAC

我让所有日常 GUI 管理走 WAC 网关(Server 2022 一台),只开 443,对接域登录。WAC 自带基于网关本机本地组的 RBAC(配合各工具的精细授权),并可联动目标机 JEA。

4.1 部署与证书(静默安装)

# 在 WAC 网关主机上(本地或通过远程会话)
msiexec /i WindowsAdminCenter.msi /qn SME_PORT=443 SSL_CERTIFICATE_OPTION=generate
# 或者提供已有证书:SSL_CERTIFICATE_OPTION=installed

4.2 WAC 访问控制策略

网关层级:把 RBAC-SecOps-Readers 放到 Windows Admin Center Readers,让安全团队只有只读。

工具级别(例如“服务”、“事件日志”、“文件共享”):启用 Granular access,将 RBAC-Helpdesk-Servers 仅授予“服务重启/事件查看”等工具。

目标节点:对服务器启用 JEA 集成模式(见下一章),避免网关绕过最小化命令集。

现场坑 1:刚装完 WAC,港区机房的上游防火墙没有及时放行 443 到堡垒区,导致同事以为“网关崩了”。解决:与网络侧协同,显式白名单“管理网段 ↔ WAC ↔ 目标网段”的 TCP/443/5985/5986 组合(WAC 网关到目标主机仍需 WinRM)。

5. JEA(Just Enough Administration):把“能做什么”精确到命令

JEA 是 Windows 实现 RBAC 的核心武器。它不只控制“能连接”,更精确到“能执行哪些 cmdlet/程序、参数白名单”。下面是我为 Helpdesk 做的标准示例。

5.1 角色能力(Role Capability)文件

目录结构建议放模块形式,易版本化与分发:

C:\Program Files\WindowsPowerShell\Modules\Company.JEA\
  ├─ RoleCapabilities\
  │    └─ Helpdesk.psrc
  └─ Company.JEA.psd1

生成与编辑:

# 创建 Role Capability 文件
$rcPath = "C:\Program Files\WindowsPowerShell\Modules\Company.JEA\RoleCapabilities\Helpdesk.psrc"
New-PSRoleCapabilityFile -Path $rcPath -Author "OpsTeam" -CompanyName "Example Corp" -Description "Helpdesk minimum commands"

# 编辑:只暴露重启/查询服务、查看事件、重置密码(限定 OU),禁止外部任意程序
(code $rcPath)  # 打开编辑器,示例内容如下

Helpdesk.psrc 示例(关键片段):

@{
  VisibleCmdlets = @(
    @{ Name = 'Get-Service' },
    @{ Name = 'Restart-Service'; Parameters = @{ Name = 'Name' } }, # 仅允许按名称
    @{ Name = 'Get-EventLog'; Parameters = @{ Name = 'LogName'; ValidateSet = 'System','Application' } },
    @{ Name = 'Get-WinEvent' },  # 只读
    @{ Name = 'Get-ADUser' },
    @{ Name = 'Set-ADAccountPassword'; Parameters = @{ Name = 'Identity' } } # 仅当委派到 Workstations OU 生效(后续 GPO/委派限制)
  )
  VisibleExternalCommands = @()  # 禁止调用外部 exe
  ScriptsToProcess = @()
  AliasDefinitions = @()
  FunctionDefinitions = @()
  ModulesToImport = @('ActiveDirectory')
}

5.2 会话配置(Session Configuration)文件

# 仅在需要的服务器上部署(或用 DSC/Ansible 批量)
$pssc = "C:\ProgramData\JEA\ServerMaintenance.pssc"
New-PSSessionConfigurationFile `
  -Path $pssc `
  -SessionType RestrictedRemoteServer `
  -TranscriptDirectory "C:\JEA-Transcripts" `
  -RunAsVirtualAccount `
  -RoleDefinitions @{
     "CORP\RBAC-Helpdesk-Servers" = @{ RoleCapabilities = 'Helpdesk' }
   }

Register-PSSessionConfiguration -Name 'JEA_ServerMaintenance' -Path $pssc -Force
Restart-Service WinRM

现场坑 2:虚拟账户访问网络共享失败。-RunAsVirtualAccount 默认只具备本机权限,访问远端 SMB 会被拒。解决:把需要操作的动作尽量限定在本机;若确需跨机资源,改用 CredSSP 或设计“任务代理”(如本机计划任务由 JEA 触发)。安全上优先避免跨主机写操作。

5.3 验证与体验

# 管理端验证可见命令
Get-PSSessionCapability -ConfigurationName JEA_ServerMaintenance -Username "CORP\someHelpdeskUser"

# 实测登录(Helpdesk 用户身份)
Enter-PSSession -ComputerName HK-FS01 -ConfigurationName JEA_ServerMaintenance -Credential CORP\someHelpdeskUser

# 可执行:
Get-Service
Restart-Service -Name "Spooler"
Get-EventLog -LogName System

# 不可执行(应报权限/命令不可用):
Get-LocalUser
icacls C:\Windows

现场坑 3:服务名限制。初期我们没有对 Restart-Service 加参数约束,结果有人误重启了业务自定义服务。解决:把 Helpdesk.psrc 改为函数包装 + 白名单(例如仅允许 Spooler, LanmanWorkstation);或在可见命令上做 ValidateSet 约束。

6. 文件共享与 NTFS:用“资源组”做 RBAC 的地基

对于文件服务器,真正的 RBAC 落点是 NTFS + 共享权限。我的做法是以 AD 组为中介,避免直接给个人账号赋权。

6.1 目录与权限模板

# 以财务共享为例
$path = "D:\Shares\Finance"
New-Item -ItemType Directory -Path $path -Force | Out-Null

# 继承清理 + 授权(读/写分离)
icacls $path /inheritance:r
icacls $path /grant "CORP\RBAC-Finance-Readers:(OI)(CI)R"
icacls $path /grant "CORP\RBAC-Finance-Contrib:(OI)(CI)M"
icacls $path /grant "CORP\RBAC-Storage-Admins:(OI)(CI)F"

共享层(New-SmbShare)只给 Change/Read,不要在共享层给 Full,Full 放在 NTFS:

New-SmbShare -Name "Finance" -Path $path -ChangeAccess "CORP\RBAC-Finance-Contrib" -ReadAccess "CORP\RBAC-Finance-Readers"

6.2 审计与告警(对象访问)

# 启用高级审计策略
auditpol /set /category:"Object Access" /subcategory:"File Share" /success:enable /failure:enable
auditpol /set /category:"Object Access" /subcategory:"File System" /success:enable /failure:enable

# 目录上开启“审核”(SACL)
$acl = Get-Acl $path
$sidReaders = (New-Object System.Security.Principal.NTAccount("CORP","RBAC-Finance-Readers")).Translate([System.Security.Principal.SecurityIdentifier])
$fsRule = New-Object System.Security.AccessControl.FileSystemAuditRule($sidReaders, "ReadData", "ContainerInherit, ObjectInherit", "None", "Success")
$acl.AddAuditRule($fsRule)
Set-Acl $path $acl

7. GPO 与登录边界:三层分级与“谁可以在哪登录”

我采用经典 Tier 0/1/2:

  • Tier 0:域控、WAC 网关、PKI —— 只允许 RBAC-Emergency-Admins、目录/安全核心角色登录。
  • Tier 1:服务器 —— 允许 RBAC-AppOps-Servers、RBAC-Storage-Admins、RBAC-Helpdesk-Servers(结合 JEA)。
  • Tier 2:工作站 —— 普通用户 + 桌面支持。

关键 GPO 设置:

  • 计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权限分配:
  • 拒绝本地登录:对非本角色的域用户组。
  • 允许通过远程桌面登录:仅必要角色组。
  • 从网络访问此计算机:限定服务账号/部署账号。
  • 计算机配置 → 管理模板 → 系统 → 凭据委派:按需启用 CredSSP 并绑定目标主机(尽量少用)。

8. 审计统一收集:WEF(Windows 事件转发)+ Transcript

在域控上建 WEF 订阅,把目标源(服务器 OU)加入。

收集子类:Account Logon/Logon/Privilege Use, Security Group Management, Object Access, PowerShell(脚本块日志 + 转录)。

JEA 会话在 C:\JEA-Transcripts 写入转录文件,WEF 也可采集该目录(或用代理工具)。

现场坑 4:WEF 初期丢事件。原因:默认 HTTP 5985,跨子网拥塞/代理导致超时。解决:切到 HTTPS 5986,配发证书;同时提高订阅拉取批大小与重试间隔。

9. 一套可复制的“角色—命令—对象”对照表(落地模板)

角色组 目标 允许命令/动作 技术手段 备注
RBAC-Helpdesk-Servers 全部服务器 Get/Restart-Service(白名单),读 System/Application 日志 JEA Helpdesk.psrc + JEA_ServerMaintenance 禁外部 EXE;无跨机写
RBAC-AppOps-Servers 应用服务器 部署目录写入、管理 App Pool/服务 NTFS ACL + JEA App 角色 CI/CD 账号最小权限
RBAC-Storage-Admins 文件/DFS 管理共享/配额 WAC 工具授权 + 本机管理员 仅限存储域
RBAC-SecOps-Readers 全域 仅读日志/配置导出 WAC Readers + JEA 只读 不允许 RDP
RBAC-Emergency-Admins 指定服务器 临时本地管理员(JIT) 变更流程 + 定时脚本回收 加强审计

10. 自动化:批量把 JEA 和 ACL 推下去

我用一个简化的部署脚本,把 JEA 模块与会话配置同步到服务器 OU 下所有主机(也可用 DSC):

# 获取服务器列表(OU=Servers)
$servers = Get-ADComputer -SearchBase "OU=Servers,DC=corp,DC=example,DC=com" -Filter * | Select-Object -Expand Name

foreach ($s in $servers) {
  Write-Host "Deploying JEA to $s..."
  # 拷贝模块(用 SMB 或 PS Remoting)
  Invoke-Command -ComputerName $s -ScriptBlock {
    New-Item -ItemType Directory -Path "C:\Program Files\WindowsPowerShell\Modules\Company.JEA\RoleCapabilities" -Force | Out-Null
  }
  Copy-Item -Path "\\fileserver\OpsRepo\Company.JEA\*" -Destination "\\$s\C$\Program Files\WindowsPowerShell\Modules\Company.JEA\" -Recurse -Force

  # 注册会话配置
  Invoke-Command -ComputerName $s -ScriptBlock {
    $pssc = "C:\ProgramData\JEA\ServerMaintenance.pssc"
    New-Item -ItemType Directory -Path "C:\ProgramData\JEA" -Force | Out-Null
    New-PSSessionConfigurationFile -Path $pssc -SessionType RestrictedRemoteServer -TranscriptDirectory "C:\JEA-Transcripts" -RunAsVirtualAccount -RoleDefinitions @{ "CORP\RBAC-Helpdesk-Servers" = @{ RoleCapabilities = 'Helpdesk' } }
    Register-PSSessionConfiguration -Name 'JEA_ServerMaintenance' -Path $pssc -Force
    Restart-Service WinRM
  }
}

11. 验收标准与量化指标(我们是这样考核有效性的)

指标 上线前 上线后(4 周) 备注
拥有本地管理员权限的人数 37 9 LAPS + GPO 收敛
远程桌面到服务器的人数 26 6 WAC + JEA 替代
未经审批的“敏感文件”访问告警/周 3–5 0–1 ACL + 审计到位
JEA 转录留痕覆盖率 30% >95% 统一目录 + WEF
临时提权平均时长 不可度量 < 2h 工单自动回收

12. 我踩过的坑与现场解法(精炼清单)

WAC 工具权限与 JEA 不一致

现象:网关显示能点“服务重启”,但目标机报“访问被拒”。

根因:目标机未注册对应 JEA 端点或 Role Capability 未覆盖该命令。

解法:统一以 JEA 为准,WAC 仅作为入口;发布前用 Get-PSSessionCapability 逐条核验。

PowerShell 模块版本漂移

现象:某台服务器 AD 模块版本旧,Set-ADAccountPassword 行为不一致。

解法:把 Company.JEA 模块与依赖版本固化在 OpsRepo,随脚本分发,并在 JEA 会话里显式 ModulesToImport。

WEF 订阅吞吐不足

现象:峰值时延迟 > 10 分钟。

解法:上 HTTPS,增大 Delivery Optimization 参数,按 OU 拆分订阅;SIEM 侧做缓冲与去重。

跨机操作需求

现象:Helpdesk 想在 A 机上重置 B 机的服务账号密码。

解法:拒绝跨机写操作,推动流程化:提交工单 → 临时加入 RBAC-Emergency-Admins(JIT 2 小时)→ 回收。

LAPS 与第三方运维冲突

现象:外包商自带代理需要本地管理员。

解法:给代理服务单独本地组 + 服务特权,不加入 Administrators;必要时在 WAC 工具层精细授权。

13. 变更与回滚策略

蓝/绿思路:先在一台非关键服务器完成 JEA/WAC/GPO 的全链路验证;变更窗口推广 20%,观测 48 小时,再全域铺开。

回滚手段:预置 Disable-Jea.ps1(反注册会话配置、恢复 WinRM)、WAC 工具策略导出备份、GPO 版本快照。

文档化:每个 Role Capability 文件、会话配置、WAC 策略都进入 Git,PR 审核 + Tag。

14. 附:可直接复用的“最小可用”脚本包清单

  • Company.JEA 模块(含 Helpdesk.psrc、可按角色复制)
  • Deploy-JEA.ps1(批量注册)
  • Set-NTFS-ShareAcl.ps1(基于组的 ACL 模板化)
  • Enable-AuditBaseline.ps1(auditpol 与 PS 脚本块日志)
  • Configure-WEF-Subscription.xml(按 OU 的订阅样例)
  • WAC-Granular-Policy.md(可操作说明书)

15. 结尾:把“权力”变成“责任”的边界

一个月后,又是深夜值班,告警列表清清爽爽。Helpdesk 同事通过 WAC 一键重启了卡住的打印服务,JEA 转录里清楚记着他做了什么;SecOps 的伙伴在只读端点里把异常登录拉了全链路;而我,终于可以把“本地管理员”这张万能钥匙放回保险柜。

RBAC 不是一次部署,而是持续维护:新系统上线要补角色,新需求要过评审,脚本与策略要版本化。把权限从“方便”转向“可控”,从“信任个人”转向“信任系统”,这是我在香港机房这次实战里得到的最大收获。

如果你也准备动手,不妨照着上面的清单,在一台测试机上先跑起来。最小化上线,快速闭环,然后让证据(审计与数据)告诉你:越权风险,正在被逐步收敛。

目录结构
全文