ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

KubeEdge CloudCore 授权增强:为 CloudHub WebSocket API 实现节点级访问控制

KubeEdge CloudCore 授权增强:为 CloudHub WebSocket API 实现节点级访问控制 KubeEdge CloudCore 授权增强为 CloudHub WebSocket API 实现节点级访问控制【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedgeKubeEdge 的 CloudCore 是边缘节点与 Kubernetes API Server 之间的桥梁但在默认情况下它无法限制某个边缘节点对集群资源的访问范围。本文基于 KubeEdge 社区的设计提案sig-security 组讲解 CloudCore WebSocket API 的授权增强方案读者将理解如何通过 X509 客户端证书认证识别节点身份、如何复用 API Server 的授权链Node 授权模式约束节点的 K8s 资源操作以及如何通过authorization配置项分阶段先 debug 观察、再强制拒绝安全地在生产集群启用该能力。背景与目标提案 cloudhub-enhancement.md 指出的核心问题CloudCore 作为边缘节点访问集群资源的入口缺少某个节点只能操作自己相关资源的访问控制。为此社区规划了分阶段目标Alpha 阶段支持节点node授权模式。CloudCore 可以阻止一个边缘节点操作属于其他边缘节点的资源计划在 1.18 版本前落地Beta 阶段支持 RBAC 授权模式允许用户通过 RBAC 配置限制对自定义资源的访问实现细节当时仍在讨论。从当前仓库源码看Alpha 阶段已经完整实现授权逻辑集中在 authorization 包 中由cloudhubAuthorizer承担消息准入AdmitMessage与连接认证AuthenticateConnection两个职责。身份认证用 X509 客户端证书识别节点与 CloudCore 建立 WebSocket 连接时EdgeCore 必须提供由 CloudCore 签发的 X509 客户端证书。CloudHub 通过校验客户端证书并解析其Subject字段中的Common Name来识别不同节点。源码中这一步由cloudhubAuthorizer.authenticateConnection完成其实现要点可以对照 authorizer.go从连接 TLS 状态中取出PeerCertificates要求恰好只有一张客户端证书不提供证书或提供中间证书链均被拒绝使用 CloudHub 启动时加载的 CA 证书构建根证书池x509.DefaultVerifyOptionshubconfig.Config.Ca并用x509.CommonNameUserConversion把证书 CN 转换为 API Server 用户身份关键校验证书 CN 必须等于system:node:nodeIDkubeadm 的NodesUserPrefix 连接头中的node_id否则以 common name of peer certificate didnt match node ID 拒绝该连接。CA 证书的来源在 config.go 的InitConfigure中CloudCore 从配置项TLSCAFile/TLSCAKeyFile/TLSCertFile/TLSPrivateKeyFile读取并缓存 CA 与自身证书且要求 CA 与 CA Key 必须成对出现否则直接退出Both of ca and caKey should be specified!。授权设计复用 API Server 的授权链CloudHub 的多数 API 最终要读写 K8s 资源。提案的设计思路是复用 API Server 现有的授权机制而不是另起炉灶对直接操作 K8s 资源的请求利用User Impersonation覆盖请求用户身份把请求方降权为system:node:nodeID用户、system:nodes组再交由 API Server 的授权链裁决API Server 提供多种授权模式Node、ABAC、RBAC、Webhook其中NodeAuthorizer实现的 Node 模式可以阻止节点读取与其上部署的 Pod 无关的资源多个授权器通过unionAuthzHandler组织成链部分 CloudHub API 不直接访问 K8s 资源如 KubeEdge 自定义消息因此还需要一个 KubeEdge 自定义资源授权器来绕过放行授权链中无法识别的请求。授权链的组装config.go 中的assembleAuthorizer展示了实际的链组装方式遍历配置的授权模式当前实现了三种Node模式构建node.Graph注册 Node / Pod / PersistentVolume / VolumeAttachment 的 Informer 事件处理器创建node.NewAuthorizer(graph, nodeidentifier, bootstrappolicy.NodeRules())——即完整复用 Kubernetes 的节点授权图AlwaysAllow/AlwaysDeny模式分别对应NewAlwaysAllowAuthorizer/NewAlwaysDenyAuthorizer无论配置了哪些模式kubeedgeResourceAuthorizer都会被追加在授权链尾部源码注释put kubeedgeResourceAuthorizer at the tail of authorizer chain to allow kubeedge custom messages最后通过union.New(...)合并为一个 union 授权器如果未配置任何模式getAuthConfigcloudhub.go会回退为AlwaysAllow保证默认行为不变。KubeEdge 自定义资源授权器kubeedge_resource_authorizer.go 中的kubeedgeResourceAuthorizer逻辑很直接若请求属性带有kubeedgeResource标记Extra 字段直接DecisionAllow否则返回DecisionNoOpinion并说明原因避免误伤非 KubeEdge 的自定义请求。哪些消息被判定为 KubeEdge 资源 由 resource_attributes.go 的isKubeedgeResourceMessage定义包括特定操作类型Response/ResponseError/Upload、任务相关操作TaskPrePull、TaskUpgrade、心跳OpKeepalive特定来源metaserver 来源、设备孪生ResTwin相关资源特定资源K8s CA、卷Volume资源、规则状态RuleStatus以及批量更新 Pod 状态PodStatus 且无资源名这类 KubeEdge 特有的节点上报行为。消息到 API 请求的属性映射被判定为内置 K8s 资源的消息会经由getBuiltinResourceAttributes映射为标准的 K8sResourceAttributesnamespace / verb / group / version / resource / subresource / name映射关系见 resource_attributes.go 中的resourceTypeToKubeResources表例如beehive 消息资源映射的 K8s 资源说明nodestatusnodes/status集群级子资源podstatuspods/status命名空间级子资源configmap/secretconfigmaps/secrets命名空间级资源serviceaccounts/tokenserviceaccounts/tokenQuery 操作映射为create动词persistentvolume/volumeattachment对应集群级资源供节点授权图评估nodepatch/podpatchnodes/status/pods/status更新走 status 子资源leaseleasescoordination/v1心跳租约csrcertificatesigningrequests证书签发请求几个值得注意的实现细节消息资源串按namespace/resourceType/resourceName三段解析splitResource不足三段时补空串对Insert操作若目标是podstatus/nodestatus会改写为对应的pod/node资源——因为节点上报状态实质上是创建/更新该 Pod/Node 的状态最终组装出SubjectAccessReviewSpecUser 固定为system:node:nodeID、Groups 为system:nodes即实现提案所说的User Impersonation无论消息实际来自哪个进程授权裁决都以该节点身份进行。两个准入点连接认证与消息放行授权器被插入 CloudHub 的两个关键路径见 message_handler.go连接建立时HandleConnection首先调用authorizer.AuthenticateConnection(connection)认证失败直接拒绝节点无法进入会话管理SessionManager与消息池初始化流程每条上行消息时HandleMessage调用authorizer.AdmitMessage(message, hubInfo)被拒绝的消息记录错误日志后丢弃不会进入MessageDispatcher.DispatchUpstream。AdmitMessage的内部流程authorizer.go将 beehive 消息路由Router映射为authorizer.Attributes用request.WithUser(ctx, attrs.GetUser())把节点身份注入上下文调用 union 授权器Authorize仅当决策为DecisionAllow才放行其余均按node %q deny: %s拒绝。配置说明提案中给出的配置草案为kubeAPIConfig: ... modules: cloudhub: authorization: // optional, default false, toggle authorization enable: true // optional, default to false, do authorization but always allow all the requests debug: false // required, an authorizer chain authorizers: // node authorization mode - node: enable: true对应到当前仓库已实现的配置类型cloudcore/v1alpha1/types.go 中的CloudHubAuthorization字段语义保持一致enablebool默认false总开关关闭时AdmitMessage与AuthenticateConnection直接返回 nil不做任何校验debugbool提案中默认false开启只记录不拦截——授权失败时仅打印错误日志请求照常处理。这是提案推荐的灰度手段modes列表默认node授权链成员当前支持node内部还有alwaysallow/alwaysdeny兜底。默认值定义在 default.goAuthorization.Enablefalse、Debugtrue、Modes[{node: {enable: true}}]。也就是说出厂状态下授权功能整体关闭且默认带有 debug 行为——即使显式打开enable后若忘记把debug改为false系统也只会告警不会拦截。一个最小启用示例cloudcore 组件配置modules: cloudhub: authorization: enable: true debug: false modes: - node: enable: true开启后建议先以enable: true, debug: true观察日志确认没有误伤正常上报如节点状态、Pod 状态、心跳后再关闭debug。兼容性与升级注意事项提案的 Compatibility 部分给出三条约束在实施源码中均能得到印证默认关闭该特性默认禁用未配置的存量部署行为完全不变enabledfalse时两个入口直接放行依赖证书 Common Name该特性依赖客户端证书的Common Name识别节点。旧版本1.16的 EdgeCore 可能尝试创建 CN 相同的证书升级场景下可能需要手动生成新的客户端证书并替换旧证书debug 模式安全过渡切换debug开启后授权失败时 CloudCore 只记录日志、请求照常执行适合先观察再收紧。测试覆盖方面authorization 包 为连接认证、消息准入、属性映射、KubeEdge 资源判定分别提供了单测如 authorizer_test.go、resource_attributes_test.go可用于验证节点身份不匹配、无证书、中间证书、未知资源类型等边界场景的行为。小结KubeEdge 通过这条演进路线把 CloudCore WebSocket API 从边缘节点直通集群资源收紧为以system:node:nodeID身份逐条消息裁决认证层面X509 客户端证书 CN 与 node_id 严格比对杜绝节点冒充连接授权层面复用 API Server 的 Node 授权图与 union 授权链K8s 资源请求按标准资源属性裁决KubeEdge 自定义消息心跳、设备孪生、任务、卷、规则状态等由尾部放行器兜底运维层面enable/debug两级开关 默认关闭的保守默认值支持先观察后拦截的平滑灰度。相关代码入口cloud/pkg/cloudhub/authorization/、cloud/pkg/cloudhub/handler/message_handler.go、cloud/pkg/cloudhub/cloudhub.go、cloud/pkg/cloudhub/config/config.go提案原文见 docs/proposals/sig-security/cloudhub-enhancement.md。【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表