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,未进一步解释)