Kubernetes安全框架

  • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。

    1. Authentication(鉴权):身份鉴别,只有正确的账号才能够通过认证
    2. Authorization(授权):判断用户是否有权限对访问的资源执行特定的动作
    3. Admission Control(准入控制):用于补充授权机制以实现更加精细的访问控制功能。
  • 客户端要想访问K8s集群API Server,一般需要证书、Token或 者用户名+密码;如果Pod访问,需要ServiceAccount

Authentication(鉴权)

三种客户端身份认证:

  • HTTP Base认证:通过用户名+密码的方式认证

这种认证方式是把“用户名:密码"用BASE64算法进行编码后的字符串放在HTTP请求中的Header Authorization域里发送给服务端。服务端收到后进行解码,获取用户名及密码,然后进行用户身份认证的过程。

  • HTTP Token认证:通过一个Token来识别合法用户

这种认证方式是用一个很长的难以被模仿的字符串–Token来表明客户身份的一种方式。每个Token对应一个用户名,当客户端发起API调用请求时,需要在HTTP Header里放入Token, API Server 接到Token后会跟服务器中保存的token进行比对,然后进行用户身份认证的过程。

  • HTTPS证书认证:基于CA根证书签名的双向数字证书认证方式

    这种认证方式是安全性最高的一种方式,但是同时也是操作起来最麻烦的一种方式。

HTTPS认证大体分为3个过程:

  1. 证书申请和下发

    HTTPS通信双方的服务器向CA机构申请证书,CA机构下发根证书、服务端证书及私钥给申请者。

  2. 客户端和服务端的双向认证

    • 客户端向服务器端发起请求,服务端下发自己的证书给客户端,客户端接收到证书后,通过私钥解密证书,在证书中获得服务端的公钥,客户端利用服务器端的公钥认证证书中的信息,如果一致,则认可这个服务器。

    • 客户端发送自己的证书给服务器端,服务端接收到证书后,通过私钥解密证书, 在证书中获得客户端的公钥,并用该公钥认证证书信息,确认客户端是否合法。

  3. 服务器端和客户端进行通信

    服务器端和客户端协商好加密方案后,客户端会产生-一个随机的秘钥并加密,然后发送到服务器端服务器端接收这个秘钥后,双方接下来通信的所有内容都通过该随机秘钥加密。

Authorization(授权)

授权发生在认证成功之后,通过认证就可以知道请求用户是谁,然后Kubernetes会根据事先定义的授权策略来决定用户是否有权限访问,这个过程就称为授权。

RBAC(Role-Based Access Control) 基于角色的访问控制,主要是在描述一件事情:给哪些对象授予了哪些权限

RBAC根据API请求属性,决定允许还是拒绝。

比较常见的授权的几个概念:

  • 对象:User(用户名)、Groups(用户分组)、 ServiceAccount(服务账号)
  • 角色:代表着一组定义在资源上的可操作动作(权限)的集合
  • 绑定:将定义好的角色跟用户绑定在一起

角色

  • Role:授权特定命名空间的访问权限
  • ClusterRole:授权所有命名空间的访问权限

一个角色就是一组权限的集合,这里的权限都是许可形式的(白名单)。

# Role只能对命名空间内的资源进行授权,需要指定nameapce
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: authorization-role
namespace: test
rules:
- apiGroups: [""] # 支持的API组列表,"”空字符串,表示核心API群
resources: ["pods"] # 支持的资源对象列表
verbs: ["get", "watch", "list"] # 允许的对资源对象的操作方法列表
# 该 authorization-role 角色,对指定test命名空间,核心api组的pod资源具有get watch list 权限 # ClusterRole可以对集群范围内资源、跨namespaces的范围资源、非资源类型进行授权
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: authorization-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]

rules中的参数说明:

  • apiGroups:支持的API组列表
"","apps","autoscaling", "batch", "networking"
  • resources:支持的资源对象列表
"services","endpoints","pods","secrets","configmaps","crontabs" ,"deployments","jobs",
"nodes" , "rolebindings","clusterroles", " daemonsets" ,"replicasets" ,"statefulsets",
"horizontalpodautoscalers" ,"replicationcontrollers" , "cronjobs"
  • verbs:对资源对象的操作方法列表
"get","list", "watch", "create", "update", "patch", "delete", "exec"

角色绑定

  • RoleBinding:将角色绑定到主体(即subject)
  • ClusterRoleBinding:将集群角色绑定到主体

角色绑定用来把一个角色绑定到一个目标对象上,绑定目标可以是User、Group或者ServiceAccount

