Technical documentation

Kubernetes 普通用户能直接创建吗?答案是否定的:人账号与机器账号必须隔离

Kubernetes 普通用户能直接创建吗?答案是否定的:人账号与机器账号必须隔离

Kubernetes 严格隔离人与机器身份,普通用户无法直接创建面向人的账户,以此防止人员凭证与进程访问混同引发共享密钥风险。

Kubernetes 普通用户能直接创建吗?答案是否定的

在 Kubernetes 集群中,普通用户无法通过 API 直接创建面向人的账户,这是基于安全架构的刻意设计而非功能缺失。

在 Kubernetes 集群中,你无法像新建一个 ServiceAccount 那样,通过 API 命令直接创建一个面向人的“普通用户”账户。这并非系统功能的缺失,而是基于安全架构的刻意设计。

为什么不能像创建 ServiceAccount 那样创建人账号?

Kubernetes 将两类身份彻底拆开了。ServiceAccount 是专为工作负载设计的动态主体,它由 API 管理,拥有命名空间作用域,随 Pod 的部署边界和运行上下文自动流转 [1][2]。

普通用户则完全不同。它们属于集群外部或静态配置,不由 K8s API 的生命周期管理。系统刻意将人与机器身份区分处理,避免把人员账户、共享静态密钥与进程访问混为同一套模型 [1][2]。这种隔离不是功能缺失,而是工程上的必要防线。

特征维度 ServiceAccount (机器) 普通用户 (人类)
创建方式 通过 Kubernetes API 动态创建 不通过 API 创建,属外部实体
作用范围 命名空间级别 (Namespace-scoped) 集群级别 (Cluster-scoped)
生命周期 随工作负载部署/销毁而变动 独立于集群资源,静态存在
主要用途 供 Pod 内进程认证与授权 供运维人员登录与管理
密钥管理 挂载到 Pod,由系统轮换 依赖外部证书或 OIDC 协议

如果你试图用创建 ServiceAccount 的逻辑去操作人账号,会发现根本找不到对应的入口。这种设计强制要求:机器身份必须依附于具体的运行环境,而人员身份必须保持独立且可追溯。混淆这两者,就是给共享密钥风险敞开了大门。

值得注意的是,许多初学者常误以为可以通过 kubectl create user 这样的命令来创建人账号,实际上这个命令并不存在。更深层的误解在于认为“只要我有管理员权限,我就能在 K8s 内部定义任何人”。事实是,K8s 的 User 对象在概念上只是一个指向外部身份提供商(IdP)的引用标签,而非存储凭证的容器。真正的凭证生成和验证过程完全发生在集群之外,K8s 只负责信任外部返回的身份断言。

Kubernetes 机器账号怎么创建:身份与授权的分离逻辑

Kubernetes 将身份验证与授权分离,先确认实体身份再决定其权限,确保拥有凭据仅代表获得入场资格而非随意操作能力。

Pod 里的进程能直接调用 API Server,靠的是它绑定的 ServiceAccount。但拿到凭据只是拿到了“入场券”,并不代表能随意进出所有房间。Kubernetes 把这件事拆成了两步走:先确认你是谁,再决定你能干什么。

两段式结构如何降低安全风险

第一步是认证。当 Pod 发起请求时,系统会检查其携带的 ServiceAccount 令牌是否有效。一旦通过验证,这个请求就被打上 system:authenticated 的标签 [1][2]。这一步只解决了一个核心问题:确保每个请求都有明确的来源,杜绝了匿名或伪造主体的攻击。如果缺乏这一层,任何外部攻击者都可以伪装成内部服务发起操作。

第二步是授权。光有身份还不够,RBAC(基于角色的访问控制)会立刻介入,根据预设的策略判断该主体具体能对哪些资源执行什么动作 [1][2]。这就好比保安虽然核验了你的身份证(认证成功),但能否进入财务室,还得看你的工牌权限(RBAC 授权)。取得 ServiceAccount 凭据不等于获得任意 API 权限,认证环节回答“是谁”,RBAC 环节才回答“能做什么”[1][2]。

这种分层设计划清了治理边界。身份层负责消除“无主体请求”的风险,让所有流量可追溯;授权层则严格控制爆炸半径,防止因凭据泄露导致整个集群沦陷。若审计时只盯着“可认证”状态,却忽略了 RBAC 绑定,就会误以为持有凭据就等于拥有最小权限,从而埋下隐患 [1][2]。

为了更直观地看清这两层的分工,请看下表对比:

对比维度 身份层 (认证) 授权层 (RBAC)
核心任务 确认请求方身份真实性 判定身份的具体操作范围
输出结果 标记为 system:authenticated 允许/拒绝特定资源访问
依赖数据 ServiceAccount 令牌 RoleBinding / ClusterRoleBinding
风险防控 防止匿名访问与伪造源 限制凭据泄露后的破坏力
失效后果 无法建立可信连接 拥有凭据也无法越权操作

整个流程就这样协同运转:API Server 先由身份层过滤掉不可信的请求,再由授权层对剩余请求进行细粒度裁剪。这种机制确保了即使 ServiceAccount 凭据被窃取,攻击者也只能在该账户被明确授予的最小范围内活动,无法像普通用户那样因账户混同而引发连锁反应。

为何要将人与机器身份隔离:避免共享密钥风险

隔离人与机器身份旨在避免静态密钥无限共享,防止单一账号泄露导致攻击者控制整个集群业务而非仅影响单个人。

