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 策略的配置是否严格。