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

香港服务器运行 Windows Server 2019 时,如何通过组策略集中管理用户权限,避免跨团队运维带来的安全隐患

发布人:Minchunlin 发布时间:2025-08-22 09:09 阅读量:820


那是周三晚上,我们部署在香港葵涌机房的应用团队需要临时登录一台生产 Windows Server 2019 做日志定位,网络组和数据库组也要“顺便看一眼”。大家都说只要 10 分钟。

我看着那台 2U 的 R740xd,心里只有一个念头:“不能再靠口头约定、临时开权限了。” 那一晚我把三张便利贴贴在机柜门上:最小权限、可追溯、可回滚。第二天开始,我把这套“用组策略集中管控用户权限”的体系铺开。下面是完整的过程、细节与坑位,全是我在香港机房里亲手踩过的点。

一、现场环境与目标

1)硬件与虚拟化

配置
机型 Dell PowerEdge R740xd(生产)/ HPE DL360 Gen10(域控)
CPU 2× Intel Xeon Silver 4214R
内存 192 GB DDR4
存储 4× 1.92TB NVMe(RAID10,系统与日志)+ 8× 2TB SAS(RAID10,数据)
网卡 2×10GbE(生产)、2×1GbE(管理)
虚拟化 VMware ESXi 7.0U3,vCenter 管理

2)系统与域

版本/说明
OS Windows Server 2019 Datacenter(build 17763)
目录服务 AD DS,林/域功能级别 2016(为兼容旧成员服务器)
域名 corp.example.hk
域控 2 台(HK-DC01/HK-DC02,FSMO 分散)
站点 HK(与 SZ/CN 有跨境只读站点 RODC,复制时段限流)

3)网络与分区

VLAN 用途 备注
VLAN10 管理网 仅跳板机与域控可入
VLAN20 服务器生产网 应用、数据库
VLAN99 隔离与临时接入 临时维护落地网

4)明确目标(把“便利贴”落地)

  • 最小权限:谁需要什么就给到那个动作所需的最小权限(JEA + 组策略 + 角色组)。
  • 集中管控:所有“本地管理员/RDP 登录/服务登录”等权限,只通过 GPO 发放。
  • 分层安全(Tiering):Tier0(域控/PKI)、Tier1(服务器)、Tier2(工作站)。
  • 可追溯:审计落地(WEF + 事件 ID 基线),任何组变更、远程登录有据可查。
  • 可回滚:GPO 版本化与备份,策略试运行与明确回退方案。

二、权限模型与命名规范(打地基)

1)OU 结构(只列与本文相关)

corp.example.hk
└── HK
    ├── Tier0
    │   └── Domain Controllers
    ├── Tier1
    │   ├── Servers-Prod
    │   └── Servers-NonProd
    └── Tier2
        └── Workstations

2)安全组命名(统一到位)

组名 说明 例子
SG-LocalAdmins-<Scope> 下发到目标主机“本地 Administrators”的成员 SG-LocalAdmins-APP
SG-RDP-Users-<Scope> 允许通过 RDP 登录 SG-RDP-Users-APP
SG-OPS-<Team>-<Role> 运维团队角色组(再被加入上面两类“资源组”) SG-OPS-DBA-ReadLogs
SG-JEA-<Endpoint>-Operators 指定某个 JEA 端点的操作员 SG-JEA-IIS-Operators

核心思想:人进角色组,角色组再进资源组,GPO 只认“资源组”,人事变动只动前端角色组。

三、组策略实操(逐条落地)

说明:所有策略统一前缀 HK-<Tier>-<Purpose>,创建于 GPMC(组策略管理控制台),并严格链接到相应 OU。策略发布前在 Servers-NonProd 试运行 24 小时。

GPO-A:集中控制“本地 Administrators”成员(最小权限第一步)

名称:HK-Tier1-LocalAdmins-Control

链接:HK/Tier1/Servers-*

