NSIO Docs
NSIO Docs
首页

NSIO Next · 当前开发基线

统一 L3 + L4 架构
产品能力目录与实现闭环
功能闭环总账
产品闭环与功能实现
实施蓝图与交付契约
发行、升级与卸载
跨组件共享契约
控制资源生命周期
控制投影与 Runtime Protocol
数据面协议
Grant 与策略编译

组件实现规格

ns · 统一节点运行时
Client · App、CLI 与门户
NSD · 身份与控制面
NSGW · 增值数据面
身份、登录与会话
注册、准入与配额协议
商业模型与 Entitlement
采购、计费与发票
服务运营与 SLA
备份与灾难恢复
信任、合规与数据权利

Last Updated: 2026/8/9 08:47:57

Previous Page数据面协议
Next Pagens · 统一节点运行时

#NSIO Next · PolicyKernel 与访问编译实现规格

本文定义 NSIO Next 的共享策略内核和 AccessGrant 编译语义。NSD 保存策略,生产执行器调用同一个 PolicyKernel;ns、Connector 与 NSGW 只执行目标投影;Client 只创作、预览和展示。任何仓库不得复制一套近似判定。

#1. 核心原则

  1. 默认拒绝,只存在 allow Grant;
  2. Organization 是管理边界,Network 是地址和信任边界;
  3. 用户身份、设备身份、Network Membership 和资源身份分开;
  4. AccessGrant 只覆盖 L3 Node、L4 Service、Route 和 ExitProfile;发布、Edge 访客与管理权限使用独立策略平面;
  5. 授权与可用性分离:允许不表示在线,离线不撤销允许;
  6. 源端快速拒绝,目标端/NSGW 最终执行;
  7. 每条允许可追溯到一个 GrantSet revision 和 GrantRule;
  8. 读取或编译失败不产生空授权 snapshot。

共享的是 PolicyKernel,不是一个万能编译器:

生产消费者输入/输出形态
AccessCompilerAccessGrant → 每目标最小数据面投影
CapabilityCompilerCapabilityPolicy → 能力申请资格与审批约束
EdgePolicyEvaluatorEdgeAuthPolicy → 每次外部请求/会话判定
AdminAuthorizerAdminRoleBinding → 在线控制面管理判定

四者共同使用 selector resolution、condition evaluation、normalized AST、输入快照、provenance、revision/digest 和稳定错误;各自保留独立 evaluator/compiler version 与动作矩阵。

#2. 创作模型

管理员或个人用户看到的是一个 GrantSet:

{
  "grant_set_id": "gs_01",
  "name": "开发人员访问 Git",
  "network_id": "net_dev",
  "state": "draft",
  "expected_revision": 6,
  "subjects": [{"kind": "group", "id": "grp_developers"}],
  "sources": [{"kind": "device_posture", "value": "managed"}],
  "resources": [{"kind": "service", "id": "svc_git"}],
  "actions": ["invoke"],
  "constraints": {"protocols": ["https"]}
}

数组只服务于一次批量创作。服务端把 subjects × resources 规范化为单主体、单资源规则,并保留共同 grant_set_id。不能在运行时做模糊 M×N 展开。

#3. Subject Selector

kind匹配对象用途
userAccount/Organization principal指定一个人所有符合 source 条件的 Membership
group当前 Group revision 的成员团队授权
machine_principalService Account/Workload Identity自动化、服务器和工作负载调用
tagNSD 批准的 MachinePrincipal/Node tag服务器或运行主体集合
external_binding当前 revision 的 ShareBinding跨组织最小授权
self当前规则求值主体本人Personal 默认模板

self 是求值时展开到当前 User/MachinePrincipal 的宏,不是持久身份。Group、Tag 与 ShareBinding 展开由 NSD 完成并携带对应 revision。Device、NodeMembership、设备本地名称、邮箱字符串或客户端自报标签不能成为 authoring subject;NodeMembership 只作为编译后的运行时源身份。

#4. Source 条件

Subject 回答“谁”,source condition 回答“从哪台设备和什么环境”:

条件示例权威
Membership/Device公司笔记本、组织所有、受管状态NSD Device/Membership
Network仅从开发 NetworkNSD
posturemanaged、encrypted、supported OS映射后的 MDM/Posture provider
time工作时间、到期日NSD time authority
path/via必须经企业 Connector/Exitsigned runtime/gateway projection

Posture 未知、过期或读取失败不满足要求。Personal 可使用 Device/Network/time 等核心条件;受管 posture 依赖企业治理能力。

#5. Resource Selector

