第11章 Kubernetes安全
• Kubernetes 安全框架
• 基于角色的权限访问控制:RBAC
RBAC:4种顶级资源,Role、ClusterRole、RoleBinding、ClusterRoleBinding
• 网络策略,控制Pod网络通信
11.1Kubernete安全框架
- K8s安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件
1) Authentication(鉴权)
2) Authorization(授权)
3) Admission Control(准入控制)
- 客户端要想访问k8s集群API Server,一般需要证书、Token或者用户名+密码;如果pod访问,需要ServiceAccount
11.2Kubernetes安全框架:鉴权(Authentication)
K8s Apiserver提供三种客户端身份认证:
- Https证书认证:基于CA证书签名的数字证书认证(kubeconfig)
- Http Token认证:通过一个Token来识别用户(Serviceaccount)
- Http Base认证:用户名+密码的方式认证(1.19版本弃用)
11.3 Kubernetes安全框架:授权(Authorization)
RABC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝。
- User:用户名
- Group:分户分组
- 资源,例如pod、deployment
- 资源操作方法:get、list、create、update、patch、watch、delete
- 命名空间
- API组
11.4 Kubernetes安全框架:准入控制(Admission Control)
Admission Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。
启用一个准入控制器:
Kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger …
关闭一个准入控制器:
Kube-apiserver –disable-admission-plugins=PodNodeSelector,AlwaysDeny…
查看默认启用:
Kubectl exec kube-apiserver-k8s-master -n kube-system –kube-apiserver -h|grep enable-admission-plugins
11.5 基于角色的权限访问控制:RBAC
RBAC(Role-Based Access Control,基于角色的访问控制)是k8s默认授权策略,并且是动态配置策略(修改即时生效)。
主体(subject)
- User:用户
- Group:用户组
- ServiceAccount:服务账号
角色
- Role:授权特定命名空间的访问权限
- ClusterRoleBinding:授权所有命名空间的访问权限
角色绑定
- RoleBinding:将角色绑定到主体(即subject)
- ClusterRoleBinding:将集群角色绑定到主体
注:RoleBinding在指定命令空间中执行授权,ClusterRoleBinding在集群范围执行授权。
11.6RBAC案例:
为指定用户授权访问不同命名空间权限,例如新入职一个小弟,希望让他先熟悉k8s集群,为了安全性,先不能给他太大权限,因此先给他授权访问default命名空间Pod读取权限。
实施大致步骤:
1.用K8s CA签发客户端证书 (1).执行bash cert.sh (2).执行bash kubeconfig.sh (3).验证:kubectl --kubeconfig=aliang.kubeconfig get pods #################### 简写方式: [root@k8s-master1 ypc]# alias ypc=kubectl --kubeconfig=ypc.kubeconfig [root@k8s-master1 ypc]# ypc get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 57m ################### /root/.kube/config 2.生成kubeconfig授权文件 3.创建RBAC授权策略 4.指定kubeconfig文件测试权限,kubectl get pods –kubeconfig=./aliang.kubeconfig
11.7 案例:为指定用户授权访问不同命名空间权限
生成Kubeconfig授权文件: #设置集群 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=https://192.168.31.61:6443 \ --kubeconfig=aliang.kubeconfig #设置客户端认证 kubectl config set-credentials aliang \ --client-key=aliang-key.pem \ --client-certificate=aliang.pem \ --embed-certs=true \ --kubeconfig=aliang.kubeconfig #设置默认上下文 kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=aliang \ --kubeconfig=aliang.kubeconfig #设置当前使用配置 kubectl config use-context kubernetes --kubeconfig=aliang.kubeconfig
11.8 基于角色的权限访问控制:RBAC
创建角色(授权集合): apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [“”] # api组,例如apps组,空值表示是核心API组,像namespace、pod、service、pv、pvc都在里面 resources: [“pods”] #资源名称(复数),例如pods、deployments、services verbs: [“get”, “watch”, “list”] # 资源操作方法
将用户与角色绑定:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: User # 主体 name: jane # 主体名称 apiGroup: rbac.authorization.k8s.io roleRef: # 绑定的角色 kind: Role name: pod-reader # 角色名称 apiGroup: rbac.authorization.k8s.io
11.9RBAC认证流程
11.10 服务账号(SA)示列:为了一个服务账号分配只能创建deployment、daemonset、statefulset的权限
#创建集群角色 # 创建集群角色 kubectl create clusterrole deployment-clusterrole \ --verb=create --resource=deployments,daemonsets,statefulsets # 创建服务账号 kubectl create serviceaccount cicd-token -n app-team1 # 将服务账号绑定角色 kubectl create rolebinding cicd-token \ --serviceaccount=app-team1:cicd-token \ --clusterrole=deployment-clusterrole -n app-team1 # 测试服务账号权限 kubectl --as=system:serviceaccount:app-team1:cicd-token \ get pods -n app-team1
上面命令对应YAML

apiVersion: v1 kind: ServiceAccount metadata: name: cicd-token namespace: app-team1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: deployment-clusterrole rules: - apiGroups: ["apps"] resources: ["deployments","daemonsets","statefulsets"] verbs: ["create"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: cicd-token namespace: app-team1 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: deployment-clusterrole subjects: - kind: ServiceAccount name: cicd-token namespace: app-team1
11.11 网络策略:概述
默认情况下,kubernetes集群网络没任何网络限制,Pod可以与任何其他pod通信,在某些场景下就需要进行网络控制,减少网络攻击面,这就会用到网络策略。
网络策略(Network Policy):是一个k8s资源,用于限制pod出入流量,提供pod级别和Namespace级别网络访问控制。
网络策略应用场景:
• 应用程序间的访问控制,例如项目A不能访问项目B的pod
• 开发环境命名空间不能访问测试环境命名空间pod
• 当pod暴露到外部时,需要做pod白名单
• 多租户网络环境隔离
11.11.1 网络策略
PodSelector:目标pod,根据标签选择。
policyTypes:策略类型,指定策略用于入站,出站流量
Ingress: from 是可以访问的白名单,可以来自于ip段、命名空间、pod标签等,ports是可以访问的端口。
Egress:这个Pod组可以访问外部的IP段和端口。
11.11.2 网络策略:案例
案例1:拒绝其他命名空间Pod访问
案例2:同一个命名空间下应用之间限制访问
案例3:只允许指定命名空间中的应用访问
附:准备环境快捷命令
kubectl run busybox --image=busybox -n test -- sleep 12h
kubectl run web --image=nginx -n test
kubectl exec busybox -n test -- ping 10.244.169.135
11.11.2.1案例1:拒绝其他命名空间Pod访问
需求:test命名空间下所有Pod可以互相访问,也可以访问其它命名空间pod,但其它命名空间不能访问test命名空间pod。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-namespaces namespace: test spec: podSelector: {} # 未配置,匹配本命名空间所有pod policyTypes: - Ingress ingress: - from: - podSelector: {} # 未配置,匹配本命名空间所有pod
11.11.2.2 案例2:同一个命名空间下应用之间限制访问
需求:将test命名空间携带run=web标签的pod隔离,只允许test命令空间携带run=client1标签的pod访问80端口。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: app-to-app namespace: test spec: podSelector: matchLabels: run: web policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: run: client1 ports: - protocol: TCP port: 80
11.11.2.3 案例3:只允许指定命名空间中的应用访问
需求:只允许dev命名空间中的pod访问test命名空间中的Pod端口
命名空间打标签:kubctl label namespace dev name=dev
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-port-from-namespace namespace: test spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: # 匹配命名空间标签 matchLabels: name: dev ports: - protocol: TCP port: 80
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!