做法优先级:组策略首选项(GPP)→ 本地用户和组(避免 Restricted Groups 的“全替换”带来的坑)

配置:

计算机配置 → 首选项 → 控制面板设置 → 本地用户和组

新建 本地组:

  • 操作:更新(Update)
  • 组:Administrators(内置)
  • 成员:添加 SG-LocalAdmins-APP(只放资源组)
  • 不勾选“用此成员列表替换现有成员”(防止误清空 Builtin 成员)

补充:单独创建 GPO-A-DC 给域控 OU,不要给 DC 的本地 Administrators 下发业务组(Tiering 原则)。

为什么不用 Restricted Groups?

Restricted Groups 的“Members of this group”是强制替换,容易把 Domain Admins 等内置成员踢掉;而 GPP 的“更新”模式更温和、可增量。

GPO-B:RDP 登录与交互式登录权限(把门管好)

名称:HK-Tier1-LogonRights

链接:HK/Tier1/Servers-*

配置路径:计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权限分配

  • 允许通过远程桌面服务登录(SeRemoteInteractiveLogonRight):仅 SG-RDP-Users-APP、Domain Admins(必要时)
  • 拒绝通过远程桌面服务登录:Domain Users(强制默认拒绝)
  • 拒绝本地登录:Domain Users(服务器不允许普通用户交互登录)
  • 作为服务登录(SeServiceLogonRight):仅给 服务账号组(如 SV-SQL-Services)

安全选项(同一 GPO):

  • 网络访问:本地账户的共享和安全模型 → 仅来宾(拒绝),确保使用域身份
  • 远程桌面:要求使用网络级别身份验证 (NLA) → 启用
  • 会话限制:断开会话前的活动会话时间限制(如 60 分钟)

GPO-C:部署 LAPS(本地管理员口令自动轮换)

建议:Windows Server 2019 上使用 经典 LAPS (AdmPwd) 稳定成熟;如果你已全面升到 Win10/11 & Server 2022,可评估 Windows LAPS。

名称:HK-Tier1-LAPS

准备:

在管理机安装 LAPS(LAPS.x64.msi),导入 ADMX。

扩展架构(在 Schema Master 上,PowerShell):

Import-Module AdmPwd.PS
Update-AdmPwdADSchema

授权 OU 写回自身密码属性:

Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Servers-Prod,OU=Tier1,OU=HK,DC=corp,DC=example,DC=hk"

授权读取权限给运维只读组:

Set-AdmPwdReadPasswordPermission -OrgUnit "OU=Servers-Prod,OU=Tier1,OU=HK,DC=corp,DC=example,DC=hk" -AllowedPrincipals "SG-OPS-Tier1-Readers"

GPO 配置:计算机配置 → 策略 → 管理模板 → LAPS

  • 启用本地管理员密码管理:启用
  • 密码复杂度:大写/小写/数字/特殊字符
  • 密码长度:20
  • 密码年龄(天):30
  • 名称:使用内置 Administrator(或自定义 LocalAdmin)

落地要点:LAPS UI 读取密码需要对象读取权限;权限错了就会“看不见密码”,不是没回写。

GPO-D:高级审计策略与日志转发(WEF)

名称:HK-Tier1-Audit-Base

链接:Servers-*

高级审计:计算机配置 → 策略 → Windows 设置 → 安全设置 → 高级审核策略配置

账户登录/登录注销/对象访问/策略变更/特权使用 → 成功+失败(按需)

事件订阅:配置 Windows 事件转发到收集器(WEF),筛选关键事件:

  • 4624/4625(登录/失败)
  • 4728/4729(组成员添加/移除)
  • 4732/4733(本地组成员变更)
  • 4672(特殊权限分配登录)

结果:谁何时通过哪个组获得了本地管理员或 RDP 权限,一查即明。

GPO-E:应用白名单(AppLocker 基线)

名称:HK-Tier1-AppLocker-Base