kind匹配资源支持的 action
nodeNode/Membershipconnect
serviceService IDinvoke
routeSubnet/Application Routeuse_route
exit_profileGateway/Profile or exit resourceuse_exit

Service tag 与 Node tag 是不同 namespace;一个 tag selector 必须声明资源 kind,不能因同名同时命中节点和服务。

PublicApplication 由 EdgeAuthPolicy 管理,Service/Route/Gateway 能力声明由 CapabilityPolicy + CapabilityActivation 管理,租户管理对象由 AdminRoleBinding 管理;它们不进入 AccessGrant Resource Selector。

#6. Action 与协议约束

#6.1 Node connect

约束可包含 ICMP、TCP/UDP、端口范围。未写协议表示该资源定义允许的全部 L3 协议,不表示管理员权限。

#6.2 Service invoke

约束作用于 Service 的公开协议/端口,不作用于 backend 原始地址。用户获得 HTTPS Service 不获得承载节点 443 端口的通用 Node 权限。

HTTP path/method/header 等 L7 约束只允许用于 http 或 https_terminated,且由受信任 Service proxy/NSGW 终结并最终执行。tcp、原始 TUN 连接与 tls_passthrough 看不到 HTTP path;Compiler 必须以 constraint_not_enforceable 拒绝这种 Grant,不能生成“看起来已受保护”的投影。TLS passthrough 的 SNI 约束也只有在受信任 parser 能证明完整握手语义时才允许。

#6.3 Route use_route

Grant 可以进一步收窄批准 Route 的 CIDR/domain,但请求范围必须逐项等于或被 advertised 范围包含;Default Route 是否可承载 CIDR 请求按明确协议规则处理,Client 不重写。

#6.4 Exit use_exit

绑定具体 Gateway/Profile 或可选资源集合。Grant 只决定候选资格,selection 与运行时健康是独立状态。

#7. Constraint 规范化

  • protocols 规范化为小写已知枚举并排序去重;
  • ports 合并重叠区间,拒绝 0、越界和协议不适用端口;
  • CIDR 解析为网络地址/前缀,禁止字符串比较和隐式超集;
  • path 标准化但不解码后重写安全语义;
  • time 保存 UTC 和明确 timezone policy;
  • posture 引用 provider-mapped claim ID,不保存自由文本;
  • 空 constraint 与省略的含义由 action schema 定义,不能由各消费者猜。

未知 constraint 在当前 major 下拒绝发布,不静默忽略安全条件。

#7.1 可执行性矩阵

每类资源声明 enforcement_capabilities,Compiler 在发布事务中逐项验证 constraint 可由最终执行点观察并强制。安全条件不能只在源端 Client 检查。

条件NodeService TCP/UDPService trusted L7RouteExitEdge
protocol/port双端publisher 最终执行proxy 最终执行Connector 最终执行NSGW scope 执行listener 执行
HTTP host/path/method不支持不支持支持不支持不支持支持
Device/Posturecredential + 目标端credential + publishercredential + proxycredential + Connectorselection lease + NSGW仅有可信 device signal 时支持
time/expiry短租约 + 目标端短 flow credentialsession/requestRoute credentialExit leaserequest/session
exact CIDR/domainCIDR 仅 L3Service IDService/hostConnector 投影;DomainRoute best-effortprofile scopeapplication host/path

若目标执行器版本不支持某条件,版本协商只能拒绝或不提供该能力,不能删除条件后降级执行。

#8. 规范化与发布事务

  1. 验证 actor 具有创建/发布权限;
  2. 加载 expected revision 下的所有 selector/resource;
  3. 校验 action-resource 合法矩阵;
  4. canonicalize selector、action、constraint;
  5. 展开为 GrantRule,但保留 selector 引用而非永久复制 Group 成员;
  6. 编译 before/after 两份授权集合;
  7. 生成 impact summary 和 digest;
  8. Client 展示新增/移除访问与高风险提示;
  9. 确认请求绑定 digest、step-up/approval;
  10. 单事务写新 immutable revision、active pointer、outbox、audit;
  11. Compiler 从 committed revision 生成目标 projections。

发布后 Group/Device/Posture 变化会产生新的 effective input revision 和 projection,但不篡改 GrantSet 历史。

#9. 编译输入快照

一次编译固定读取:

policy_revision
directory_revision
resource_revision
health_revision
posture_revision
share_revision
entitlement_revision
policy_schema_version
kernel_version
evaluator_kind
evaluator_version
compiler_build_id

输入引用不存在、revision 不一致或数据库读取失败时整次编译失败。Compiler 不混用“规则是 revision 8、Group 是更新一半的 revision 9”这种非一致视图。

#10. 命中算法

