本文档综合了Azure Local官方文档、AzureLocal.Cloud企业级实施规范、DELL官方Azure Local部署文档以及项目实践等相关资料,整理归纳出此文档,供参考。
一、AD 环境准备在 Azure Local 部署中的位置
根据Azurelocal.Cloud企业最佳实践,AD 准备位于部署全流程的 Part 3 之前。
|-----------------------|------------------------------------------------------------------|----------|
| Part | 阶段 | 备注 |
| Part 1 | CI/CD 基础设施 | 自动化部署引擎 |
| Part 2 | Azure 云端基础(Landing Zones / RP / RBAC / Mgmt Infra / IAM) | 云的"地基" |
| Part 3 - Phase 01 | ★ On-Premises Readiness → Active Directory Preparation(本文重点) | 身份地基 |
| Part 3 - Phase 02 | Enterprise Network Readiness Validation | 网络就绪验证 |
| Part 3 - Phase 03 | Network Infrastructure Configuration | 物理网络配置 |
| Part 4 | Cluster Deployment(6 个 Phase) | 集群部署核心 |
| Part 5 | Operational Foundations(监控 / BCDR / 安全治理等) | 运维基础 |
| Part 6 | Cluster Testing & Validation | 验证 |
关键观察 :在 azurelocal.cloud 的"云端优先"模型里,云上基础(Part 2)→ AD(Part 3-Phase 01)→ 集群部署(Part 4)。在 Dell 文档和微软经典文档里,顺序也类似但颗粒度不同。
二、AD 准备的三大要求(Microsoft 官方归纳)
无论哪种部署方式,微软官方推荐最佳实践:
|-------|---------------------------------|-----------------------------------------------|
| # | 要求 | 目的 |
| 1 | 专用 OU | 把 Azure Local 的对象(部署账户、节点机器账户、集群 CNO)隔离在独立 OU |
| 2 | GPO 继承屏蔽(Block Inheritance) | 防止域级 GPO 干扰集群配置 |
| 3 | LCM 部署账户对该 OU 有完全控制权 | 部署/修复/加节点时账户必须能写计算机对象 |
⚠️ 第一条隐藏陷阱(官方明确警告)
当你 Block Inheritance 时,带
Enforced选项的 GPO 不会被屏蔽 。 如有强制 GPO 影响集群节点,必须用 WMI Filter 把 AzLocal 机器账户排除掉,否则 GPO 仍会冲突。
三、LCM 部署账户(Deployment User)要求
LCM(Lifecycle Manager)账户是整个部署生命周期的核心身份。它的要求和 Azure Local 自身高度耦合。
3.1 AD 层面要求
|---------------------------|---------------------------------------------|
| 项 | 说明 |
| Interactive logon | 必须允许交互式登录 |
| Log on as a batch job | 必须有"作为批处理作业登录"权限 |
| OU 完全控制 | 对专用 OU 有 Full Control |
| 计算机账户创建权限 | 委派权限"在目标 OU 中加计算机账户"(用于修复 / 加节点) |
| 本地管理员 | 部署过程中,LCM 账户会自动配置为物理节点本地 Administrators 组权限 |
3.2 用户名 / 密码策略
|-------|-----------------------------------------------------------------------------------------------------|
| 项 | 规则 |
| 用户名 | 1-20 字符;只允许字母/数字/连字符/下划线;不能以连字符开头 ;不能是 admin;不能和本地管理员同名;只填用户名,不填域 (不要 contoso\username) |
| 密码 | ≥ 14 字符;含小写 + 大写 + 数字 + 特殊字符 |
| 唯一性 | 每个 Azure Local 实例用独立账户和独立密码(避免单一实例被攻破波及其他实例) |
3.3 默认域策略的坑
默认域策略可能拒绝 "Log on as batch job"。两种解决方案:
- 修改默认域策略
- 在 OU 上单独授权 LCM 账户该权限
四、OU 设计模式(两种主流方案对比)
4.1 Microsoft 官方方案(单实例最小结构)
Domain (contoso.com)
└── OU=AzureLocal ← 专用 OU(每实例)
├── lcmuser(LCM 部署账户)
├── NODE01(节点机器账户)
├── NODE02(节点机器账户)
└── CLUSTER-NAME(集群 CNO)
要点:
- 每实例一个独立 OU
- Block Inheritance 在 OU 层级启用
- 部署完成不支持迁移计算机对象到其他 OU ------ 一次到位
4.2 azurelocal.cloud 工厂级方案(多实例标准结构)
Domain (contoso.com)
└── MGMT OU
├── Admins
├── Operations
├── Security Groups
├── Servers
├── Services
└── Clusters / AzureLocal
└── (每个集群一个独立 OU)
azurelocal.cloud 模式下,命名强约束:
SG-{org_prefix}-{cluster_id}-AZL-{role}
例:SG-IIC-clus01-AZL-Administrators
4.3 大规模部署的"父-子 OU + Enforced"模式(企业推荐组织架构)
Domain
└── Parent OU(Block Inheritance ✅)
├── Sub OU #1(Block Inheritance ✅)
├── Sub OU #2(Block Inheritance ✅)
└── ...
关键设计:
- 父 + 子 OU 都启用 Block Inheritance
- 想批量应用到所有实例的 GPO → 链到父 OU + 启用 Enforced
- 这样即使子 OU Block Inheritance,Enforced GPO 仍能穿透
4.4 ⚠️ 不要做的事(红色警告)
|-----------------------------------|------------------------------------------------------------------------------------------|
| 错误操作 | 后果 |
| 修复节点时删除现有 OU | 如果卷用 BitLocker 加密 → 删除 OU = 删除 BitLocker 恢复密钥 = 数据永久锁死(如果企业恢复密钥存放在Entra MBAM或KeyVault例外) |
| OU 路径中使用 & " ' < > | New-HciAdObjectsPreCreation 会失败 |
| 多个实例共用一个 LCM 账户 | 一旦泄露 = 全部实例失守 |
| 把部署账户名为 admin 或 administrator | 部署脚本会拒绝 |
五、安全组与 RBAC 设计
5.1 Microsoft 默认安全模型
MS 官方脚本 New-HciAdObjectsPreCreation 自动创建必要的安全组,但没有详细公开具体几个组和命名约定。 核心原则:
- LCM 账户加到各节点的本地 Administrators
- 必要时建专用 OU GPO 把域组嵌套到本地组(如本地管理员)
5.2 azurelocal.cloud 推荐RBAC模型(精细切分)
|----------------------|--------------------------------------------|------------------------------------------------------------------|
| YAML Key | 示例名称 | 加入到节点本地组 |
| azure_local_admins | SG-IIC-clus01-AZL-Administrators | Administrators |
| operations | SG-IIC-clus01-AZL-Operations | Remote Management Users、Remote Desktop Users |
| read_only | SG-IIC-clus01-AZL-ReadOnly | Remote Desktop Users、Performance Monitor Users、Event Log Readers |
| wac_admins | SG-IIC-clus01-AZL-WAC-Administrators | WAC 服务器(不在节点上) |
| wac_users | SG-IIC-clus01-AZL-WAC-Users | WAC 服务器(不在节点上) |
| hyperv_admins | SG-IIC-clus01-AZL-HyperV-Administrators | Hyper-V Administrators、Remote Management Users |
| storage_admins | SG-IIC-clus01-AZL-Storage-Administrators | Administrators |
设计意图:
- 顶级 admin :
azure_local_admins+storage_admins(能改集群核心数据) - VM 管理员 :
hyperv_admins(管 Hyper-V 但不能动存储配置) - 运维 :
operations(远程管理 + RDP,不动系统) - 只读审计 :
read_only(监控性能 + 读日志) - WAC 独立 :
wac_admins/wac_users不入节点本地组,只在 Windows Admin Center 网关机上生效(隔离 WAC 攻击面)
5.3 服务账户(azurelocal.cloud Task 4)
- Break-glass 紧急管理员账户 ------ 救命用,密码密封保存
- 可选 gMSA(Group Managed Service Account) ------ 集群服务的托管账户
- LCM 部署账户(在 Task 1 创建)
六、DNS 准备
6.1 azurelocal.cloud Phase 01 Task 3 - DNS Node A Records
|---------------|--------------------------------|
| 步骤 | 说明 |
| 创建正向 + 反向查找区域 | forward + reverse lookup zones |
| 配置 A 记录 | 每个集群节点的 A 记录 |
| 配置 CNAME 记录 | 管理端点的 CNAME(微软推荐) |
| 验证 | nslookup 验证正反向解析 |
6.2 防火墙要求
如果有防火墙在 Azure Local 与 AD 之间:
- 参考:Firewall requirements for Active Directory Web Services and Active Directory Gateway Management Service
- 参考:How to configure a firewall for Active Directory domains and trusts
七、准备 AD 的两种实现方式
方式 1:PowerShell 模块 AsHciADArtifactsPreCreationTool(MS 推荐)
安装:
# 先卸载旧版
# Uninstall-Module AsHciADArtifactsPreCreationTool
# 安装最新版本
Install-Module AsHciADArtifactsPreCreationTool -Repository PSGallery -Force
核心 cmdlet :New-HciAdObjectsPreCreation
|--------------------------------|--------|-----------------------------------------------------------|
| 参数 | 必填 | 说明 |
| -AzureStackLCMUserCredential | 是 | 部署账户凭据(只填用户名,不填域) |
| -AsHciOUName | 是 | OU 的 distinguished name(如 OU=AzLocal,DC=contoso,DC=com) |
执行步骤:
-
在已加入 AD 域的机器上,管理员身份启动 PowerShell
-
创建凭据对象:
password = ConvertTo-SecureString '
' -AsPlainText -Force user = "lcmuser"
credential = New-Object System.Management.Automation.PSCredential (user, $password) -
运行 cmdlet:
New-HciAdObjectsPreCreation
-AzureStackLCMUserCredential $credential
-AsHciOUName "OU=AzLocal,DC=contoso,DC=com" -
在 Server Manager → Tools → Active Directory Users and Computers 验证 OU 创建成功,里面有新 LCM 部署账户
方式 2:手动配置
如需手动:参考 Custom Active Directory configuration for your Azure Local,手工建 OU + 赋权限 + 屏蔽 GPO 继承。
八、Dell 文档里的 AD / 主机名准备步骤(OS 部署后)
Dell 的 SolVe Generator 在"主机 OS 部署完成后"还有一段节点 AD 准备步骤:
8.1 远程管理开启
# 启用 PowerShell 远程处理
Enable-PSRemoting -Force
# 设置 WinRM 监听所有 IP
winrm quickconfig
# 防火墙放行
Enable-NetFirewallRule -DisplayGroup "Windows Remote Management"
8.2 主机名修改
Dell 明确:hostname 要在 OS 部署完成后、注册 Arc 之前修改。命名模式需与现有 Azure Local 实例一致。
Rename-Computer -NewName "Node01" -Restart
8.3 DNS 后缀配置
# 设置主 DNS 后缀
$PrimaryDNSSuffix = "contoso.com"
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" `
-Name "NV Domain" -Value $PrimaryDNSSuffix
8.4 ICMPv4 验证
# 在域控或管理机上 ping 节点验证连通
# Test-NetConnection Node01.contoso.com -CommonTCPPort WINRM
8.5 加入 AD 域
# 添加节点到域
$domain = "contoso.com"
$credential = Get-Credential
Add-Computer -DomainName $domain -Credential $credential -Restart
# 加入域后,LCM 部署账户从本地域管理员升级为域账户(在集群部署时由 Portal 完成)
8.6 Arc 注册
Dell 文档里 Arc 注册是 LCM 部署账户或 Deployment User:
Invoke-AzStackHciArcInitialization `
-SubscriptionID "<sub-id>" `
-ResourceGroup "<rg-name>" `
-TenantID "<tenant-id>" `
-Cloud "AzureCloud" `
-Region "<region>"
九、验证清单(Validation Checklist)
部署 AD 准备完成后逐项验证:
-
AD 域已部署且运行正常
-
专用 OU 创建并验证
-
所有安全组已创建(azurelocal.cloud 是 7 个;MS 官方是脚本自动建)
-
OU 上已启用 Block Inheritance
-
强制 GPO 已配置 WMI Filter 排除 AzLocal 节点
-
LCM 部署账户已创建
-
LCM 账户有 Log on as batch job 权限
-
LCM 账户对专用 OU 有 Full Control
-
DNS 记录已配置且能解析(A 记录 + 反向 + CNAME)
-
节点已加入域
-
NTP时间同步
-
Kerberos验证
-
DNS SRV记录
-
域控制器复制验证通过:
repadmin /replsummary
-
Break-glass 紧急账户已创建并密封保存密码(azurelocal.cloud 标准)
-
gMSA 账户脚手架已建立(可选,azurelocal.cloud 标准)
-
每个实例用了独立的 LCM 账户和密码(大规模部署)
-
WAC 安全组只在 WAC 网关机上生效,不在节点本地组(azurelocal.cloud 标准)
十、暗坑清单(AD 准备实战中容易踩的雷)
|-------|-------------------------------------------------------|------------------------------------------------------------------|
| # | 坑点 | 怎么避 |
| 1 | Block Inheritance 不挡 Enforced GPO | 强制 GPO 必须加 WMI Filter 排除 AzLocal 节点 |
| 2 | OU 路径不能含 & " ' < > | 避开这些字符 |
| 3 | OU 名不能和本地管理员同名 | 用专门的 LCM 用户名(不要 administrator) |
| 4 | New-HciAdObjectsPreCreation 不会自动加 Log on as batch | 默认域策略禁止的话要手动改策略 |
| 5 | 修复节点时绝对不要删 OU | BitLocker 钥匙在 OU 里 |
| 6 | 部署完成不支持迁移计算机对象 | OU 路径设计要一次到位 |
| 7 | Module 多版本共存会出错 | 先 Uninstall-Module 再装新版 |
| 8 | LCM 账户名写了域名前缀 | 脚本会失败,只填用户名 |
| 9 | 密码 < 14 字符 / 复杂度不够 | 强制 ≥ 14 + 四类字符 |
| 10 | 多个实例共用 LCM 账户 | 一个泄露 = 全部失守;强制独立 |
| 11 | WAC 安全组误加到集群节点本地组 | WAC 组只在 WAC 网关机上生效 |
| 12 | 节点加域前没设 DNS 后缀 | AD 验证会失败,先 Set-ItemProperty -Path "HKLM:\...\Tcpip\Parameters" |
| 13 | WinRM 没启用 / 防火墙没放行 | OS 配置后第一步 Enable-PSRemoting -Force + 防火墙规则 |
| 14 | 主机名修改在 OS 部署后但 Arc 注册前漏了 | 改名后必须重启;Arc 注册后改名会引发 Arc 状态不一致 |
十一、参考资料链接
Microsoft 官方
- Prepare Active Directory for Azure Local deployment
- Custom Active Directory configuration for your Azure Local
- Firewall requirements for ADWS and AD Gateway Management Service
- AsHciADArtifactsPreCreationTool (PowerShell Gallery)
azurelocal.cloud(2604 Preview 标准)
- Phase 01: Active Directory Preparation(总览)
- Task 01: OU Creation
- Task 02: Security Groups
- Task 03: DNS Node A Records
- Task 04: Service & Admin Accounts
- Task 05: Group Assignments
十二、推荐操作流程(实战模板)
步骤 1: 准备工作
├─ 安装 PowerShell 模块(强制当时推荐版本,先卸旧的)
├─ 准备好域管理员凭据(创建 OU 需要)
└─ 规划好 OU 路径(避开特殊字符)
步骤 2: 创建专用 OU(MS 官方方式)
├─ 运行 New-HciAdObjectsPreCreation
├─ 创建 LCM 部署账户
└─ 在 ADUC 验证 OU + 账户已建
步骤 3: 设置 OU 的 Block Inheritance
└─ ADUC → OU 属性 → Group Policy → Block Inheritance
步骤 4: 处理 Enforced GPO(如果有)
└─ 给强制 GPO 加 WMI Filter 排除 AzLocal 节点
步骤 5: DNS 准备
├─ 创建 A 记录(每个节点)
├─ 创建反向 PTR 记录
└─ 创建管理端点 CNAME
步骤 6: (azurelocal.cloud 标准)创建安全组 + 服务账户
├─ 7 个 SG-{prefix}-{cluster}-AZL-{role} 安全组
├─ Break-glass 紧急账户
└─ 可选 gMSA 脚手架
步骤 7: 验证
├─ repadmin /replsummary(复制正常)
├─ nslookup 验证 DNS
└─ LCM 账户登录测试(验证 Log on as batch)
步骤 8: 后续
└─ 进入 Part 3-Phase 02 Enterprise Network Readiness Validation