# RoleBinding可以将同一namespace中的subject绑定到某个Role下,则此subject即具有该Role定义的权限
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: authorization-role-binding
namespace: test
subjects: # 目标对象信息
- kind: User # 用户类型
name: zhangsan # 存在的用户名
apiGroup: rbac.authorization.k8s.io
roleRef: # 角色信息
kind: Role # Role类型
name: authorization-role # 存在的role
apiGroup: rbac.authorization.k8s.io
# 将 authorization-role 角色绑定到 zhangsan 目标用户上(此时,zhangsan用户即用户authorization-role角色下所定义的权限) # ClusterRoleBinding在整个集群级别和所有namespaces将特定的subject与ClusterRole绑定,授予权限
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: authorization-clusterrole-binding
subjects: # 目标对象信息
- kind: User # 用户类型
name: zhangsan
apiGroup: rbac.authorization.k8s.io
roleRef: # 角色信息
kind: ClusterRole
name: authorization-clusterrole
apiGroup: rbac.authorization.k8s.io

RoleBinding引用ClusterRole进行授权

RoleBinding可以引用ClusterRole,对属于同一命名空间内ClusterRole定义的资源主体进行授权。

一种很常用的做法就是,集群管理员为集群范围预定义好一组角色(ClusterRole),然后在多个命名空间中重复使用这些ClusterRole。这样可以大幅提高授权管理工作效率,也使得各个命名空间下的基础性授权规则与使用体验保持一致。

#虽然authorization-clusterrole是一个集群角色,但是因为使用了RoleBinding ,所以zhangsan只能读取test命名空间中的资源
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: authorization-role-binding-ns
namespace: test
subjects:
- kind: User
name: zhangsan
apiGroup: rbac.authorization.k8s.io
roleRef :
kind: ClusterRole
name: authorization-clusterrole
apiGroup: rbac.authorization.k8s.io

Admission Control(准入控制)

Adminssion Control实际上是一个准入控制器插件列表,发送到API Server 的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过, 则拒绝请求。

案例:为指定用户授权访问不同命名空间权限

Eg: 为xin用户授权default命令空间Pod读取权限

  1. 用K8S CA签发客户端证书
  2. 生成kubeconfig授权文件
  3. 创建RBAC权限策略

签发证书

cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF cat > xin-csr.json <<EOF
{
"CN": "xin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes xin-csr.json | cfssljson -bare xin
bash cert.sh
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \ # 指定根证书的名称路径
--embed-certs=true \ # 将根证书内容写入配置文件中
--server=https://192.168.200.29:6443 \ # 指定连接k8s集群的IP地址
--kubeconfig=xin.kubeconfig # 生成的文件名 # 设置客户端认证
kubectl config set-credentials xin \
--client-key=xin-key.pem \
--client-certificate=xin.pem \
--embed-certs=true \
--kubeconfig=xin.kubeconfig # 设置默认上下文
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=xin \
--kubeconfig=xin.kubeconfig # 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=xin.kubeconfig
# 执行文件
bash kubeconfig.sh
# 将文件传到node节点
scp xin.kubeconfig node1:/root/
# 测试 发现xin证书没有授权
$ kubectl get pods --kubeconfig=/root/.kube/config
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-79899cbcb-nl52v 1/1 Running 1 2d $ kubectl get pods --kubeconfig=xin.kubeconfig
Error from server (Forbidden): pods is forbidden: User "xin" cannot list resource "pods" in API group "" in the namespace "default" $ cfssl-certinfo --cert xin.pem # 查看证书信息
# 授权操作
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] #API组,空表示在核心组
resources: ["pods"] #资源
verbs: ["get", "watch", "list"] # 操作方法:查看,始时查看,列表 --- kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User #主体
name: xin #用户名
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role #角色
name: pod-reader #绑定的角色名称
apiGroup: rbac.authorization.k8s.io
# 执行
$ kubectl apply -f rbac.yaml
role.rbac.authorization.k8s.io/pod-reader created
rolebinding.rbac.authorization.k8s.io/read-pods created
$ kubectl get role #创建成功
NAME CREATED AT
leader-locking-nfs-client-provisioner 2023-07-07T18:06:03Z
pod-reader 2023-07-09T19:06:55Z
$ kubectl get pods --kubeconfig=xin.kubeconfig # 可以访问了
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-79899cbcb-nl52v 1/1 Running 1 2d1h

