8. 安全认证

8. 安全认证

文章目录

  • 8. 安全认证
    • 8.1 访问控制概述
    • 8.2 认证管理
    • 8.3 授权管理
    • 8.4 准入控制

8.1 访问控制概述

Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。

客户端

在Kubernetes集群中,客户端通常有两类:

  • User Account:一般是独立于kubernetes之外的其他服务管理的用户账号。
  • Service Account:kubernetes管理的账号,用于为Pod中的服务进程在访问Kubernetes时提供身份标识。

img

认证、授权与准入控制

ApiServer是访问及管理资源对象的唯一入口。任何一个请求访问ApiServer,都要经过下面三个流程:

  • Authentication(认证):身份鉴别,只有正确的账号才能够通过认证
  • Authorization(授权): 判断用户是否有权限对访问的资源执行特定的动作
  • Admission Control(准入控制):用于补充授权机制以实现更加精细的访问控制功能。

img

8.2 认证管理

Kubernetes集群安全的最关键点在于如何识别并认证客户端身份,它提供了3种客户端身份认证方式:

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

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

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

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

img

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

  1. 证书申请和下发

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

     1> 客户端向服务器端发起请求,服务端下发自己的证书给客户端,客户端接收到证书后,通过私钥解密证书,在证书中获得服务端的公钥,客户端利用服务器端的公钥认证证书中的信息,如果一致,则认可这个服务器2> 客户端发送自己的证书给服务器端,服务端接收到证书后,通过私钥解密证书,在证书中获得客户端的公钥,并用该公钥认证证书信息,确认客户端是否合法
    
  3. 服务器端和客户端进行通信

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

注意: Kubernetes允许同时配置多种认证方式,只要其中任意一个方式认证通过即可

8.3 授权管理

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

每个发送到ApiServer的请求都带上了用户和资源的信息:比如发送请求的用户、请求的路径、请求的动作等,授权就是根据这些信息和授权策略进行比较,如果符合策略,则认为授权通过,否则会返回错误。

API Server目前支持以下几种授权策略:

  • AlwaysDeny:表示拒绝所有请求,一般用于测试
  • AlwaysAllow:允许接收所有请求,相当于集群不需要授权流程(Kubernetes默认的策略)
  • ABAC:基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  • Webhook:通过调用外部REST服务对用户进行授权
  • Node:是一种专用模式,用于对kubelet发出的请求进行访问控制
  • RBAC:基于角色的访问控制(kubeadm安装方式下的默认选项)

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

其中涉及到了下面几个概念:

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

img

RBAC引入了4个顶级资源对象:

  • Role、ClusterRole:角色,用于指定一组权限
  • RoleBinding、ClusterRoleBinding:角色绑定,用于将角色(权限)赋予给对象

Role、ClusterRole

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

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

需要详细说明的是,rules中的参数:

  • apiGroups: 支持的API组列表

    "","apps", "autoscaling", "batch"
    
  • 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、ClusterRoleBinding

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

# RoleBinding可以将同一namespace中的subject绑定到某个Role下,则此subject即具有该Role定义的权限
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: authorization-role-bindingnamespace: dev
subjects:
- kind: Username: wangqingapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: authorization-roleapiGroup: rbac.authorization.k8s.io
# ClusterRoleBinding在整个集群级别和所有namespaces将特定的subject与ClusterRole绑定,授予权限
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: authorization-clusterrole-binding
subjects:
- kind: Username: wangqingapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: authorization-clusterroleapiGroup: rbac.authorization.k8s.io

RoleBinding引用ClusterRole进行授权

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

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

实战:创建一个只能管理dev空间下Pods资源的账号