若把人员账户和进程访问混为一谈,最大的隐患就是静态密钥的无限共享。[1][2] 这种设计缺陷会让一个账号变成所有相关进程的“万能钥匙”。一旦有人离职或账号泄露,攻击者就能拿着这把钥匙控制整个集群里的业务,而不是仅仅影响单个人。

工程上必须明确:工作负载的身份应随部署边界和运行上下文动态管理。[1][2] 人账号是固定的,但应用实例随时在变。如果把两者绑定,等于让人的身份去背负机器的变动成本。ServiceAccount 天生属于命名空间,专为 Pod 内的进程而生;普通用户则无法通过 API 直接创建,只能由管理员手动维护。[1][2] 这种区分不是技术炫技,而是为了切断“人”与“事”的强耦合。

当人员流动时,如果凭证没有隔离,风险会瞬间扩散。

场景 混合身份模型(错误) 隔离身份模型(正确)
人员离职 需回收所有关联服务的密钥,否则全员失守 仅撤销该人员的人账号权限
服务重启 可能误用旧人员凭据导致审计混乱 自动获取新的 ServiceAccount 令牌
故障排查 难以区分是人为操作还是程序异常 日志清晰指向具体应用主体
权限变更 调整一人权限波及所有依赖进程 仅需修改对应 RBAC 绑定

最佳实践很直接:坚持“一人一身份、一应用一凭证”。[1][2] 不要试图用一个账号既代表运维工程师,又代表后台微服务。认证只是第一步,它回答“你是谁”,RBAC 才决定你能做什么。[1][2] 只有把人和机器彻底分开,才能确保即便某个进程被攻破,攻击范围也局限在该应用的命名空间内,不会顺着人员关系链蔓延到整个集群。

这里有一个常被忽视的操作细节:在大规模集群中,很多团队习惯让开发人员使用同一个高权限的 ServiceAccount 来调试生产环境。这种做法看似方便,实则破坏了“一应用一凭证”的原则。正确的做法是,即使是临时调试,也应创建一个临时的、权限受限的 ServiceAccount,并在调试结束后立即删除。这样既能满足开发需求,又能确保凭据不会长期暴露在高风险环境中。

审计误区警示:别把‘可认证’误作‘最小权限’

审计不能仅凭有效 Token 认定合规,拥有凭据只代表通过身份验证进入系统,并不代表具备最小权限或特定资源访问权。

很多审计动作停在第一步就草草收场:看到 Pod 里拿着有效的 ServiceAccount Token,便认定身份合规。[1][2] 这就像检查进小区的门禁卡有效,却忘了确认持卡人是否有权进入那栋具体的楼。在 Kubernetes 体系里,拥有凭据只代表通过了“你是谁”的验证,系统随后将其归入 system:authenticated 组,但这仅仅是入场券。[1][2]

真正的风险往往藏在第二步——授权。认证回答的是身份来源,RBAC(基于角色的访问控制)才决定爆炸半径。[1][2] 一个进程可能持有合法的证书,但若 RBAC 策略配置宽泛,它就能执行删除节点、读取所有命名空间等高危操作。只盯着身份层,会天然忽略授权层的漏洞,导致“可认证”被错误地等同于“最小权限”。[1][2]

要落实最小权限原则,必须将身份与授权作为整体审视。以下是两个关键阶段的对比:

阶段 关注点 常见误区 正确做法
身份层 凭证有效性 认为 Token 有效即安全 确认主体是受控的 ServiceAccount
授权层 权限范围 忽略 RBAC 绑定关系 验证具体资源与动作的匹配度

这种两段式结构是 Kubernetes 设计的必然要求。[1][2] 身份层负责降低“无主体请求”的风险,防止匿名者随意接入;而授权层则像一把精确的手术刀,切割出每个主体能触及的边界。[1][2] 若审计流程割裂这两步,就会得出虚假的安全结论。这一判断并非对所有认证器或授权器实现的普遍保证,而是针对 Kubernetes 特定工作流的结构性推论。[1][2]

最终,安全不是靠单一环节的死守,而是身份验证与授权控制的紧密咬合。只有同时锁死“谁在请求”和“允许做什么”,才能真正消除共享密钥带来的隐患。

FAQ:关于 Kubernetes 身份管理的常见问题

Q: 既然普通用户不能通过 API 创建,那我该如何添加一个新的运维人员? A: 你需要在集群外部的身份提供商(如 LDAP, OIDC, 或云厂商 IAM)中创建该用户,并在 Kubernetes 的 kubeconfig 或 CertificateSigningRequest 中配置映射关系。K8s 本身不负责生成这些人员凭证,它只负责验证。

Q: ServiceAccount 和普通用户在权限上有什么本质区别? A: ServiceAccount 的权限通常局限于特定的命名空间,且随着 Pod 的生命周期动态变化;而普通用户的权限通常是集群级别的,且需要人工定期审查和更新。混淆两者会导致权限失控。

Q: 如何防止 ServiceAccount 被滥用? A: 除了启用 RBAC 限制其最小权限外,务必监控 system:authenticated 组的异常行为。记住,拥有 Token 不代表拥有最高权限,关键在于 RBAC 策略的配置是否严格。


参考来源

  1. Authenticating | Kubernetes · https://kubernetes.io/docs/reference/access-authn-authz/authentication/(A级)
  2. Managing Service Accounts | Kubernetes · https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/(A级)