链接:Servers-*(先 NonProd 观察)

策略:

  • 可执行文件:允许 %SystemRoot%\*,%ProgramFiles%\*;对不在白名单路径或未签名程序默认拒绝。
  • 脚本:仅允许运维签名脚本与指定目录。
  • 提示:先 审核模式 运行一周,观察 8003/8004 事件,再切换强制。
  • GPO-F:UAC & 安全选项(补齐细节)

提升时提示凭据、限制本地账户使用空密码、禁用匿名 SID/名称转换等;这些都是“缝隙位”的补丁,建议合并在一个“Base Security” GPO。

四、JEA(Just Enough Administration):把“能做什么”从“能登录谁”里剥离

场景:应用团队只需要 查看 IIS 日志、重启站点,不该拿到本地管理员。

1)创建角色能力(Role Capability)

在文件服务器或共享配置库:

New-Item -ItemType Directory -Path "C:\Program Files\WindowsPowerShell\Modules\IISJEA\RoleCapabilities" -Force | Out-Null

@"
VisibleCmdlets = @{
    Name = 'Get-Service'; Parameters = @{ Name = 'Name'; ValidateSet = @('W3SVC','WAS') }
},
@{ Name = 'Restart-WebAppPool'; Parameters = @{ Name = 'Name'; ValidateSet = @('DefaultAppPool','APP1') } },
@{ Name = 'Get-ChildItem'; Parameters = @{ Name = 'Path'; ValidatePattern = 'C:\\inetpub\\logs\\LogFiles\\.*' } }
VisibleExternalCommands = @()
ModulesToImport = @('WebAdministration')
"@ | Out-File "C:\Program Files\WindowsPowerShell\Modules\IISJEA\RoleCapabilities\IISOperators.psrc" -Encoding UTF8

2)创建会话配置(Session Configuration)

@"
SessionType = 'RestrictedRemoteServer'
RunAsVirtualAccount = $true
RoleDefinitions = @{
    'corp\SG-JEA-IIS-Operators' = @{ RoleCapabilities = @('IISOperators') }
}
"@ | Out-File "C:\Program Files\WindowsPowerShell\Modules\IISJEA\IIS-Endpoint.pssc" -Encoding UTF8

Register-PSSessionConfiguration -Name 'IIS-JEA' -Path "C:\Program Files\WindowsPowerShell\Modules\IISJEA\IIS-Endpoint.pssc" -Force

3)通过 GPO 下发

GPO 名称:HK-Tier1-JEA-ClientAccess

配置 WinRM、受信任主机/约束委派(按需)、防火墙端口。

将 SG-JEA-IIS-Operators 分配给相关主机(还是用 资源组 套娃)。

使用方式(应用团队):

Enter-PSSession -ComputerName APP-SRV01 -ConfigurationName IIS-JEA -Credential corp\user.alice

只能执行定义过的命令与参数,不需要 RDP,更不需要本地管理员。

五、自动化:从建组到下发 GPO 的一条龙脚本

在 GPMC 服务器或跳板机(RSAT 已装)执行。

# 0. 变量
$Domain = "corp.example.hk"
$OU_Tier1_Prod = "OU=Servers-Prod,OU=Tier1,OU=HK,DC=corp,DC=example,DC=hk"

# 1. 创建安全组(角色组与资源组)
New-ADGroup -Name "SG-OPS-APP-Operators" -GroupScope Global -GroupCategory Security -Path "OU=Groups,OU=HK,DC=corp,DC=example,DC=hk"
New-ADGroup -Name "SG-LocalAdmins-APP"    -GroupScope Global -GroupCategory Security -Path "OU=Groups,OU=HK,DC=corp,DC=example,DC=hk"
New-ADGroup -Name "SG-RDP-Users-APP"      -GroupScope Global -GroupCategory Security -Path "OU=Groups,OU=HK,DC=corp,DC=example,DC=hk"