# 创建证书
[root@k8s-master ~]# cd /etc/kubernetes/pki/
[root@k8s-master pki]# ls
apiserver.crt              apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.key  apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub
[root@k8s-master pki]# (umask 077;openssl genrsa -out devman.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
............................................+++++
............................+++++
e is 65537 (0x010001)
[root@k8s-master pki]# ls devman.key 
devman.key# 用apiserver的证书去签署
# 签名申请,申请的用户是devman,组是devgroup
[root@k8s-master pki]#  openssl req -new -key devman.key -out devman.csr -subj "/CN=devman/O=devgroup"
[root@k8s-master pki]# ls devman.csr 
devman.csr
[root@k8s-master pki]# ls
apiserver.crt              apiserver.key                 ca.crt      devman.key          front-proxy-ca.key      sa.key
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  ca.key      etcd                front-proxy-client.crt  sa.pub
apiserver-etcd-client.key  apiserver-kubelet-client.key  devman.csr  front-proxy-ca.crt  front-proxy-client.key# 签署证书
[root@k8s-master pki]#  openssl x509 -req -in devman.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out devman.crt -days 3650
Signature ok
subject=CN = devman, O = devgroup
Getting CA Private Key# 设置集群、用户、上下文信息
[root@k8s-master pki]# kubectl config set-cluster kubernetes --embed-certs=true --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.207.10:6443
Cluster "kubernetes" set.
[root@k8s-master pki]# 
[root@k8s-master pki]# kubectl config set-credentials devman --embed-certs=true --client-certificate=/etc/kubernetes/pki/devman.crt --client-key=/etc/kubernetes/pki/devman.key
User "devman" set.
[root@k8s-master pki]# kubectl config set-context devman@kubernetes --cluster=kubernetes --user=devman
Context "devman@kubernetes" created.# 切换账户到devman
[root@k8s-master pki]# kubectl config use-context devman@kubernetes
Switched to context "devman@kubernetes".# 查看dev下pod,发现没有权限
[root@k8s-master pki]# kubectl get pods -n dev
Error from server (Forbidden): pods is forbidden: User "devman" cannot list resource "pods" in API group "" in the namespace "dev"
[root@k8s-master pki]# kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
[root@k8s-master pki]# kubectl get pods -n dev
No resources found in dev namespace.

创建Role和RoleBinding,为devman用户授权

[root@k8s-master inventory]# vi dev-role.yaml
[root@k8s-master inventory]# cat dev-role.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: dev-rolenamespace: dev
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get" , "watch" , "list"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: name: authorization-role-bindingnamespace: dev
subjects:
- kind: Username: devmanapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: dev-roleapiGroup: rbac.authorization.k8s.io# 创建 
[root@k8s-master inventory]# kubectl apply -f dev-role.yaml 
role.rbac.authorization.k8s.io/dev-role created
rolebinding.rbac.authorization.k8s.io/authorization-role-binding created# 切换账户到devman
[root@k8s-master inventory]# kubectl config use-context devman@kubernetes
Switched to context "devman@kubernetes".# 再次查看,在指定的名称空间可以查看
[root@k8s-master inventory]# kubectl get pods -n dev
No resources found in dev namespace.
[root@k8s-master inventory]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "devman" cannot list resource "pods" in API group "" in the namespace "default"# 切换为admin账号
[root@k8s-master inventory]# kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".

修改,使普通用户能创建和删除

[root@k8s-master inventory]# vi dev-role.yaml 
[root@k8s-master inventory]# cat dev-role.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: dev-rolenamespace: dev
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get" , "watch" , "list" , "create" , "delete"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: name: authorization-role-bindingnamespace: dev
subjects:
- kind: Username: devmanapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: dev-roleapiGroup: rbac.authorization.k8s.io
[root@k8s-master inventory]# kubectl apply -f dev-role.yaml 
role.rbac.authorization.k8s.io/dev-role configured
rolebinding.rbac.authorization.k8s.io/authorization-role-binding unchanged
[root@k8s-master inventory]# kubectl config use-context devman@kubernetes
Switched to context "devman@kubernetes".
[root@k8s-master inventory]# kubectl run pod1 -n dev --image httpd:latest --port 80
pod/pod1 created
[root@k8s-master inventory]#  kubectl get pods -n dev
NAME   READY   STATUS              RESTARTS   AGE
pod1   0/1     ContainerCreating   0          8s
[root@k8s-master inventory]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "devman" cannot list resource "pods" in API group "" in the namespace "default"
[root@k8s-master inventory]# kubectl delete pod pod1 -n dev
pod "pod1" deleted
[root@k8s-master inventory]#  kubectl get pods -n dev
No resources found in dev namespace.

