本文补齐租户控制面中不能进入 Runtime Projection、但会触发编译、准入、审批、撤销或审计的权威对象。Identity/Enrollment 分别以专项文档为准;AccessGrant 编译以 PolicyKernel 为准;本文固定 Group、AdminRoleBinding、AccessRequest、CapabilityActivation、MachinePrincipal、Posture、Publication、Share 和密钥轮换的状态与 API。
所有写命令遵循 共享命令信封,并在权威事务中同时写资源、revision、audit 和 outbox。控制对象最小字段:
status 是对象生命周期,不承载 availability、projection、runtime 或 freshness;write;| 类型 | 成员权威 | 更新方式 | 首版限制 |
|---|---|---|---|
manual | NSD Organization 管理员 | 显式 add/remove | 无嵌套 |
directory_synced | SCIM/Directory binding | provider revision sync | 控制台只读成员 |
dynamic | 版本化 predicate | NSD directory evaluator | 只允许已注册稳定属性 |
system | NSD | 固定语义,如 everyone/owners | 不能删除或改写 selector |
Device、Node、hostname、email 字符串不是 Group 成员;Group 成员是 UserPrincipal/MachinePrincipal。设备条件进入 AccessGrant source conditions。首版 group_ids 不能作为另一 Group 的 member,发现嵌套或循环返回 group_nesting_unsupported。
| Method | Path | Action |
|---|---|---|
| POST | /orgs/{org}/groups | group.create |
| PATCH | /orgs/{org}/groups/{group} | group.update |
| POST | /orgs/{org}/groups/{group}/members:batch | group.members.update |
| POST | /orgs/{org}/groups/{group}:simulate | group.simulate |
| POST | /orgs/{org}/groups/{group}:disable | group.disable |
| DELETE | /orgs/{org}/groups/{group} | group.delete after impact preview |
批量成员更新是单 revision 和单审计操作;不能循环产生中间 policy projection。SCIM sync 使用 provider cursor/revision 和完整/增量模式,读取失败保留最后有效成员集并标记 sync_read_failed,不清空 Group。
AdminRoleBinding(subject, resource_scope, actions, conditions) 是管理权限权威。状态为 active|suspended|revoked|expired;suspended 不允许管理操作但保留对象,revoked 不可恢复。
首版 action registry:
| 资源 | 动作 |
|---|---|
| Organization | read, update, invite, close, delete, export |
| Member/Group | read, create, update, suspend, remove, sync |
| Device/Membership | read, approve, assign, revoke, posture_read |
| Network | read, create, update, capacity_plan, close, delete |
| AccessGrant | read, create, simulate, publish, approve, revoke |
| Capability | read, policy_manage, approve, suspend, revoke |
| Service/Route | read, create_request, approve, disable, retire |
| Gateway/PublicApplication | read, configure, approve, suspend, revoke |
| Identity/Federation | read, configure, deprovision, revoke_session |
| Audit/Compliance | read, export, legal_hold_manage |
| Billing | read, quote, purchase, payment_manage, invoice_read |
| Role | read, bind, revoke |
预置角色只是创建 Binding 的模板。OrganizationOwner 不能删除最后一个有效 owner;Role 管理不能由仅持有普通资源 update 的主体完成。
AdminAuthorizer 在线读取同一事务快照中的 subject、Binding、scope、condition、assurance 和 expiry。不存在 allow 即 deny;读取失败返回 admin_authorization_read_failed,不伪装 403。
API 为 /orgs/{org}/role-bindings 的 create/list/get/update/suspend/revoke/impact。任何扩大 actions/scope 或修改 Role Binding 自身要求 step-up;提交前重新计算 actor 是否仍有 role.bind。
evaluation_error 不等于 denied,可重试但不能批准。approved 是审批决议;同一事务创建一个 immutable TemporaryAccessGrant 并进入 active。Temporary Grant 使用生产 AccessCompiler,不建立第二套 allow 算法。
请求绑定 subject、source condition snapshot、resource/action/constraint、reason、requested duration、target Network 和 requester proof。服务端按策略限制最大时长、是否允许自助、审批角色和是否要求 ticket/step-up。
批准时重新校验:request revision、subject/Membership、resource、eligible policy、approver、Entitlement(若该工作流是商业能力)和冲突。有效期为 min(approved_at + requested_duration, policy_max_not_after);批准不自动延长已有 session assurance。
| Method | Path | 说明 |
|---|---|---|
| POST | /networks/{net}/access-requests | 创建并返回 evaluation operation |
| GET | /access-requests/{id} | requester/approver scoped view |
| POST | /access-requests/{id}:approve | expected revision + impact digest |
| POST | /access-requests/{id}:reject | reason required |
| POST | /access-requests/{id}:cancel | requester only before active |
| POST | /access-requests/{id}:revoke | Security Admin/approver policy |
active revoke/expire 立即停止新 credential/lease 签发,并走增量 reverse dependency 撤销;在线 99% 60 秒、旧租约最迟 5 分钟失效。Request、审批、Temporary Grant 和 projection provenance 使用同一 request/operation chain。
CapabilityPolicy 回答“谁可以申请什么最大范围、是否可自动批准”;CapabilityActivation 回答“这个具体实例是否批准、是否占配额、是否有 Lease”。Policy allow 永远不能跳过 Activation 事务。
Availability=ready|degraded|unavailable,Projection=pending|applied|failed|outdated_applied,Runtime=inactive|starting|ready|draining|failed 独立存在。离线只改变 Availability;suspended 保留 used 配额占位,revoked 原子释放;可选 auto_revoke_at 必须显式设置。
批准和 auto approve 使用相同事务:重验 Policy → 分类 Managed Resource → 原子 quota admission/reservation consume → 写 Activation active revision → usage slot/outbox → audit → 触发 Capability Lease。任一步失败不留下 active 或计费占位。
API 位于 /networks/{net}/capability-policies 和 /capability-activations,分别提供 simulate/publish 与 request/approve/reject/suspend/resume/revoke。resume 不重新抢 quota,因为 suspended 保留占位;Entitlement 已失去能力时不能 resume,返回 feature_not_entitled 并要求影响预览后 revoke。
MachinePrincipal 是非人类 ACL subject,OAuth Client/Workload Credential 是证明方式。两者不能合成一张长期 API key。
状态为 active|suspended|revoked|expired。Client secret 只在创建/轮换时展示一次并 hash-at-rest;优先支持 private_key_jwt 或 mTLS,兼容 secret 也必须有 expiry。
POST /oauth/token 使用 client_credentials,服务端本地验证 credential、principal、Admin/Access policy、audience 和 entitlement,签发最长 15 分钟 Access Token。Token 至少绑定 issuer、subject MachinePrincipal、organization、audience、actions/scopes、resource selector digest、credential ID、issued/expiry 和 token ID。
轮换使用 prepared → dual_valid → activated → retired,重叠窗口可配置但有上限。revoke credential 终止该 credential 派生 token/Edge session;revoke MachinePrincipal 终止其全部 credentials、Membership/Access 派生,但不删除审计。
管理 API 位于 /orgs/{org}/machine-principals 和 /oauth-clients,包含 create/read/update/suspend/revoke/rotate/last-used。Terraform/API ownership 使用 managed_by 和 expected revision,控制台不能静默覆盖 IaC 管理字段。
PostureProvider 状态为 active|suspended|revoked,来源类型为 platform_attestation|mdm|edr|ns_observation|admin_assertion。普通 ns 自报 OS managed 不能升级为受管证明。
PostureClaim 至少包含 provider、device、claim type/value、assurance、observed_at、expires_at、source evidence digest、signature 和 revision。NSD 规范化到注册 claim registry;未知 claim 不能被 Policy 当 truthy。
| 状态 | 含义 | 需要该 posture 的访问 |
|---|---|---|
| compliant | 已验证且未过期 | 可继续其它条件 |
| noncompliant | 已读取并明确不满足 | deny |
| stale | 最后 claim 过期 | fail-closed,提示刷新 |
| unavailable | provider 暂时不可用 | 保留事实,新的敏感访问 fail-closed |
| evaluation_error | 无法解析/验证 | 不伪装 noncompliant |
Provider read failure 不清空历史 claim。高安全 Grant 可以要求更短 freshness;Posture 改变触发受影响目标增量编译和短 lease 撤销。
API 包括 provider configure/test/suspend/revoke,Device posture view/refresh,以及 provider webhook ingestion。Webhook 必须验签、去重、限制 tenant scope 并记录 source revision。
ns 对本地事实的签名上报;Service/Endpoint 是 declaration 被批准后的正式 Network 资源。删除 Service 不删除 LocalManifest。
用户设备/普通服务器的 accept 必须由 Runtime Owner/本地管理员签名;受管服务器仅在本地 ManagedConfigAuthorization scope/revision 内 auto accept。超出范围返回 local_manifest_denied,NSD 不重试成更宽请求。
Runtime event 使用 publication.request/status;本地 API 使用 ns service request list/accept/reject。Publisher role Service projection、ServiceFlowCredential 和建流以 Data Plane Protocol §6 为准。
| 对象 | 权威 | 含义 |
|---|---|---|
| ShareOffer | provider Organization | v1 为具体 Service、动作、目标 Organization、期限 |
| FederationBinding | 两个 NSD deployment | 对端 key/endpoint/audience 信任,不授予资源 |
| ShareBinding | consumer Organization | 哪些本地主体/姿态可以使用 Offer |
| FederatedAccessLease | provider NSD 签发 | 两侧交集后的短期执行凭据 |
状态分别为 Offer=draft|offered|accepted|suspended|revoked|expired,Federation=pending|active|disabled|revoked,Binding=pending|active|suspended|revoked|expired。读取失败不改成 revoked。
首版协议只接受 resource_kind=service。跨 Organization Node 或 Route 返回 federated_resource_kind_unsupported;它们需要独立的 L3 peer identity、双端投影和路由冲突评审,不能通过复用 Service lease 偷渡实现。
share_id 和一次性 accept secret,Offer 链接包含 provider deployment URL、share ID 和 secret,不含资源目录;/.well-known/nsio-federation,交换 deployment signing key chain、capability range 和随机 challenge;Federation key 轮换使用交叉签名链;disable 只停新 lease并保留对象,disable_and_revoke 立即撤所有派生 lease,delete 仅在无 Offer/Binding/lease 后允许。
consumer NSD 不向 provider 发送 User/Group/Device 目录,只发送由当前 ShareBinding revision 生成的 opaque external_subject_id、posture result digest、binding revision 和短期证明。provider 按同一编译快照计算:
provider 签发 FederatedAccessLease,claims 包含 share/offer/binding/federation revision、opaque external subject、resource/action、audiences、projection digest、issued/expiry、credential ID 和 provenance。consumer NSD 只把它投影给本地已命中 ShareBinding 的 Membership。
访问 Service 时,consumer ns 为本次短期 federation path 生成会话公钥并经 consumer NSD 的 Binding proof 提交;provider NSD 验证后签发 source_kind=federated_binding 的 ServiceFlowCredential,绑定 opaque external subject、source_session_key_hash、目标 Service/Endpoint、publisher audience、Binding/Offer revision 和最长五分钟有效期。consumer ns 在 carrier transcript 证明持有对应私钥,publisher 按数据面协议 §6本地验签。provider runtime 不看到消费方 User/Group/Device/Membership ID,建流不查询任一 NSD。
Offer/Binding/Federation 任一 revoke 立即停签 FederatedAccessLease 与派生 ServiceFlowCredential,并增量撤销。双方收到同一 opaque share ID 的 tombstone;对方控制面不可达时旧凭据最迟 5 分钟失效。Provider 资源关闭先通知 consumer 并保留审计 tombstone,不能显示“从未分享”。
Provider:/share-offers create/preview/send/suspend/revoke;consumer:/share-bindings preview/accept/suspend/revoke;deployment:/federation-bindings verify/disable/disable-and-revoke/delete。所有动作带 expected revision、impact digest、step-up 和 audit。
所有 key rotation 使用独立 rotation_id:
Device Key 轮换用 current Device Key 或管理员 recovery approval 证明;Node/WG Key 按 Membership 独立轮换。私钥始终在 ns 安全存储。prepared key 不成为 active identity,直到双方 ACK 和 activation epoch。
Organization-owned Device 转让先 impact preview:旧 assigned principal 的 Membership、temporary access、sessions、Service publication 和 managed config。提交事务撤旧 assignment/Membership 派生、停签旧 lease并创建新 assignment decision;节点轮换 Node/WG key 后才能恢复 active。Device ID/资产审计保留,旧 principal 不能在新 key 激活前继续使用。
user-owned Device 不直接转让;使用 revoke + 新 principal 重新 Enrollment。OS 本地 Runtime Owner Binding 与远端 owner/assignment 是不同对象,两边都必须成功才能控制 user-owned runtime。
API 位于 /devices/{id}:rotate-key、/memberships/{id}:rotate-node-key、/devices/{id}:reassign,均返回 operation、phase 和 per-target ACK 状态。
该能力以现有 NSIO 已交付的 Public Application 与 Edge 认证实现为主要工程复用来源,不按“六种认证从零研发”估算。现网实现已经证明认证 handler、verifier、Envoy/NSGW 接入和 fail-closed 基础可行;Next 的新增工作是把这些成熟模块映射到以下 v1 对象、签名的 target-minimal projection、局部求值、统一会话撤销索引和 ServiceFlow 后端契约。Next 不继承旧线格式或数据库对象,复用模块仍须通过新的跨进程 fixture,现网测试证据不能替代 Next 集成证据。
工程拆分必须保持以下边界:
| 分类 | 处理方式 |
|---|---|
| method handler、credential verifier、OIDC callback、API Key/mTLS/Signed URL 基础能力、Anonymous fail-closed、Envoy/NSGW listener/WAF | 优先复用并做契约适配,不重写算法 |
PublicApplication/EdgeAuthPolicy/IngressBinding v1 对象、签名 policy projection、EdgeSessionCredential、跨 method 撤销索引 | Next 集成工作 |
IngressBackendCredential、最小 Service publisher projection、NSGW → ns ServiceFlow | Next 数据面工作 |
| 旧数据库记录、旧 wire payload、旧 subject string 或兼容 decoder | 不进入 Next runtime;只可作为测试/迁移参考 |
因此 Edge 方法矩阵本身不是本阶段最高风险的新协议;Relay、ServiceFlow 和 L3 candidate/roaming 仍先固定线格式。Edge 开工可以并行复用成熟实现,但只有对象、投影、会话和后端数据链全部接通后,Public Ingress 才算闭环。
Application=draft|validating|active|suspended|retired,Binding=pending|staging|active|draining|revoked|failed。DNS ownership、certificate、policy、Binding projection、gateway runtime 和 backend availability 是独立轴;其中任何一个失败都不能改写其它对象状态。PublicApplication 只能引用已存在 Service,API 拒绝任意 backend IP/port。
| Method | NSD 权威/签发 | NSGW 本地验证 | 关键绑定 |
|---|---|---|---|
oidc | IdP connector、client/secret reference、claims mapping、policy revision | state/nonce/PKCE callback、issuer/JWKS、ID token、redirect URI、session cookie | application、host、return path、issuer/subject、auth_time/amr/acr |
api_key | 一次展示高熵 secret;仅保存 hash + key ID/scope/expiry | constant-time hash verify;明文不进入日志 | application、method/path scope、expiry、optional network condition |
service_credential | MachinePrincipal/OAuth client 换最长 15 分钟 signed token | issuer/key/audience/scope/jti/expiry | application、MachinePrincipal、credential ID |
signed_url | signer config/key version;签发 path+method+query digest+expiry+nonce+max uses | canonical request 重算签名和 replay/uses 检查 | application/host、精确 path/method、expiry、nonce |
mtls | trust bundle、SAN/principal mapping、revocation source/revision | TLS chain、EKU、SAN mapping、CRL/OCSP freshness | application、MachinePrincipal/cert ID |
anonymous | 显式 policy rule | 无 identity credential,但仍执行 host/path/method、TLS/WAF/rate/audit | application + policy revision |
未知 method、缺少必需 verifier、过期 JWKS/CRL 无 last-valid 或 policy revision 不匹配时,NSGW 返回 edge_auth_configuration_unavailable/503;不能回落 Anonymous。API Key、OAuth client secret 和 signing private key 只在创建/轮换时展示或通过 secret provider 引用,普通配置 projection 不带明文。
EdgeIdentity、request、assurance 和 context 求值,不逐请求调用 NSD;EdgeSessionCredential:session ID、application、edge identity、IdP session、policy revision、assurance、issued/expiry、credential ID;cookie 为 Secure+HttpOnly+SameSite,作用域限定 application host/path;API 最小集合:
| Path | 操作 |
|---|---|
/public-applications | create/list/get/update/validate/suspend/retire/impact |
/edge-auth-policies | create/simulate/publish/rollback/suspend |
/public-applications/{id}/bindings | create/stage/activate/drain/revoke |
/public-applications/{id}/api-keys | create/list-metadata/rotate/revoke |
/public-applications/{id}/signed-urls:issue | issue scoped URL; never list secret token |
/edge-sessions | scoped list/revoke by app/policy/binding/identity/credential/IdP session |
创建/变更流程为 impact preview → AdminRoleBinding/step-up → Entitlement/CapabilityActivation → DNS ownership/certificate/verifier validation → Binding staging/health → atomic active → DNS enable。首次失败不发布 DNS;更新失败保留未过期旧 revision。API Key/signing key/IdP secret 轮换使用 prepared/dual-valid/activate/retire,有界重叠不允许跨 application。
NSGW 获得 target-minimal policy/verifier/secret references 和撤销索引,不获得租户完整用户目录。访问后端使用 IngressBackendCredential 与 Service publisher projection,详见数据面协议 §8.3。
| Code | Retryable | 原因 |
|---|---|---|
group_nesting_unsupported | false | 首版拒绝嵌套 Group |
directory_sync_read_failed | true | Group/成员同步读取失败 |
admin_authorization_read_failed | true | 管理权限无法求值 |
access_request_not_eligible | false | 已读取并明确不满足申请策略 |
access_request_evaluation_failed | true | 申请策略读取/求值失败 |
approval_revision_changed | true | 审批依据已变化 |
capability_not_eligible | false | CapabilityPolicy 不允许申请 |
activation_quota_limit_reached | false | 实例批准会超过 quota |
feature_not_entitled | false | 当前 Entitlement 无此能力 |
machine_credential_invalid | false | Workload credential 无效 |
posture_stale | true | 需要的 claim 已过期 |
posture_provider_unavailable | true | Provider 不可用 |
local_manifest_denied | false | 节点本地拒绝远程 publication |
federation_trust_failed | false | Federation transcript/key/scope 无效 |
federated_resource_kind_unsupported | false | v1 只支持跨组织 Service 分享 |
share_binding_outdated | true | Offer/Binding revision 不一致 |
key_rotation_incomplete | true | 一端未准备或未 ACK |
last_owner_required | false | 操作会移除最后 Organization owner |
edge_auth_method_unsupported | false | method 不在已协商安全集合 |
edge_auth_configuration_unavailable | true | verifier/policy/JWKS/CRL 无可用有效版本 |
edge_credential_invalid | false | API key/token/cert/signed URL 无效或越界 |
edge_session_revoked | false | session/identity/policy/binding 已撤销 |
public_application_backend_required | false | PublicApplication 未引用有效 Service |
每个对象必须记录 actor/proof/assurance、before/after revision、Policy/provenance、approval、quota、projection operation、result/error 和 request ID。审批待办、即将过期、撤销和 provider 故障产生 durable notification intent;通知失败不回滚权威事务。
完成需要: