第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
View Code
复制代码

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
复制代码

 

posted @   逆风飞翔的博客  阅读(14)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示