对每个候选 (principal, source_membership, resource, action):

same Network/security scope
AND subject selector matches principal
AND source condition matches Device/Membership/Posture/Time
AND resource selector matches exact resource kind/id/tag
AND requested action is included
AND protocol/port/CIDR/path constraints include the request
AND all referenced leases are valid
→ allowed with provenance(policy schema, kernel, evaluator, compiler, grant set/rule, revisions, digest)

多条命中是同一 Network 内 allow union:任一完整规则允许即可。Union 只表示本机同时可达多个被允许资源,不允许把 Network A 的授权用于 Network B,也不允许节点转发形成跨 Network bridge。

#11. 每目标最小投影

#11.1 Node

源 Membership 获得可能访问的 peer/netmap 和 egress rule;目标 Membership 获得允许来源的 ingress rule。两端用相同 compiled rule/provenance。

#11.2 Service

消费者只获得被授权 Service 目录、VIP、健康 endpoint token 和 egress rule;publisher/NSGW 只获得该 Service 的允许消费者范围或短 flow token 校验材料,不获得完整用户目录。

#11.3 Route

只有批准且 Grant 命中的 Route 进入客户端 projection;无授权 Route 不进入 route table 候选。每条 Route 必须生成双端投影:

  • 客户端侧:Route ID、精确目标、安装参数、Connector 候选、DNS/priority 和短期 RouteAccessCredential;
  • Connector 侧:允许来源、精确目的地、协议/端口、NAT mode、revision、expiry 和验签材料。

RouteAccessCredential 是自证签名令牌,至少绑定 issuer、Organization/Network、source membership、route ID、connector audience、generation、route_projection_digest、grant rule、input revision、kernel version、issued/expires 和 credential ID。Connector 在本地验证签名、来源、audience、generation/digest 以及本次实际目的地,不在建流路径查询 NSD。两端缺任一投影或 digest 不匹配即 fail-closed。

DomainRoute 是按受控 origin DNS 解析结果安装 IP 路由的 best-effort L3 能力,可能覆盖共享 CDN/多租户 IP;控制台必须展示当前 IP、TTL 与冲突。需要精确 Host/SNI/path 语义时使用 DomainService/Egress Proxy,不能把 DomainRoute 宣称为严格应用授权。

#11.3.1 Route generation 切换

Connector 同时维护 current、next 和可选 previous generation,每代保留独立 digest、input revision、精确目的地、协议/端口、not_before/not_after 与 provenance,禁止把两代目的地集合合并。Compiler 对变化做语义分类:

变化行为
additive在有界窗口重叠,旧凭据只命中旧集合,新凭据只命中新集合
restrictive按 Network 的撤销策略切换
metadata-only不创建数据面 generation
mixed先执行 restrictive,再执行 additive

Network 默认 security_first:先把新投影 staging 到 Connector 并收 ACK,再给 Client 下发带 activation epoch/not_before 的凭据;到点拒绝旧 generation,未 ACK 的 Connector 移出候选,允许短暂 fail-closed。可选 bounded_drain 允许旧 generation 不超过 credential TTL,控制台必须显示旧权限最晚失效时间并写审计。NSD 只编排和签名,不进入流建立路径。

#11.4 Gateway

候选投影先过滤 use_exit/Service Grant,运行配置再绑定 selection、profile 和 scope。Relay path token 与租户 Grant 分开,不能把可 relay 误作可 Exit。

#12. 可用性不进入授权

Gateway offline、Service endpoint unhealthy、Node offline 会影响 availability 和路径选择,不删除 Grant。恢复健康时无需重新授权。反过来,资源健康也不能让未授权主体获得目录或路径。

管理端分别显示:Policy allowed、Resource available、Projection applied。不能压成一个 Active。

#13. 撤销与租约

Grant revoke 提交新 revision,Compiler 发布最小删除/新 snapshot,并使新 flow/session 立即拒绝。已建立连接按资源策略立即断开或短 drain;任何丢失事件的节点在 peer/flow lease 到期后强制失效。

默认企业身份撤销目标不超过 5 分钟,因此相关 peer/flow lease 不能长于 SLA。延迟超过 SLA 触发安全告警,不只记录普通 delivery lag。

撤销关键路径必须使用 subject/resource/selector reverse dependency index 生成定向 delta,不允许等待或退化成单 Network full compile。权威事务先提交 revocation_epoch/tombstone 并立即停止新 credential/lease 签发;在线目标收到定向删除投影后拒绝,漏投影目标由短租约硬上限收敛。Full compile 只在后台做一致性对账和修复,不能成为撤销生效的前置。依赖索引读取或 delta 生成失败时返回明确 security delivery error、保留 tombstone 并告警,不能撤回已提交的撤销或恢复旧签发。