8.4 准入控制

通过了前面的认证和授权之后,还需要经过准入控制处理通过之后,apiserver才会处理这个请求。

准入控制是一个可配置的控制器列表,可以通过在Api-Server上通过命令行设置选择执行哪些准入控制器:

--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds

只有当所有的准入控制器都检查通过之后,apiserver才执行该请求,否则返回拒绝。

当前可配置的Admission Control准入控制如下:

  • AlwaysAdmit:允许所有请求
  • AlwaysDeny:禁止所有请求,一般用于测试
  • AlwaysPullImages:在启动容器之前总去下载镜像
  • DenyExecOnPrivileged:它会拦截所有想在Privileged Container上执行命令的请求
  • ImagePolicyWebhook:这个插件将允许后端的一个Webhook程序来完成admission controller的功能。
  • Service Account:实现ServiceAccount实现了自动化
  • SecurityContextDeny:这个插件将使用SecurityContext的Pod中的定义全部失效
  • ResourceQuota:用于资源配额管理目的,观察所有请求,确保在namespace上的配额不会超标
  • LimitRanger:用于资源限制管理,作用于namespace上,确保对Pod进行资源限制
  • InitialResources:为未设置资源请求与限制的Pod,根据其镜像的历史资源的使用情况进行设置
  • NamespaceLifecycle:如果尝试在一个不存在的namespace中创建资源对象,则该创建请求将被拒绝。当删除一个namespace时,系统将会删除该namespace中所有对象。
  • DefaultStorageClass:为了实现共享存储的动态供应,为未指定StorageClass或PV的PVC尝试匹配默认的StorageClass,尽可能减少用户在申请PVC时所需了解的后端存储细节
  • DefaultTolerationSeconds:这个插件为那些没有设置forgiveness tolerations并具有notready:NoExecute和unreachable:NoExecute两种taints的Pod设置默认的“容忍”时间,为5min
  • PodSecurityPolicy:这个插件用于在创建或修改Pod时决定是否根据Pod的security context和可用的PodSecurityPolicy对Pod的安全策略进行控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio 项目鸿蒙(HarmonyOS)多语言

DevEco Studio 项目鸿蒙(HarmonyOS)多语言 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、多语言 新版本IDE可以创建多语言的文件夹,在entry->src->main->resources下,修…

C#深拷贝效率对比

对于浅拷贝和深拷贝,前面的文章已经说明了。 C#浅拷贝和深拷贝数据-CSDN博客 本篇说一下,深拷贝的效率问题,效率一直是程序追求的,效率越高肯定越好,有时候功能是实现了,但是运行以及处理数据的效率非常低…

C/C++ STL提供的关联式容器之set

set(集合)顾名思义,就是数学上的集合 —— 每个元素最多只出现一次,并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,…

讯飞星火大模型api调用

讯飞星火大模型,通过websocket方式通信传递协议要求的报文,然后将流式返回的报文拼接为完整的响应内容,status2时是最后一条消息。因为是websocket方式所以是异步响应的,如果想要同步需要使用CountDownLatch控制下线程等待最后一条…

利用C语言模拟实现堆的基本操作和调堆算法

