云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:etcd常用配置参数
- Kubernetes控制平面组件:etcd高可用集群搭建
- Kubernetes控制平面组件:etcd高可用解决方案
- Kubernetes控制平面组件:Kubernetes如何使用etcd
- kubectl 和 kubeconfig 基本原理
- kubeadm 升级 k8s集群 1.17到1.20
- Kubernetes常见问题解答
- 查看云机器的一些常用配置
本文主要对 kubernetes API Server 认证机制中的 基于匿名请求的认证进行介绍,包括 匿名请求 的设计理念、实现原理、认证流程,以及在 Kubernetes 中的具体应用
1.基本概念
1.1.匿名请求定义
- 当客户端访问 Kubernetes API Server 时,若请求中 未携带任何认证信息(如证书、Token、Basic Auth 等),该请求会被标记为 匿名请求。
1.2.默认行为
- Kubernetes 1.6+:默认启用匿名请求认证(
--anonymous-auth=true
) - 身份标识:
- 用户名:
system:anonymous
- 用户组:
system:unauthenticated
- 用户名:
2.认证流程
+------------+ +--------------+
| Client | | API Server |
+------------+ +--------------+| 1. 无认证请求 ||-------------------->|| | 2. 认证链检查| |--+ | | | 所有认证方法失败| |<-+| 3. 标记为匿名用户 ||<---------------------|
3.操作示例
3.1.允许匿名请求(默认配置)
3.1.1.直接访问 API
# 不携带任何认证信息
curl -k https://<API_SERVER_IP>:6443/api/v1/namespaces/default/pods
响应示例:
{"kind": "Status","apiVersion": "v1","status": "Failure","message": "pods is forbidden: User \"system:anonymous\" cannot list resource \"pods\" in API group \"\" in the namespace \"default\"","reason": "Forbidden","details": { "kind": "pods" },"code": 403
}
说明:认证通过但授权(RBAC)拒绝
3.1.2.查看认证用户信息
kubectl create clusterrolebinding anonymous-access \--clusterrole=view \--user=system:anonymouscurl -k https://<API_SERVER_IP>:6443/api/v1/namespaces/default/pods
此时将返回 Pod 列表(需提前创建测试 Pod)
3.2.禁用匿名请求
3.2.1.修改 API Server 配置
# 编辑 /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver- --anonymous-auth=false # 添加此参数
3.2.2.验证禁用效果
curl -k https://<API_SERVER_IP>:6443/api/v1/namespaces/default/pods
响应示例:
{"kind": "Status","apiVersion": "v1","status": "Failure","message": "Unauthorized","code": 401
}
4.安全建议
4.1.生产环境推荐配置
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: deny-anonymous-access
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin # 根据实际情况调整
subjects:
- kind: Username: system:anonymousapiGroup: rbac.authorization.k8s.io
通过 RBAC 显式拒绝匿名用户的所有权限
4.2.审计配置
# /etc/kubernetes/audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadatausers: ["system:anonymous"] # 记录匿名请求审计日志
5.关键排查命令
# 查看 API Server 匿名认证配置
ps aux | grep kube-apiserver | grep anonymous-auth# 检查匿名请求的 RBAC 权限
kubectl auth can-i list pods --as=system:anonymous