wgerade/AD-Posture
GitHub: wgerade/AD-Posture
AD Posture 是一个本地 Active Directory 安全态势审计工具包,通过 PowerShell 模块对敏感组、权限分层、ACL、ADCS、信任关系等多维度进行只读扫描,生成累计风险评分与可视化修复仪表板。
Stars: 0 | Forks: 0
# AD Posture






AD Posture 是一个本地 Active Directory 安全态势与权限审计工具包,专注于敏感组、嵌套访问链、Tier 0/1/2 暴露情况、累计风险评分、仪表板、导出以及修复规划。
AD Posture 以 `ADPosture` PowerShell 模块的形式提供。公开的 v1 API 从一开始便使用了 AD Posture 命令名称。
AD Posture 通过生成本地安全态势证据和修复上下文,作为 Microsoft Defender for Identity (MDI)、SIEM、GRC 和 EDR 平台的补充。它不提供持续收集、实时检测、告警或认证的合规性评估。
## 核心亮点
- 针对内置、域、林、Exchange 以及可选组的敏感组审计。
- 完整的嵌套成员身份链解析。
- 基于 `config\TieringModel.json` 自动进行 Tier 0 / Tier 1 / Tier 2 分类。
- 从 0 到无上限的累计风险评分,其中 0 表示无需修复。
- 针对每项发现提供评分说明,包含计算公式、评分组成部分以及技术风险背景。
- 针对特权组暴露模式的 MITRE ATT&CK 技术映射。
- 针对 Tier 0 暴露、UAC 规范、陈旧身份、嵌套及过期审批的就绪度/记分卡视图。
- 对象风险视图,用于展示对象级别的风险概况、证据、关系及修复上下文。
- 将 gMSA/sMSA 识别为服务账户,而不是标记为 `Unknown`。
- 针对内置、已知及架构管理的主体进行原生 AD 身份处理。
- 记录已批准的基线例外情况,包含所有者、审批人、工单、原因及过期时间。
- 友好的 UAC 标签显示,例如 `Normal Account, Weak Kerberos (DES)`。
- 包含 Operations、Objects、Exceptions、Timeline 和 Executive 仪表板,提供针对不同角色的专属视图。
- 由生成的嵌入式报告包支持的静态本地仪表板。
- 针对 domain root、AdminSDHolder 以及被扫描敏感组的可选 ACL 态势评估,检查危险 ACE 和异常所有者。
- 可选的 ADCS 态势评估,涵盖高风险证书模板、已发布的 CA、CA 策略配置、广泛的注册权限、注册代理暴露、可导出的身份验证私钥、广泛的 template/CA/NTAuth 控制权限委托、Any Purpose/no-EKU 暴露以及 ESC 类攻击路径。
- 深色运营仪表板包含分层甜甜圈图、修复进度条、账户类型占比、最高组别暴露、修复影响、账户暴露情况以及可展开的访问路径详情。
- 支持 CSV/JSON 导出,并包含用于本地 HTML 查看的嵌入式仪表板数据。
- 包含 Pester 测试、PSScriptAnalyzer 配置和 GitHub Actions CI。
## 演示
使用合成的 `corp.example` 数据探索仪表板 —— 无需安装。
**[→ 启动交互式演示导览](https://wgerade.github.io/AD-Posture/dashboard/index.html)**
该导览使用经过脱敏处理的 AD 快照,引导您浏览 Operations、Objects、Auth/Kerberos、ACL、GPO、ADCS、Trusts、DNS、Executive、Exceptions 和 Timeline 视图。

## 截图
### 操作
Operations 是分析师的入口页面,包含行动计划、就绪度摘要、暴露评分以及优先修复队列。
详情:[仪表板](#dashboards)、[Operations 详解](docs/OPERATIONS-WALKTHROUGH.md)、[安全操作员流程](docs/OPERATIONS-WALKTHROUGH.md#safe-operator-flow)

### Objects
对象风险将身份、组、计算机、GPO、OU 和安全态势证据整合到对象级别的配置文件中,包含关系和修复上下文。
详情:[对象风险浏览器](#object-risk-explorer)、[对象风险文档](docs/OBJECT-RISK-EXPLORER.md)、[已交付的安全态势域](docs/ROADMAP.md#delivered-posture-domains)

### Auth / Kerberos
Kerberos/Auth 安全态势突出显示易受 Roast 攻击的主体、弱加密、委派暴露、RBCD 以及仍可被委派的特权账户。
详情:[仪表板](#dashboards)、[Kerberos/Auth 当前状态](docs/CURRENT_STATE.md#kerberosauth-posture-state)、[Kerberos/Auth 路线图](docs/ROADMAP.md#kerberosauth-posture)

### ACL 安全态势
ACL 安全态势审查敏感 AD 对象及可选扫描范围内的危险权限、异常所有者、有效受托人、继承、配置漂移及目标上下文。
详情:[仪表板](#dashboards)、[ACL 当前状态](docs/CURRENT_STATE.md#acl-posture-state)、[ACL 路线图](docs/ROADMAP.md#acl-posture)

### GPO 安全态势
GPO 安全态势将策略容器、链接、SYSVOL、脚本、首选项、筛选、环回、WMI 和委派控制证据关联至具备作用域感知的发现项中。
详情:[仪表板](#dashboards)、[GPO 当前状态](docs/CURRENT_STATE.md#gpo-posture-state)、[GPO 路线图](docs/ROADMAP.md#gpo-posture)

### ADCS 安全态势
ADCS 安全态势揭示高风险证书模板、发证 CA 暴露、NTAuth/模板控制路径、广泛的注册权限、request-SAN 链以及 ESC 类攻击路径。
详情:[仪表板](#dashboards)、[ADCS 当前状态](docs/CURRENT_STATE.md#adcs-posture-state)、[ADCS 路线图](docs/ROADMAP.md#adcs-posture)

### Trusts
Trust 安全态势审查外部和林信任的爆炸半径、SID 筛选、选择性身份验证、传递性、TGT 委派以及陈旧信任治理。
详情:[仪表板](#dashboards)、[Trust 仪表板页面](#dashboards)、[Trust 路线图](docs/ROADMAP.md#trusts)

### DNS
DNS 安全态势审查 AD 集成区域、解析的记录、不安全的动态更新、陈旧或悬空记录、通配符暴露、DnsAdmins 以及 DNS ACL 委派。
详情:[仪表板](#dashboards)、[DNS 验证流程](#safe-operation-from-a-management-server)、[DNS 路线图](docs/ROADMAP.md#dns)

### 执行
Executive 报告提供可供 CIO/CISO 查阅的暴露情况叙述、收集覆盖率、首要操作、例外情况、框架映射以及适合会议场景的导出上下文。
详情:[仪表板](#dashboards)、[治理与报告路线图](docs/ROADMAP.md#delivered-governance-and-reporting)、[Operations 详解](docs/OPERATIONS-WALKTHROUGH.md)

### Exceptions
Exceptions 将已接受的业务暴露与修复队列区分开来,包含所有者、审批人、工单、原因、过期时间以及缺失治理的指标。
详情:[已批准的例外](#approved-exceptions)、[受控修复](docs/GOVERNED-REMEDIATION.md)、[Operations 详解](docs/OPERATIONS-WALKTHROUGH.md)

### Timeline
Timeline 对比快照,以便团队审查分数变动、新增或移除的发现项、成员身份更改以及随时间推移的配置漂移。
详情:[仪表板](#dashboards)、[输出内容](#outputs)、[Operations 详解](docs/OPERATIONS-WALKTHROUGH.md)

## 环境要求
- 安装了 RSAT / Active Directory 管理工具的 Windows
- PowerShell 5.1+
- `ActiveDirectory` 模块
- AD 读取权限
安装 RSAT 示例:
```
Get-WindowsCapability -Online | Where-Object Name -like '*RSAT*ActiveDirectory*'
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
```
## 下载
请从加固的管理工作站或跳板机运行,不要在交互式域控制器会话中将其作为默认操作模式。
使用 Git 克隆:
```
git clone https://github.com/wgerade/AD-Posture.git
cd AD-Posture
```
或者从 GitHub 下载仓库的 ZIP 文件,将其解压到受控的本地文件夹中,然后在该文件夹中打开 PowerShell。如果 Windows 将下载的文件标记为 Internet 来源内容,请在导入模块之前取消阻止解压后的项目文件:
```
Get-ChildItem -Recurse | Unblock-File
```
确认模块已加载并查看公开命令:
```
Import-Module .\ADPosture.psd1 -Force
Get-Command -Module ADPosture
```
## 快速入门
```
Import-Module .\ADPosture.psd1 -Force
$snapshot = Invoke-ADPostureAudit -Verbose
Open-ADPostureDashboard -View Current
```
审计特定的 DC 或域:
```
Invoke-ADPostureAudit -Server 'dc01.contoso.com'
```
运行所有收集器并进行广泛扩展:
```
Invoke-ADPostureAudit -Full
.\scripts\Invoke-ADPostureAudit.ps1 -Full -OpenExecutive
```
`-Full` 表示最大程度的 v1 数据收集。它启用了可选组、完整的 ACL 态势(包括所有对象)、包含 SYSVOL ACL 审查的 GPO 态势、ADCS、Kerberos/Auth、Trust 以及 DNS。当操作员接受广泛收集带来的运行时间以及对 DC/跳板机造成的压力时,请使用此参数。
大型环境应按 domain 或 OU/subtree 规划广泛收集的批次,从专用的审计工作站运行,并观察对 DC、LDAP、CPU、内存和存储的影响。在繁忙的生产环境中,`-Full` 和不限速的 ACL 扩展并不属于常规默认设置。
## 从管理服务器安全运行
请从已安装 RSAT 的加固管理工作站或受控跳板机运行 AD Posture。请勿将交互式域控制器会话作为默认操作模式;虽然收集器是只读的,但广泛的 LDAP、ACL、SYSVOL、DNS、信任和 PKI 枚举仍然会消耗 CPU、内存、网络和目录服务资源。
推荐的操作模式:
```
Import-Module .\ADPosture.psd1 -Force
# 从 focused read-only posture 开始。
Invoke-ADPostureAudit `
-IncludeOptionalGroups `
-IncludeKerberosAuthPosture `
-IncludeTrustPosture `
-IncludeDnsPosture `
-LogPath .\reports\audit.log
# 仅在获得 approval 和 pacing review 后才添加更重型的 collectors。
Invoke-ADPostureAudit `
-IncludeAclPosture `
-IncludeAclAllObjects `
-IncludeGpoPosture `
-IncludeGpoSysvolAcl `
-IncludeAdcsPosture `
-AclReadDelayMilliseconds 100 `
-LogPath .\reports\audit-full.log
```
最低访问权限取决于所选的收集器:
- 基础成员身份、身份、Kerberos/Auth、Trust 和 DNS 态势需要对域和选定对象具有 AD 读取可见性。
- GPO/SYSVOL 态势需要对 GPO 容器、链接作用域和 SYSVOL 策略文件具有读取权限。
- ADCS 态势需要对 Configuration 命名上下文 PKI 对象以及证书模板 / Enrollment Services 元数据具有读取权限。
- 广泛的 ACL 收集应首先按 OU 或子树分阶段进行,只有在了解了对运行时间和目录服务的影响之后,才能扩大范围。
EDR、Defender 和安全工具应通过正常的变更治理流程进行处理,而不是临时绕过。在生产环境执行之前,请向安全运营团队预先注册工具目录、预期的 PowerShell 模块路径、`reports\` 和 `data\` 下的输出路径、哈希/签名信息(如果有)、预期的日志记录行为以及已批准的操作员身份。
流水线支持:
```
'dc01.contoso.com', 'dc02.contoso.com' | Invoke-ADPostureAudit -Verbose
Get-ADDomainController -Filter * | Invoke-ADPostureAudit -LogPath .\reports\audit.log
```
包含可选组:
```
Invoke-ADPostureAudit -IncludeOptionalGroups
```
为您的环境调整规范阈值:
```
Invoke-ADPostureAudit -StaleDays 180 -PasswordAgeDays 730
Invoke-ADPostureAudit -PasswordAgeDays 0 # Disable password-age findings
```
`-StaleDays` 控制何时将没有登录记录的账户视为未使用。`-PasswordAgeDays` 控制何时在修复指南中提示密码期限;如果密码期限由其他单独的控件处理,请使用 `0`。
`lastLogonTimestamp` 是经过复制的,且故意设置为近似值。根据域复制和更新频率的不同,它可能会比实际活动滞后几天。请将陈旧账户的结果视为审查候选者,并在修复之前根据权威的运营证据验证关键身份。
包含 ACL 安全态势预览:
```
Invoke-ADPostureAudit -IncludeAclPosture
```
包含 GPO 安全态势预览:
```
Invoke-ADPostureAudit -IncludeGpoPosture
Invoke-ADPostureAudit -IncludeGpoPosture -GpoSearchBase 'OU=Servers,DC=contoso,DC=local'
Invoke-ADPostureAudit -IncludeGpoPosture -IncludeGpoSysvolAcl
```
GPO 安全态势会读取 GPO 容器和链接的 domain/OU 作用域,然后报告有风险的 GPO 完整性和控制路径发现项。强制链接、禁用链接、禁用的 GPO 部分、脚本扩展元数据和孤立链接清单将作为上下文/清单保留,而不是生成独立的风险队列警报。当同时使用 `-IncludeAclPosture -IncludeAclGpoContainers` 时,危险的 GPO 委派 ACL 会与每个链接的作用域进行关联,因此相同的 GPO 权限在 `OU=Domain Controllers` 和普通 OU 上的得分会有所不同。在较大的环境中,请使用 `-GpoSearchBase` 来规划 OU 链接发现。
`-IncludeGpoSysvolAcl` 添加了对 GPO SYSVOL 文件夹的文件系统验证,将配置的 GPO 脚本执行路径解析为上下文,扫描标准 GPO 脚本文件夹,并检查位于 SYSVOL 内的已配置脚本文件/文件夹。脚本存在本身并不是一个风险发现项它还会报告从 GPO 元数据文件中发现的外部脚本路径、从 `GptTmpl.inf` 中提取的部分危险设置,以及 SYSVOL 内部危险的脚本内容模式。它仅从 GPO SYSVOL 目录树读取 ACL;外部文件服务器路径会被报告为范围外的执行依赖项,不会联系这些路径进行 ACL 验证。它不会比较不同 DC 之间的 SYSVOL ACL 差异。
GPO 安全筛选是通过读取 Apply Group Policy ACL 条目获得的。广泛的 apply 主体仅在关键或基础架构作用域上报告;默认情况下,仅有 `Authenticated Users` 会被视为上下文,而不是独立发现项。
包含 ADCS 安全态势预览:
```
Invoke-ADPostureAudit -IncludeAdcsPosture
```
ADCS 安全态势读取证书模板、Enrollment Services CA 对象、模板发布状态、NTAuthCertificates 以及尽力而为的 CA 注册表/策略配置。它报告高风险模板模式,例如广泛身份验证注册、广泛身份验证自动注册、类似 ESC1 的注册路径、Any Purpose/no-EKU 广泛发布、广泛的注册代理发布、可导出的身份验证私钥、广泛的模板控制委托、广泛的 Enrollment Services CA 对象控制、广泛的 NTAuth 控制以及 ESC6 风格的 CA request-SAN 配置/链。它仍然是选择启用的,因为 PKI 数据非常敏感,且企业 CA 环境差异巨大。
当您希望获得更广泛的覆盖范围时,请显式扩展 ACL 目标收集:
```
Invoke-ADPostureAudit -IncludeAclPosture -IncludeAclOrganizationalUnits -IncludeAclGpoContainers
Invoke-ADPostureAudit -IncludeAclPosture -IncludeAclPrivilegedUsers -IncludeAclPrivilegedComputers -IncludeAclPrivilegedGroups
Invoke-ADPostureAudit -IncludeAclPosture -IncludeAclAllObjects
Invoke-ADPostureAudit -IncludeAclPosture -IncludeAclAllObjects -AclReadDelayMilliseconds 25
Invoke-ADPostureAudit -IncludeAclPosture -AclSearchBase 'OU=Privileged,DC=contoso,DC=local'
```
广泛的 ACL 收集是顺序执行的,并会输出目标发现、ACL 读取和本地风险分类的进度。在出现 `ACL posture collection complete` 之后,AD 读取已完成;剩下的工作是对原始 ACE 进行本地分类。如果您希望减轻对 DC 或跳板机造成的持续压力,可以在类似于生产环境中使用 `-AclReadDelayMilliseconds`。
ACL 发现项在报告导出中保持完整。为了在广泛扫描时保持静态仪表板的响应速度,仪表板负载显示了有效受托人数量以及每个 ACL 发现项的一小部分样本。完整的有效受托人扩展将单独导出到 `reports\audit-*-acl-effective-trustees.csv` 中,以便进行清理和所有者审查。
广泛 ACL 扫描的操作指南:
- 在整个 domain 范围内使用 `-IncludeAclAllObjects` 之前,优先使用 `-AclSearchBase` 按 OU/subtree 进行分阶段收集。
- 从专用的管理或审计工作站运行广泛扫描,请勿在主域控制器上进行交互式运行。
- 对于大型 domain,请在维护窗口或低流量时段运行。
- 从保守的延迟开始,例如 `-AclReadDelayMilliseconds 100` 或更高,然后仅在观察 CPU、内存、磁盘和 LDAP/DC 响应后再调低。
- 将 `-AclReadDelayMilliseconds 0` 视为仅供合成测试使用。全域 ACL 收集可能是对 VM、跳板机或域控制器的实际压力测试。
- 将生成的报告保存在受限位置;ACL 报告会暴露受托人、目标、DN、SID、特权路径和修复上下文。
在实验室审计之后验证 DNS parser v2 证据:
```
Invoke-ADPostureAudit -IncludeDnsPosture
.\scripts\Test-ADPostureDnsV2Validation.ps1 -RequireParsedDnsRecords
```
验证脚本是只读的。它总结了已解析 DNS 记录的覆盖范围、DNS v2 发现项类型以及生成的 JSON 负载结构。
## 安全态势发现项路由
可报告的问题被路由到负责该风险的安全态势域中:
- `MachineAccountQuota > 0` 超出了当前活跃的 v1 安全态势域范围。
- `krbtgt` 轮换期限或缺失的本地密码证据由 Kerberos/Auth 报告。
- 特权 `SIDHistory` 将作为对象风险证据进行报告,并出现在行动计划中。
在事件或 SIEM 集成能够证明之前,仅限遥测的攻击路径不会作为自动发现项输出。请使用主要仪表板视图(例如 Auth、ACL、ADCS、Trust、DNS、GPO、对象风险、行动计划和 Executive)进行操作报告。
## 输出内容
| 产物 | 描述 |
| --- | --- |
| `data\snapshot-*.json` | 用于时间线和取证的历史完整快照 |
| `data\latest-snapshot.json` | 最新完整快照的稳定别名,可用于审计后命令和时间线审查 |
| `reports\audit-*-findings.csv` | 详细的发现项 |
| `reports\audit-*-groups.csv` | 组级别的暴露情况 |
| `reports\audit-*-acl-findings.csv` | 包含 ACL 安全态势时的 ACL 发现项 |
| `reports\audit-*-acl-effective-trustees.csv` | 在启用 ACL 态势扩展时,完整展开的有效 ACL 受托人详情 |
| `reports\audit-*-adcs-findings.csv` | 包含 ADCS 安全态势时的 ADCS 发现项 |
| `reports\audit-*-adcs-cas.csv` | 包含 ADCS 安全态势时的 ADCS Enrollment Services / 发证 CA 清单 |
| `reports\audit-*-identity-risk-findings.csv` | 身份风险发现项,例如特权 SIDHistory |
| `reports\audit-*-dashboard.json` | 仪表板负载 |
| `reports\latest-dashboard.json` | 最新的仪表板数据 |
| `dashboard\dashboard-data.js` | 用于本地 `file://` 仪表板的嵌入数据 |
| `config\ApprovedExceptions.json` | 受控的敏感组基线例外 |
生成的产物没有自动保留或破坏性清理策略。请仅将它们存储在访问受控(最好是加密)的存储设备上;根据本地治理规则定义保留和处理方式;并在批准的保留期结束时,手动删除快照、报告、仪表板负载、时间线文件、截图、日志和修复脚本。在删除之前,请检查目标路径。
## 仪表板
```
Open-ADPostureDashboard -View Current
Open-ADPostureDashboard -View ObjectRisk
Open-ADPostureDashboard -View AdcsPosture
Open-ADPostureDashboard -View KerberosAuthPosture
Open-ADPostureDashboard -View TrustPosture
Open-ADPostureDashboard -View DnsPosture
Open-ADPostureDashboard -View AclPosture
Open-ADPostureDashboard -View GpoPosture
Open-ADPostureDashboard -View Exceptions
Open-ADPostureDashboard -View Timeline
Open-ADPostureDashboard -View Executive
```
`Open-ADPostureDashboard` 直接打开选定的本地 HTML 页面。仅当嵌入式数据包丢失或早于报告时,它才会从 `reports\latest-dashboard.json` 刷新 `dashboard-data.js`。它不会启动 localhost 服务或持久的 PowerShell 进程。Objects 视图将其本地表格分页(每页 100 行),而 KPI 和配置文件则继续使用完整的嵌入式报告。
手动页面说明:
- `dashboard\index.html`:运营队列包含修复影响、账户暴露、组暴露、可修复/原生作用域切换、更智能的搜索、固定分数列、可展开的分数/ATT&CK/UAC/身份详情以及脚本下载。
- `dashboard\objects.html`:对象级别的队列包含累计对象分数、标签、配置文件证据、关系路径和修复重点。
- `dashboard\adcs.html`:ADCS 安全态势队列包含危险的证书模板、已发布的 CA、广泛的注册、发布护栏、注册代理暴露、Any Purpose/no-EKU 暴露、template/CA/NTAuth 控制委派以及 ESC 风格的攻击路径详情。
- `dashboard\auth.html`:Kerberos/Auth 安全态势队列包含易受 Roast 攻击的主体、委派暴露、RBCD、弱加密以及特权账户委派保护漏洞。
- `dashboard\trusts.html`:Trust 安全态势队列包含 SID 筛选漏洞、选择性身份验证漏洞、传递性、林信任爆炸半径、TGT 委派和陈旧信任治理。`dashboard\trust.html` 仍然作为轻量级的重定向入口。
- `dashboard\dns.html`:DNS 安全态势队列包含 AD 集成区域控制、DnsAdmins 暴露、DNS ACL 委派、通配符/陈旧/悬空记录、解析的 `dnsRecord` 证据和记录规范。
- `dashboard\acl.html`:ACL 安全态势队列包含标准化的危险权限、受托人/目标审查、继承筛选器、修复重点和有限的有效受托人样本;完整有效受托人详情已导出至 CSV。
- `dashboard\gpo.html`:GPO 安全态势队列包含委派控制发现项、作用域层级筛选器、危险的 SYSVOL/路径发现项和修复重点。
- `dashboard\exceptions.html`:已批准的业务例外、已接受的暴露、即将过期的审批以及从修复队列中分离出来的缺失治理字段。
- `dashboard\timeline.html`:跨审计的分数趋势、分数增量和成员身份变化。
- `dashboard\executive.html`:适合会议的安全态势摘要,包含就绪度控制、首要修复举措、已批准的例外数量、暴露进展以及打印/保存为 PDF 的导出选项。
## 对象风险浏览器
对象安全态势轨迹记录在 `docs\OBJECT-RISK-EXPLORER.md` 中。当前的静态快照现在包含 `Objects`、`ObjectEvidence` 和 `ObjectRelationships`,而 `dashboard\objects.html` 展示了针对用户、组、计算机、服务账户、OU、GPO、敏感容器和安全态势证据的对象级审查工作流。
`-IncludeAclPosture` 将第一个 ACL 证据族添加到该对象模型中。它读取 domain root、AdminSDHolder 以及被扫描的敏感组 ACL,然后将诸如 `GenericAll`、`GenericWrite`、`WriteDacl`、`WriteOwner`、`AllExtendedRights`、密码重置、DCSync 复制扩展权限、membership/SPN 写入、旧版 Microsoft LAPS、Windows LAPS、机密属性访问、删除权限以及意外对象所有者等高效权限标准化为对象证据和关系。额外的 ACL 目标族由显式开关控制,包括 Organizational Units、GPO 容器、受 AdminSDHolder 保护的用户、受 AdminSDHolder 保护的计算机、受 AdminSDHolder 保护的组、通过 `-IncludeAclAllObjects` 涵盖的所有 domain users/groups/computers/OUs/GPO 容器,或者通过 `-AclSearchBase` 选定的子树。ACL 评分具备上下文感知能力:Tier 0 目标保持完整的严重性,而针对普通用户、组、计算机、OU 和 GPO 目标的广泛发现项在报告时仍会附带目标上下文和调整后的评分。
`-IncludeGpoPosture` 添加了特定于 GPO 的证据。链接和元数据详情被视为上下文/清单,而危险的 GPO 委派仅在可获得 ACL 证据时才会成为更严重的暴露发现项。例如,链接到 Domain Controllers 的 GPO 上的 `Everyone` 拥有 `GenericAll` 权限会被评为 Tier 0 控制路径,而在普通工作站 OU 上拥有相同的委派权限则会获得较低的作用域加权分数。`-IncludeGpoSysvolAcl` 添加了对脆弱的 SYSVOL/脚本 ACL 的深入检查,并报告外部脚本路径而无需连接到外部文件服务器。
`-IncludeAdcsPosture` 添加了证书服务证据族。它读取证书模板、Enrollment Services CA 对象、模板发布状态、NTAuthCertificates 以及尽力而为的 CA 注册表/策略配置(例如接受请求方提供的 SAN)。它报告危险的身份验证发布模式、广泛的注册和自动注册、类似 ESC1 的路径、ESC2 风格的 Any Purpose/no-EKU 广泛发布、ESC3 注册代理暴露、ESC4 模板控制、ESC5/ESC7 PKI 对象控制、ESC6 CA request-SAN 配置/链、可导出的身份验证私钥,以及针对每个 ESC 风格发现项的攻击路径步骤。通用的 ACL 安全态势仅保留原始证据;而 ADCS 特有的解释则保留在 ADCS 模块中。
## 分层模型
自动分层模型位于 `config\TieringModel.json` 中。
| 层级 | 含义 | 示例 |
| --- | --- | --- |
| Tier 0 | 身份控制平面 | Domain Admins, Enterprise Admins, DnsAdmins, DCs, GPO creation, key admins |
| Tier 1 | 服务器和应用程序管理 | Server Operators, Backup Operators, Hyper-V Administrators, service accounts, gMSA/sMSA |
| Tier 2 | 工作站和用户管理 | Remote Desktop Users, helpdesk/user access groups |
每个发现项包含:
- `PrivilegeTier`
- `PrivilegeTierReason`
- `IsNativeIdentity`
- `NativeIdentityCategory`
- `NativeIdentityReason`
仪表板负载还包含用于 Tier 0/1/2 KPI 的 `TierBreakdown`。
## 已批准的例外
已批准的例外配置在 `config\ApprovedExceptions.json` 中。它们适用于受控的、临时的基线决策,而不是原生的 AD 排除。活跃、未过期的例外将从可操作的评分中移除,并显示在专门的 Exceptions 仪表板中。过期的例外将返回到操作队列。
从 `config\ApprovedExceptions.example.json` 开始:
```
{
"id": "EXC-DA-BREAKGLASS-001",
"enabled": true,
"sensitiveGroup": "Domain Admins",
"memberSam": "adm-breakglass",
"reason": "Break-glass account approved by identity governance process.",
"owner": "Identity Operations",
"approvedBy": "CISO",
"ticket": "CHG0001234",
"expiresAt": "2026-12-31"
}
```
成员身份匹配字段为 `sensitiveGroup`、`memberSam`、`memberSid`、`memberDn` 和 `accountType`。
ACL、GPO、ADCS、Kerberos/Auth、Trust、DNS 和 Identity Risk 发现项也可以通过限定范围的字段进行批准,例如 `findingDomain`(`ACL`、`GPO`、`ADCS`、`KerberosAuth`、`Trust`、`DNS` 或 `IdentityRisk`)、`findingType`、`aclRight`、`delegatedRight`、`trusteeName`、`trusteeSid`、`targetName`、`targetn`、`targetSid`、`gpoName`、`gpoGuid`、`gpoDn`、`scopeName`、`scopeDn`、`fileSystemPath`、`templateName`、`templateDn`、`principal`、`principalSam`、`delegationType`、`encryption`、`trustName`、`trustPartner`、`trustDirection`、`trustType`、`zoneName`、`recordName`、`recordType`、`computerName`、`setting`、`observedValue`、`mitreId` 和 `severity`。支持使用 PowerShell `-like` 语法进行通配符匹配,例如 `*\\Machine\\Scripts\\Startup\\*`。
仅包含成员身份字段的例外项不会匹配 ACL、GPO、ADCS、Kerberos/Auth、Trust、DNS 或 Identity Risk 发现项。原生/默认的 AD 架构排除项仍然独立于已批准的业务例外。
## 风险评分
评分目标始终为 `0`。评分是累计且无上限的:每个活跃的发现项都会贡献其计算得出的暴露分,组分数是其活跃成员分数的总和,整体分数是所有活跃发现项分数的总和。
暴露评分是此工具的内部优先级排序指标。它没有同行或市场基准,不声称在组织之间具有统计可比性,也不等同于监管、NIST、ISO、SOC 或 CIS 合规评级。
| 因素 | 影响 |
| --- | --- |
| 组 `riskWeight` | 基础风险权重 |
| 账户类型 | User, service account, gMSA/sMSA, computer, group |
| 嵌套 | 间接访问增加评分 |
| 禁用的账户 | 降低有效评分 |
| 陈旧的账户 | 降低有效评分,但仍然具有可操作性 |
| UAC 标志 | 增加或减少 UAC 风险加成 |
| Domain Controllers 中预期的 DC | 评分为 0 |
| 排除的账户/SID | 原生账户和众所周知的 AD 权限主体(例如 `S-1-5-9`)不计入汇总 |
每个发现项还包含评分解释字段:
- `ScoreFormula`:人类可读的计算公式。
- `ScoreModel`:使用的评分模型。
- `ScoreComponents`:基础、乘数、附加和覆盖组件。
- `TechnicalRisk`:技术影响摘要。
- `AttackTechniques`:相关的 ATT&CK 技术 ID、名称和战术。
仪表板的就绪度记分卡是派生自未决发现项的 0-100 操作视图。它不替代累计暴露评分;而是将相同的发现项归类为便于在就绪度审查中讨论的控制项。
Operations UX 还包括:
- 针对每个发现项的“为什么这很重要”。
- 带有评分因素的可点击分数深入分析。
- 针对 ATT&CK、UAC、活动日期、身份来源和完整修复操作的可展开行详情。
- 按账户分组,例如通过多个敏感路径出现的单个账户。
- 按建议操作分组,例如移除一小批成员带来的分数降低。
- 操作队列中针对可修复行与架构所属/原生身份的作用域筛选器。
- 跨 SamAccountName、显示名称、SID、DN/CN、账户类型、层级、UAC 标志、ATT&CK、技术风险和建议操作的搜索。
## 修复
生成可供审查的命令:
```
New-ADPostureRemediationScript `
-SensitiveGroup 'Backup Operators' `
-MemberSamAccountName 'svc_backup' `
-WhatIfOnly
```
Operations 仪表板可以根据每个发现项生成、复制和下载 `.txt` 修复脚本。
## 质量检查
安装工具:
```
Install-Module Pester -Scope CurrentUser -Force
Install-Module PSScriptAnalyzer -Scope CurrentUser -Force
```
运行检查:
```
.\scripts\Invoke-ProjectChecks.ps1
```
GitHub Actions 工作流会在 pull request 和 push 时运行 lint、测试、清单验证、GitHub 就绪度检查以及敏感生成产物防护。
使用合成数据刷新公开的演示截图、PowerShell 操作输出和 GIF:
```
.\scripts\New-DemoDashboardAssets.ps1
```
演示资产生成器仅供文档工具使用。它使用 Microsoft Edge 无头模式捕获截图,但运行审计、生成 JSON/CSV 输出、使用修复剧本或通过 `Open-ADPostureDashboard` 打开静态仪表板并不需要安装 Edge 或 Chrome。
该生成器在截屏前会使用合成的 `corp.example` 数据覆盖被忽略的本地仪表板负载,因此公开的 README 图像不会暴露真实的 AD 拓扑。它按照文档记载的顺序捕获仪表板流程,并创建经过脱敏处理的 PowerShell 截图,用于录制或发布说明。
有关分步录制脚本,请参阅 [docs/OPERATIONS-WALKTHROUGH.md](docs/OPERATIONS-WALKTHROUGH.md)。
## 自动化态势
该项目默认有意不推荐进行无人值守的计划任务。
避免以 `SYSTEM` 身份运行审计。在域上下文中,`SYSTEM` 使用计算机账户身份,这可能会产生不完整或具有误导性的 AD 可见性,并削弱审计的可追溯性。
避免使用存储用户密码的计划任务。这种模式与禁用或严格限制缓存任务凭据和 Windows 凭据保管库的加固环境相冲突。
避免将 gMSA/sMSA 作为此审计的默认计划身份。托管服务账户仍会创建需要设计审查、监控、轮换控制和明确风险接受的特权服务身份路径。
推荐的操作是由批准的管理员从加固工作站或受控管理会话中进行的交互式、受控的审计运行:
```
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File "C:\Path\To\AD-Posture\scripts\Invoke-ADPostureAudit.ps1"
```
如果本地策略要求使用自动化,请在启用之前记录该项目之外的身份模型、AD 读取范围、主机加固、输出存储权限和凭据处理方式。
## 项目结构
```
AD-Posture/
|-- .editorconfig
|-- .github/workflows/ci.yml
|-- .gitattributes
|-- ADPosture.psd1 / ADPosture.psm1
|-- config/
| |-- SensitiveGroups.json
| |-- TieringModel.json
| |-- UserAccountControlFlags.json
| `-- ApprovedExceptions.example.json
|-- dashboard/
|-- docs/
| |-- ARCHITECTURE.md
| |-- ROADMAP.md
| `-- assets/
|-- scripts/
|-- SECURITY.md
|-- src/
| |-- Private/
| `-- Public/
`-- tests/
```
## 安全性
这是一个审计和修复支持工具。它不会自动移除 AD 组成员。任何生产环境变更都应通过变更管理流程、批准的维护窗口以及 `-WhatIf` 验证。
生成的输出非常敏感。CSV、JSON、仪表板 JS、时间线文件、日志、例外文件、截图和修复脚本可能会暴露特权的 AD 拓扑、SID、DN、组嵌套、账户规范、治理工单和清理路径。请将它们保存在受限的工作站或加密存储中,不要随意发布,并在提交前审查 `.gitignore`。
受控的离线修复和产物控制记录在 [docs/GOVERNED-REMEDIATION.md](docs/GOVERNED-REMEDIATION.md) 中。行动计划现在集中了针对成员身份、ACL、GPO、ADCS 和 DNS 发现项的安全剧本;模糊的变更会被明确的原因阻止,而确定性脚本则使用 `-WhatIf`。
其他治理命令:
```
Invoke-ADPostureArtifactRetention
Invoke-ADPostureArtifactRetention -Remove
```
内置的安全控制:
- 生成的快照和仪表板负载包含敏感标记。
- 仪表板页面包含严格的 Content Security Policy 和 no-referrer 策略。
- 仪表板页面显示可见的敏感数据处理横幅。
- 修复脚本会对用户控制的值进行引号包裹,并在运行时构建 AD 筛选器,以避免引号逃逸。
- CI 以只读仓库权限运行。
- CI 阻止追踪已生成的产物,例如真实报告、仪表板负载、本地例外、私钥和加密保管库文件。
- 本地批准的例外文件和生成的报告默认被忽略。
## 架构和路线图
有关当前的模块边界和安全模型,请参阅 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
有关已交付的 v1 范围和明确推迟的工作,请参阅 [docs/ROADMAP.md](docs/ROADMAP.md)。
## 发现与关键词
有关搜索关键词、用例、受众和相关话题标签,请参阅 [docs/DISCOVERY.md](docs/DISCOVERY.md)。
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 更新日志
请参阅 [CHANGELOG.md](CHANGELOG.md)。
## 许可证
AD Posture 的源代码可供社区审查、学习、非商业内部使用和贡献。
- 代码采用 PolyForm Noncommercial License 1.0.0 许可。
- 文档、截图、演示图像和其他非代码材料采用 CC BY-NC-SA 4.0 许可。
- 商业用途、付费再分发、转售、商业托管、SaaS 产品或整合进商业产品需要获得事先书面许可。
请参阅 [LICENSE](LICENSE)。
标签:Active Directory, AI合规, GPT, IPv6, Libemu, Plaso, PowerShell, Terraform 安全, 安全基线, 教学环境, 权限审计, 漏洞管理