利用C语言模拟实现堆的基本操作和调堆算法 文章目录 利用C语言模拟实现堆的基本操作和调堆算法前言一、堆的基本原理大根堆和小根堆的比较 二、实现堆的基本操作1)结构定义2)初始化堆(HeapInit)3)销毁堆(He…

(数据结构)单链表的查找和长度计算

代码实现 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //创建头结点 LNode* InitList(LinkList L) {L (LNode*)malloc(sizeof(LNode));if (L NULL){return NULL;}L->data 0;L->next N…

前端视角看 Docker :在国内的基础配置教程(含国内镜像源)

引言 在国内使用Docker时&#xff0c;直接从Docker Hub拉取镜像可能会遇到网络速度慢的问题。配置国内的镜像加速器可以显著提升拉取速度。本教程将指导您完成安装Docker后的基础配置&#xff0c;特别是设置国内镜像加速器。 1. 安装Docker 确保您已在系统上安装Docker。根…

鸿蒙开发组件之DatePicker

一、功能 DatePicker是鸿蒙开发中的日期组件&#xff0c;主要用来日期的选择。样式如下 二、初始化一个DatePicker DatePicker({start:new Date(1970-01-01),end: new Date(2035-12-31)})当然我们的start和end参数是可选的&#xff0c;不必须传递&#xff0c;所以初始化也可以…

windows下使用logstash同步跨网络集群的数据

我们在开发环境过程中&#xff0c;可能会遇到这样的场景。我们可以通过VPN访问远端的机房。有可能还要跨机房访问。这篇文章演示使用logstash&#xff0c;在windows上&#xff0c;去同步跨网络环境的不同机房之间的数据。 此方式受网络限制。适合同步小规模数据。 下载logstash…

C语言复习之结构体指针 ; 函数指针

结构体指针 不可以这样定义&#xff1a; 应该这样定义&#xff1a;加上指针&#xff0c;因为指针是4个字节&#xff0c;这样的话&#xff0c;他的大小就确定下来了。 一个是表示结构体&#xff0c;一个是表示结构体的指针。 很容易理解&#xff0c;脑子里要有内存图。 结构…

挑战52天学小猪佩奇笔记--day24

52天学完小猪佩奇--day24 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day24 的视频内容总结&#xff0c;方便复习。强烈建议大家去关注一波UP&#xff0c;配合UP视频学习。 注&#xff1a;这集开始变成一段一段的猜台词&#xff0c;加…

VR虚拟现实的七大应用领域

一、工业领域 园区利用虚拟现实技术优化生产管理与节能减排&#xff0c;实现提质增效降本。发展支持多人协作和模拟仿真的虚拟现实开放式服务平台&#xff0c;打通产品设计与制造环节&#xff0c;构建虚实融合的远程运维新型解决方案&#xff0c;适配各类先进制造技术的员工技…

UDP分片与丢包,UDP真的比TCP高效吗?

一、UDP 报文格式 每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长&#xff08;2 字节&#xff09;字段组成&#xff0c;分别说明该报文的源端口、目的端口、报文长度和校验值。 UDP 报文格式如图所示。 UDP 报文中每个字段的含义如下&#xff1a; 源端…

Pytest自动化测试用例中的断言详解

前言 测试的主要工作目标就是验证实际结果与预期结果是否一致&#xff1b;在接口自动化测试中&#xff0c;通过断言来实现这一目标。Pytest中断言是通过assert语句实现的&#xff08;pytest对Python原生的assert语句进行了优化&#xff09;&#xff0c;确定实际情况是否与预期一…

通过“待办事项列表项目”快速学习Pyqt5的一些特性

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

Apache Flume(3):数据持久化

1 使用组件 File Channel 2 属性设置 属性名默认值说明type-filecheckpointDir~/.flume/file-channel/checkpoint检查点文件存放路径dataDirs~/.flume/file-channel/data日志存储路径&#xff0c;多个路径使用逗号分隔. 使用不同的磁盘上的多个路径能提高file channel的性能 …

SpringIOC之@Primary

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

nodejs微信小程序+python+PHP技术下的音乐推送系统-计算机毕业设计推荐

音乐推送系统采取面对对象的开发模式进行软件的开发和硬体的架设&#xff0c;能很好的满足实际使用的需求&#xff0c;完善了对应的软体架设以及程序编码的工作&#xff0c;采取MySQL作为后台数据的主要存储单元&#xff0c;  本文设计了一款音乐推送系统&#xff0c;系统为人…

vue中2种取值的方式

1.url是这种方式的&#xff1a;http://localhost:3000/user/1 取得参数的方式为&#xff1a;this.$route.params.id 2.url为get方式用&#xff1f;拼接参数的&#xff1a;http://localhost:3000/user?phone131121123&companyId2ahttp://localhost:3000/ 取得参数值的方式…

freeRTOS使用

创建第一个FreeRTOS程序 1、官网源码下载 &#xff08;1&#xff09;进入FreeRTOS官网FreeRTOS professional services for application and RTOS development and consulting. FreeRTOS is an Open Source Code RTOS &#xff08;2&#xff09;点击下载FreeRTOS 2、处理目录 &…