# 2. 套娃关系(人进角色组,角色组进资源组)
Add-ADGroupMember -Identity "SG-LocalAdmins-APP" -Members "SG-OPS-APP-Operators"
Add-ADGroupMember -Identity "SG-RDP-Users-APP"   -Members "SG-OPS-APP-Operators"

# 3. 创建 GPO 并链接
$gpoA = New-GPO -Name "HK-Tier1-LocalAdmins-Control"
New-GPLink -Guid $gpoA.Id -Target "LDAP://$OU_Tier1_Prod"

$gpoB = New-GPO -Name "HK-Tier1-LogonRights"
New-GPLink -Guid $gpoB.Id -Target "LDAP://$OU_Tier1_Prod"

# 4. 在 GPO-A 中添加 GPP 本地 Administrators 成员(使用 XML 片段)
# 说明:GPP 本地用户组的首选项项本质是存储在 GPO 的 SYSVOL XML,PowerShell可通过替换XML模板实现批量化
$sysvolPath = "\\$Domain\SYSVOL\$Domain\Policies\{$($gpoA.Id)}\Machine\Preferences\Groups"
New-Item -Path $sysvolPath -ItemType Directory -Force | Out-Null

$gppXml = @"
<Groups clsid="{6C6DD8E9-83B6-4f06-A18B-33BFC7DE1B31}">
  <Group clsid="{6C6DD8E9-83B6-4f06-A18B-33BFC7DE1B31}" name="Administrators (built-in)" image="2">
    <Properties action="U" groupSid="S-1-5-32-544" newName="" description="" deleteAllUsers="0" deleteAllGroups="0" />
    <Members>
      <Member name="corp\SG-LocalAdmins-APP" action="ADD" />
    </Members>
  </Group>
</Groups>
"@
$gppXml | Out-File "$sysvolPath\Groups.xml" -Encoding UTF8

# 5. 在 GPO-B 中设置用户权限分配(注册表方式示例:SeRemoteInteractiveLogonRight)
Set-GPRegistryValue -Name "HK-Tier1-LogonRights" -Key "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" -ValueName "SpecialGroups" -Type String -Value "S-1-5-32-555"  # 示例;实际用户权限建议使用安全模板或LGPO导入

# 6. 备份 GPO(可用于回滚)
Backup-GPO -All -Path "D:\GPOBackups\$(Get-Date -Format yyyyMMdd)"

注:用户权限分配(Se* 权限)用 PowerShell 直接改注册表不是最佳实践,建议在一台“黄金服务器”用 secpol.msc 配好 → 用 LGPO.exe 导出为安全模板 → 通过 GPO(安全设置→安全策略)导入并分发,或用 AGPM 管控版本。

六、部署中的坑与现场解法(真坑真解)

坑位 现象 原因 现场处理
Restricted Groups “替换” 生产服务器内置管理员成员被清空,应用启动失败 选了“Members of this group”导致强替换 改用 GPP 本地组-更新;紧急用控制台接入把内置成员补回
LAPS 密码回写失败 LAPS UI 看不到密码 计算机对象无写权限或收集周期未到 Set-AdmPwdComputerSelfPermission 修 OU;gpupdate /force 后看事件 4732/4733、LAPS 事件
RDP 失联 某组测试时全员被拒登录 “拒绝通过 RDP 登录”把 Domain Users 拒绝+未把运维组加入允许 跳板机本地控制台修策略;在测试 OU 用安全筛选仅对目标服务器下发
AppLocker 误拦截 应用服务启动不了 忽略了供应商自带路径或未签名组件 先审计模式收集事件 → 加白名单路径/发布者签名后再强制
复制延迟 非工作时段才同步策略,策略生效慢 跨站点复制计划限流 临时提升复制权重,或在 HK 站点内完成策略验证
WMI 筛选卡顿 gpresult 缓慢 复杂 WMI 过滤器 简化过滤条件,仅用 OS 版本 & SKU