Kubernetes安全框架的更多相关文章

  1. 彻底搞懂kubernetes调度框架与插件

    调度框架 [1] 本文基于 kubernetes 1.24 进行分析 调度框架(Scheduling Framework)是Kubernetes 的调度器 kube-scheduler 设计的的可插拔 ...

  2. Kubernetes网络框架

    // cmd/kubelet/app/server.go -1.func UnsecuredKubeletDeps(s *options.KubeletServer) (*kubelet.Kubele ...

  3. Kubernetes e2e test and test framework

    前言 Kubernetes的成功少不了大量工程师的共同参与,而他们之间如何高效的协作,非常值得我们探究.最近研究和使用了他们的e2e测试和框架,还是挺有启发的. 怎样才是好的e2e测试? 不同的人写出 ...

  4. Kubernetes 概念整理

    注:以下大部分内容来自网上摘录,以便后期查阅. Kubernetes (通常称为 K8s) 是用于自动部署.扩展和管理容器化(containerized)应用程序的开源系统,是 Google 内部工具 ...

  5. 深入了解Kubernetes REST API的工作方式

    关于Kubernetes REST API的工作方式: 在哪里以及如何定义从REST路径到处理REST调用的函数的映射? 与etcd的交互发生在哪里? 从客户端发出请求到保存在etcd中对象的端到端路 ...

  6. Docker Manager for Kubernetes

    一.Kubernetes介绍 Kubernets是Google开源的容器集群系统,是基于Docker构建一个容器的调度服务,提供资源调度,均衡容灾,服务注册,动态伸缩等功能套件: Kubernets提 ...

  7. Kubernetes是什么

    目录 简介 主要概念: 总体结构 参考 Kubernetes概念 简介 kubernetes是一个Google开源的容器编排系统,用于自动部署,扩展和管理容器化应用程序. 随处运行:支持公有云,私有云 ...

  8. # kubernetes调度之nodeName与NodeSelector

    系列目录 Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 本文主要介绍kubernetes调度框架中的No ...

  9. Kubernetes 安全概念详解

    Kubernetes 安全框架 API 认证三关 • 访问K8S集群的资源需要过三关:认证.鉴权.准入控制• 普通用户若要安全访问集群API Server,往往需要证书.Token  或者用户名+密码 ...

  10. 亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争

    如果我问你,如何把一个 etcd 集群部署在 Google Cloud 或者阿里云上,你一定会不假思索的给出答案:当然是用 etcd Operator! 实际上,几乎在一夜之间,Kubernetes ...

随机推荐

  1. Linux进程管理(命令)入门

    进程是一个运行中的程序 进程查看 ps 能够查看当前终端下运行的进程 $ ps PID TTY TIME CMD 26305 pts/0 00:00:00 bash 26312 pts/0 00:00 ...

  2. Go语言网络编程:SSH连接

    旨在提升Go语言网络编程能力 SSH是什么? SSH 为 Secure Shell 的缩写,为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SS ...

  3. Runtime类继Robot类自动登录QQ后改进版2.0

    自动登录QQ2.0上线!!! 最近呢,有很多人问我自动登录QQ的小程序不够完善.看过我上一篇博客的人都知道,在登录QQ时运行Robot移动鼠标不够严谨,有时候会移动出错.很多小伙伴就会说了," ...

  4. UniApp小程序开发项目创建与运行

    1.准备工作:HbuiderX  +  微信开发者工具下载安装+小程序账号申请开通(这里就不例举了,可以看同账号uniapp小程序开发准备) 2.创建项目 新版本的HbuilderX点击新建项目--选 ...

  5. Nginx 面试题总结大全

    转载请注明出处: 1 介绍下nginx特点与常用模块 2 nginx特点详细 3 反向代理和正向代理 4 负载均衡策略有哪些 5 Nginx如何实现动静分离?  6 Nginx 常用命令有哪些? 7 ...

  6. StringBuilder类用法解析

    一.StringBuilder说明 StringBuilder是一个可变的字符序列.这个类提供了一个与StringBuffer兼容的API,但不保证同步,即StringBuilder不是线程安全的,而 ...

  7. 2022-09-08:以下go语言代码输出什么?A:5 66;B:5 88;C:7 88;D:以上都不对。 package main func main() { var x = []int{4:

    2022-09-08:以下go语言代码输出什么?A:5 66:B:5 88:C:7 88:D:以上都不对. package main func main() { var x = []int{4:44, ...

  8. 2022-03-16:给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。 另外给一个下标从 0 开始的二维整数数组 meetings , 其中 meetings[i] = [xi,

    2022-03-16:给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号. 另外给一个下标从 0 开始的二维整数数组 meetings , 其中 meetings[i] = [xi, ...

  9. 2022-02-12:k8s安装es,yaml如何写?

    2022-02-12:k8s安装es,yaml如何写? yaml如下: apiVersion: v1 kind: Service metadata: labels: app: elasticsearc ...

  10. 2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?

    2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数.1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做? 福大大 答案2021-08-10: 先排序,然后扩充ra ...