#14. 分享与多 Network

跨组织 Service Share 的有效授权是 provider Grant、Share lease、consumer Binding/Grant 的交集。两边分别编译最小 opaque projection,不交换 Group、Device 或策略图。external_binding:<id> selector 展开与最终交集必须读取同一次编译快照中被 pin 的当前 Binding revision,不能一处用当前值、另一处用签发时旧快照。

首版 runtime 一次激活一个 Profile/主 Network。账号属于多个 Network 不意味着编译器把它们合成一个安全域;切换后重新获取对应 projection。

#15. Policy Simulation

模拟 API 输入 draft + sample/current principal/resource。它必须以 dry-run 调用对应的生产 AccessCompiler、CapabilityCompiler、EdgePolicyEvaluator 或 AdminAuthorizer;控制台和模拟服务不得维护第二套简化求值器。返回:

  • newly_allowed、newly_removed、unchanged 数量和分页对象;
  • 命中/未命中原因树;
  • 高风险提示(全节点、管理端口、Default Exit、Public Ingress);
  • 受影响在线 Membership 与预计撤销 SLA;
  • canonical digest 和有效期。

模拟结果不是授权。确认提交必须重新计算并比对 digest。

Effective Access 同样读取生产编译结果与 provenance,不在控制台重新求值。每个判定至少记录:policy_schema_version、kernel_version、evaluator_kind、evaluator_version、compiler_build_id、input_revision、grant_set_id、grant_rule_id、projection_digest。

PolicyKernel 或 evaluator 升级即使策略文本未变,也可能改变判定。上线前必须在同一租户和数据驻留边界内对旧/新版本做 shadow evaluation,输出新增、移除和状态变化;高风险差异需确认或 canary。启用后创建新的 effective revision、重投影并写 policy_engine_upgrade 审计。不能把完整身份图跨区复制给集中式影子服务。

#16. 稳定错误

code含义用户动作
grant_subject_not_found主体引用无效刷新并重选
grant_resource_not_found资源已删除/不可见刷新并重选
grant_action_invalidaction 与资源类型不匹配修改规则
grant_constraint_invalid协议/端口/CIDR 等非法修正字段
grant_impact_changed确认后权威状态变化重新预览
grant_approval_required需要审批/step-up完成审批
grant_compile_failed权威读取/编译故障保留旧投影、管理员重试
grant_projection_outdated节点仍执行已被更新 revision 取代的旧投影查看目标、旧/新 revision 和 request ID

“没有命中 Grant”是正常 deny 事实,不作为系统错误;Client 可在被允许披露时显示 not authorized。

#17. 示例

Clark 有 Mac 和 Windows 两个 Device,Bob 有 Laptop 和 Server:

  • subject=user:clark → resource=nodes:owned → connect:Clark 两台 Membership 可互访,不包含 Bob;
  • subject=user:clark → resource=node:bob-server → connect tcp/22:Clark 符合 source 条件的设备可 SSH Bob Server,其他端口拒绝;
  • subject=group:developers → service:git → invoke https:组员可打开 Git Service,但不能访问承载节点;
  • subject=user:clark + source_condition(device=corp-mac, managed=true) → service:finance → invoke:只允许 Clark 从指定受管电脑访问,个人 Windows 不匹配;
  • Bob 离职:撤 Bob 的 Organization Membership 后,Bob 作为 subject 的访问和其 user-owned Membership 在 SLA 内消失;Organization-owned Server Device 保留并重新指派。

#18. 测试与完成条件

  • selector/action/constraint 全矩阵表驱动测试;
  • CIDR 包含、端口边界、时区和 posture unknown;
  • 同一 Network allow union 与跨 Network 不合并;
  • Group/Device/Share/Posture revision 改变后的增量影响;
  • 精确 projection:多一个 peer/service/route/gateway 即失败;
  • Route 客户端/Connector 双投影、签名凭据、目的地校验和 NSD 断线建流;
  • additive/restrictive/mixed generation 与 security-first/bounded-drain 切换;
  • 源端放宽、目标端放宽和绕过本地 Manifest 的反向注入;
  • compile read failure 不生成空 snapshot;
  • revoke、丢事件、离线节点与 lease SLA;
  • simulation digest 和并发 revision;
  • 模拟与 Effective Access 必须复用生产实现,注入第二套判定时测试失败;
  • PolicyKernel shadow evaluation 不跨数据驻留边界;
  • 管理端/API/审计 provenance 可回到具体 GrantRule 和求值器版本。