Azure Local离线模式身份规划(系列篇之三)

1. 身份架构概述

Disconnected Operations 不依赖 Microsoft Entra ID,而是在本地构建完整的身份认证体系。

整个身份系统由三个组件组成:

  • Active Directory Domain Services (AD DS):提供用户、组及组成员信息
  • Active Directory Federation Services (AD FS):提供 OpenID Connect(OIDC)身份认证
  • LDAP v3(推荐 LDAPS):负责同步用户组及成员信息

整个身份体系完全运行在本地数据中心,无需连接 Azure 公有云。


2. 支持的身份组件

组件 用途 说明
Active Directory Domain Services(AD DS) 用户、组、组成员管理 仅支持 Universal Group Scope
Active Directory Federation Services(AD FS) OIDC 身份认证 必须能够访问 https://<ADFS-FQDN>/adfs Metadata Endpoint
LDAP v3 同步组与成员 默认端口 3268(LDAP)或 3269(LDAPS),推荐使用 3269(SSL/TLS)

⚠️ 重要 :当前 Azure Local Disconnected Operations 不支持 Microsoft Entra ID(原 Azure Active Directory)作为身份提供程序。身份认证必须通过 AD FS + Active Directory 实现。


3. 身份认证流程

复制代码
[用户登录]
   │
   ▼
[Local Portal]
   │
   ▼  OpenID Connect
[AD FS]
   │
   ▼  用户身份认证
[返回 Access Token]
   │
   ▼
[Appliance Control Plane]
   │
   ▼  LDAP(每 6 小时同步)
[Active Directory]

身份职责划分:

功能 组件
用户认证 AD FS(OIDC)
用户组同步 LDAP
用户信息来源 Active Directory
权限控制 Azure RBAC

4. Root Operator 与权限模型

部署过程中必须指定一个 Root Operator(Initial Operator)。

Root Operator 自动拥有 Operator Subscription 权限,可继续创建其他 Operator。

其职责包括:

  • 创建 Operator
  • 创建订阅(Subscription)
  • 创建 Service Principal(SPN)
  • 管理 Identity 配置
  • 管理诊断与日志
  • 管理 RBAC

微软官方特别说明:"Role assignments and policies aren't inherited from the Operator Subscription to individual subscriptions. Each subscription has its own RBAC scope."
因此:每个 Subscription 都拥有独立的 RBAC 权限边界,权限不会自动继承。


5. Operator 权限

5.1 身份管理

操作 Operator
创建 Operator ✅
创建 SPN ✅
删除 SPN ✅
修改 SPN ✅
查询 SPN ✅
查看同步后的组成员 ✅
查看 Identity 配置 ✅
查看同步状态 ✅

5.2 Subscription 管理

操作 Operator
创建 Alias ✅
删除 Alias ✅
创建 Subscription ✅
删除 Subscription ✅
查询 Subscription ✅
修改 Subscription Owner ✅
重命名 Subscription ✅
Resume Subscription ✅

5.3 运维与诊断

操作 Operator
收集日志 ✅
下载日志 ✅
配置 Diagnostics ✅
配置 Syslog Forwarding ✅

5.4 权限限制

以下操作不允许:

  • ❌ 删除 Operator Subscription
  • ❌ Operator 自动继承所有 Subscription 权限

需要注意:SPN Owner 可以删除自己拥有的 SPN------这是独立于 Operator 的权限模型。


6. Identity 同步机制

部署完成后:

  1. 首次完成身份同步
  2. 后续默认 每 6 小时自动同步一次

同步内容包括:

  • 用户组
  • 用户成员关系
  • Group Membership

同步状态可通过 Operator API 查询:

复制代码
Get-ApplianceExternalIdentityObservability

7. 部署前需要准备的身份参数

参数 说明 示例
Authority OIDC Metadata URI https://adfs.contoso.com/adfs
ClientId AD FS 注册应用 ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
LDAP Credential LDAP 只读账户 ldap / ******
LDAPS Certificate Chain LDAPS 证书链 见 PKI 章节
OIDC Certificate Chain AD FS 证书链 见 PKI 章节
LDAP Server LDAP Server FQDN ldap.contoso.com
LDAP Port LDAP 端口 3269(推荐)
Root Operator UPN 初始 Operator operator@contoso.com
Sync Group Identifier Root Group GUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Automation Certificate 自动化部署证书(可选) PowerShell 创建

8. Identity 配置示例

复制代码
$ldapPass = 'retracted' | ConvertTo-SecureString -AsPlainText -Force

$idpConfig = @{
    authority                     = 'https://adfs.contoso.com/adfs'
    clientId                      = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    rootOperatorUserPrincipalName = 'operator@contoso.com'
    ldapServer                    = 'ldap.contoso.com'
    ldapCredential                = New-Object PSCredential("ldap", $ldapPass)
    syncGroupIdentifier           = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
}

9. 自动化部署(Automation Certificate)

如果希望整个部署流程无人值守,可配置 Automation Certificate。

Azure CLI 示例:

复制代码
az login \
    --service-principal \
    --username <ApplicationId> \
    --certificate <CertificatePath> \
    --tenant <TenantId>

PowerShell 示例:

复制代码
Connect-AzAccount `
    -ServicePrincipal `
    -CertificateThumbprint $CertThumbprint `
    -Tenant $TenantId `
    -ApplicationId $ApplicationId

⚠️ 重要 :Automation Certificate 等同于部署环境的最高权限凭据。如果证书永久丢失,将无法继续自动化管理,严重情况下可能需要重新部署 Disconnected Operations。

建议:

  • 使用企业 PKI 签发
  • 离线备份
  • 妥善保管私钥

10. 部署前 Identity 检查清单

检查项 是否必须
LDAP Server 已部署 ✅
LDAP Endpoint 可访问 ✅
AD FS 已部署 ✅
OIDC Metadata 可访问 ✅
Appliance 能解析 LDAP FQDN ✅
Appliance 能解析 AD FS FQDN ✅
LDAP 只读账户已创建 ✅
已确定 Root Operator ✅
已确定同步 Root Group ✅
已准备所有 Identity 参数 ✅

11. 官方未明确说明但需要注意的事项

微软官方文档未明确说明以下内容:

  • AD FS 的最低版本要求(通常建议 Windows Server 2019 或更新版本)
  • 是否支持 LDAP StartTLS(官方仅说明 LDAP/LDAPS,推荐使用 LDAPS 3269)
  • Operator 数量是否存在上限
  • Operator Subscription 是否涉及独立授权或计费
  • Universal Group Scope 的设计原因(官方仅要求必须使用 Universal Group,未进一步解释)