七、验证与巡检(按表核对,按命令落锤)

1)核对表(抽样 3 台)

期望 SRV-APP01 SRV-DB01 SRV-IIS01
本地 Administrators 成员 内置 + SG-LocalAdmins-APP
RDP 登录权限 SG-RDP-Users-APP
LAPS 密码年龄 ≤30 天 12 天 5 天 28 天
AppLocker 模式 强制
审计事件上报 4624/4728 正常

2)命令与报告

# 查看生效结果
gpresult /r /scope computer
gpresult /h C:\temp\Result.html

# 快速检查本地管理员成员(PowerShell Remoting)
Invoke-Command -ComputerName SRV-APP01,SRV-DB01 -ScriptBlock {
  net localgroup administrators
}

# 检查 LAPS 属性
Get-ADComputer SRV-APP01 -Properties 'ms-Mcs-AdmPwdExpirationTime','ms-Mcs-AdmPwd' | fl *

# 订阅关键事件(本机)
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4728,4732,4624,4672} -MaxEvents 20

八、回滚与变更治理

GPO 备份与版本化:每日 Backup-GPO,重大变更前手动备份;如有 AGPM,走“Check-in/审批/部署”流程。

最小范围试点:先链接到 Servers-NonProd;通过 安全筛选 仅作用于测试主机。

紧急回退:

  • 在 GPMC 禁用 GPO 链接(非删除);
  • gpupdate /target:computer /force;
  • 必要时从备份 Restore-GPO;
  • 复盘:记录造成影响的设置项与资产范围。

九、为什么这套玩法能“顶住跨团队运维压力”

  • 权限与动作解绑:JEA 让“能干什么”变成细粒度命令白名单,而不是“给你管理员你随便玩”。
  • 入口可控:RDP 权限、交互式登录与 NLA 绑定到组,跳板机做强制入口。
  • 口令不落地:LAPS 杜绝“本地管理员口令共享”,事故面极大收敛。
  • 变更可追溯:组成员变化与登录事件统一回传,审计闭环。
  • 回滚可执行:GPO 版本化+分 OU 测试,出问题可在分钟级撤回。

十、从临时救火到制度化的转变

两周后,应用团队又一次来“临时要权限”。这次我没有让他们排队等 RDP,而是让他们用 Enter-PSSession -ConfigurationName IIS-JEA 进入指定端点,重启了一个应用池,拿到日志,并把事件号发我。我在 WEF 上看着 4732、4624、4672 一路串起的轨迹,像看一部流程严谨的纪录片。

机房外还是海风,但机柜上那三张便利贴我只留下了两张,把“可回滚”收进了标准流程里。“最小权限、可追溯” 现在不再是口号了,而是所有跨团队协作时默认被执行的规矩。
有人问我:“这套组策略很复杂,值吗?”

我笑了笑:“只有在凌晨三点没人背锅的时候,你才会知道,它有多值。”

附:关键策略清单(便于你直接对照落地)

类别 路径/设置 建议值
本地组成员 GPP → 本地用户和组 → Administrators 操作=更新,成员仅资源组
用户权限分配 允许通过 RDP 登录 仅资源组
用户权限分配 拒绝通过 RDP 登录 Domain Users
用户权限分配 拒绝本地登录 Domain Users
LAPS 启用/长度/复杂度/年龄 启用/20/复杂/30 天
RDP 安全 要求 NLA 启用
审计 高级审计策略 登录、对象访问、策略变更等成功+失败
AppLocker 可执行/脚本 先审计后强制,白名单路径+签名
UAC 提示级别 管理员批准模式,提示凭据

如果你也在香港机房、也在为跨团队运维的权限边界而焦虑,从 GPO-A(本地管理员集中管控)与 GPO-B(登录权边界)开始,一步一步把“临时加权限”变成“按角色授权”,把“信任人”变成“信任系统”。

目录结构
全文