【K8S 云原生】K8S的安全机制

目录

一、K8S安全机制概述

1、概念

2、请求apiserver资源的三个步骤:

一、认证:Anthentcation

1、认证的方式:

1、HTTP TOKEN:

2、http base:

3、http证书:

2、认证的访问类型:

3、签发证书:

二、鉴权

1、概念:

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

三、准入控制

四、实验


一、K8S安全机制概述

1、概念

K8S中的安全机制,分布式的集群管理工具,就是容器编排。

安全机制的核心:apiserver作为整个集群内部通信的中介,也是外部控制进入的入口

所有的apiserver都是围绕apiserver来设计的

2、请求apiserver资源的三个步骤:

1、认证

2、鉴权

3、准入控制

三个条件通过了,才能在K8S集群中创建

一、认证:Anthentcation

1、认证的方式:

1、HTTP TOKEN:

通过token识别合法用户。token是一个很长,很复杂的一个字符串,字符串是用来表达客户的一种方式

每一个token对应一个用户名,用户名存储在apiserver能够访问的文件中

客户端发起请求时,http haeder中包含token

客户端发起请求—token—apiserver(验证用户名存储文件)—解码—用户名—访问集群

2、http base:

用户+密码的验证方式。用户名和密码都是通过base64进行加密,加密完成的字符串,http request的haeder Atuthorization发送给服务端。服务端收到加密字符串,解码,获取用户名名和密码,验证通过,登录成功

3、http证书:

面向公众来说,他是最严格的方式,也是最严谨的方式。基于CA根证书签名的客户端身份验证进行验证

2、认证的访问类型:

K8S组件对apiserve组件的访问。kubelet,kube-proxy

pod对apiserver的访问。pod-corndns,dashborad,也需要访问api

客户端kubectl访问

kubelet、kube-proxy

controller-manager、scheduler与apiserver在一台服务器,可以直接使用apiserver的非安全端口进行访问。

kubectl、kubelet、kube-proxy都是通过apiserver的http证书,进行双向验证,都是用6443端口进行验证

3、签发证书:

1、手动签发,二进制部署就是手动签发证书。CA签发—把证书匹配到每个对应组件。然后访问6443即可

2、自动签发,kubeadm就是自动签发。kubelet第一次访问apiserver使用token认证,token通过之后,controller-manager会为kubelet生成一个证书

以后都是通过证书访问。kubeadm部署时修改了证书的有效期。默认1年,改成10年

3、kubeconfig,这个文件包含集群的参数,CA证书,apiserver地址,客户端的参数(客户端证书和私钥),集群的名称和用户名。

K8S中的组件通过启动时指定访问不同的kubeconfig文件,可以访问不同的集群—apiserver—namespace—资源对象—pod—容器

kubeconfig即使集群的文件,也是一个集群信息的保存文件,包含集群访问方式和认证信息

一般都在家目录下 ~/.kube/config 这个文件保存的是kubectl的访问认证信息

4、serviceAccount:

serviceAccount就是为了方便pod中的容器来访问apiserver。pod动态的的动作(增删改查),每个pod手动生成证书就不现实了。于是K8S就使用了serviceAccount来进行循环验证,service Account里面包含了统一的认证信息,直接进行apiserver访问

5、Secret,保存资源对象

serviceAccount,保存的token,service-account-token

Secret保存到的是自定义的保密信息

6、serviceAccount保存的信息

token:

ca.crt

namespace

都会被自动的挂载到pod中去

二、鉴权

1、概念:

之前的认证过程,只是确认了双方都是可信的,可以互相通信的,鉴权是为了确定请求方的访问权限,能做哪些操作

之前搭建K8S进行的角色操作

kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user kubernetes-admin
#创建用户,给权限,绑定集群

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

1、AlwaysDeny:拒绝所有,一般是测试

2、AlwaysAllow:允许所有,用于测试

3、ABAC attribute-based access control:基于属性的访问控制

4、webhook:外部访问集群内部的鉴权方式

5、RBAC role-base access control:基于角色的访问控制,K8S最常用的规则,也是K8S现在默认的规则机制

角色:role,指定命名空间的资源控制权限

角色绑定:rolebinding,将角色绑定到指定的命名空间

集群角色:clusterrole,可以授权所有命名空间的资源控制权限

集群角色绑定:clusterrolebinding,将集群的角色绑定到命名空间

三、准入控制

准入控制是apiserver的一个准入控制器的插件列表,不同的插件可以实现不同的准入控制机制

一般情况下,建议使用官方默认的准入控制器

limitRanger(命名空间的配额管理)、serviceAccount、resourceQuota(命名空间的配额限制)都属于准入控制器

四、实验

实验目的:实现不同用户管理自己的命名空间

创建一个用户:

useradd lucky
passwd lucky
#创建用户lucky密码

su - lucky
#切换用户

kubectl get pods
#创建lucky-cloud,lucky用户只能管理lucky-cloud命名空间,其他命名空间没权限

创建用于用户连接到 API Server 所需的证书和 kubeconfig 文件

先上传证书生成工具 cfssl、cfssljson、cfssl-certinfo 到 /usr/local/bin 目录中

chmod +x /usr/local/bin/cfssl*

mkdir /opt/lucky
cd /opt/lucky

vim user-cert.sh
#写脚本

cat > lucky-csr.json <<EOF
{
  "CN": "lucky",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
	  "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
	  "OU": "System"
    }
  ]
}
EOF
#API Server 会把客户端证书的 CN 字段作为 User,把 names.O 字段作为 Group

chmod +x user-cert.sh
./user-cert.sh

cd /etc/kubernetes/pki/
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /opt/lucky/lucky-csr.json | cfssljson -bare lucky 
#/etc/kubernetes/pki/ 目录中会生成 lucky-key.pem、lucky.pem、lucky.csr

cd /opt/lucky

vim rbac-kubeconfig.sh
APISERVER=$1
# 设置集群参数
export KUBE_APISERVER="https://$APISERVER:6443"
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=lucky.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials lucky \
  --client-key=/etc/kubernetes/pki/lucky-key.pem \
  --client-certificate=/etc/kubernetes/pki/lucky.pem \
  --embed-certs=true \
  --kubeconfig=lucky.kubeconfig

# 设置上下文参数
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=lucky \
  --namespace=lucky-cloud \
  --kubeconfig=lucky.kubeconfig

kubectl create namespace lucky-cloud
#创建lucky-cloud命名空间
chmod +x rbac-kubeconfig.sh
./rbac-kubeconfig.sh 20.0.0.61

# 使用上下文参数生成 lucky.kubeconfig 文件
kubectl config use-context kubernetes --kubeconfig=lucky.kubeconfig

#查看证书
cat lucky.kubeconfig

mkdir /home/lucky/.kube
cp lucky.kubeconfig /home/lucky/.kube/config
chown -R lucky:lucky /home/lucky/.kube/

RBAC授权

vim rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: lucky-cloud
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list", "create"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: lucky-cloud
subjects:
- kind: User
  name: lucky
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io


kubectl apply -f rbac.yaml

kubectl get role,rolebinding -n lucky-cloud
kubectl apply -f rbac.yaml


kubectl get role,rolebinding -n lucky-cloud

创建在

vim pod-test.yaml



apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  namespace: lucky-cloud
spec:
  containers:
    - name: nginx
      image: nginx

kubectl create -f pod-test.yaml

切换用户,测试操作权限

su - lucky

用户能对lucky-cloud命名空间进行操作

但是访问svc会被拒绝,访问其他命名空间也会被拒绝

RoleBinding 的用户只能管理指定的命名空间中的资源

也可以通过绑定 admin 角色,来获得管理员权限

kubectl create rolebinding lucky-admin-binding --clusterrole=admin --user=lucky --namespace=lucky

增加rbac角色权限:

回到lucky用户,测试权限:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Power Platform】实现让审批人可以修改其他人提交的表单中的部分字段

之前我们分享的案例里&#xff0c;我提了一嘴我们的客户有一个需求&#xff0c;就是审批人要有能力修改其他人表单中的部分字段。 今天我们就来分享一下如何实现这个功能。 要实现这个效果&#xff0c;我们需要判断三个值——当前审批人是不是当前登录人、当前审批节点可以修…

基于python京东商品数据采集与可视化分析大屏设计与实现

随着电子商务行业的快速发展&#xff0c;京东作为中国最大的综合性电商平台之一&#xff0c;拥有海量的商品数据。对这些数据进行采集与分析&#xff0c;能够帮助企业了解市场趋势、消费者需求以及产品销售情况&#xff0c;为决策提供科学依据。 本文旨在基于京东商品数据的采…

Linux设备树中的 gpio 信息

一. 简介 前面几篇文章讲解了 pinctrl 子系统&#xff0c; pinctrl 子系统重点是设置 PIN( 有的 SOC 叫做 PAD) 的复用 和电气属性。 注意&#xff1a;如果 pinctrl 子系统将一个 PIN 复用为 GPIO 的话&#xff0c;那么接下来就要用到 gpio 子系统了。如果 PIN用作其他…

若依微服务框架 上传文件(文件表)

若依微服务得上传文件只有在头像那里才有&#xff0c;而且存储得是地址。 如果想要进行文件表存储&#xff0c;只能自己进行封装。 若依微服务框架 上传文件&#xff08;文件表&#xff09; 一、问题二、代码1.组件代码2、调用 一、问题 若依在上传文件这里使用了watch监听&a…

Webpack5 基本使用 - 1

Webpack 是什么 webpack 的核心目的是打包&#xff0c;即把源代码一个一个的 js 文件&#xff0c;打包汇总为一个总文件 bundle.js。 基本配置包括mode指定打包模式&#xff0c;entry指定打包入口&#xff0c;output指定打包输出目录。 另外&#xff0c;由于 webpack默认只能打…

R语言批量把数值变量和因子变量的互转

#我们以rms包的lung数据集为例 library(rms) data<-lung #这里有两种方法&#xff0c; #第1是知道需要转化的变量在哪几列&#xff1b; #第2知道需要转化的变量名 str(data) #假设我们想转化inst/status/sex/三个变量的类型 #图1先看看变量类型和处于第几列 str(dat…

【C++11并发】mutex 笔记

简介 在多线程中往往需要访问临界资源&#xff0c;C11为我们提供了mutex等相关类来保护临界资源&#xff0c;保证某一时刻只有一个线程可以访问临界资源。主要包括各种mutex&#xff0c;他们的命名大都是xx_mutex。以及RAII风格的wrapper类&#xff0c;RAII就是一般在构造的时…

VRRP6协议--负载均衡配置

VRRP6负载均衡 VRRP6负载均衡指的是创建多个备份组,多个备份组同时承担数据转发的任务,对于每一个备份组,都有自己的Master和若干Backup设备。 VRRP6负载分担与VRRP6主备备份的基本原理和报文协商过程都是相同的。同样对于每一个VRRP6备份组,都包含一个Master设备和若干Ba…

蓝桥杯备战——7.DS18B20温度传感器

1.分析原理图 通过上图我们可以看到DS18B20通过单总线接到了单片机的P14上。 2.查阅DS18B20使用手册 比赛的时候是会提供DS18B20单总线通讯协议的代码&#xff0c;但是没有提供读取温度数据的代码&#xff0c;所以还是需要我们去查看手册&#xff0c;我只把重要部分截下来了 …

幻兽帕鲁搭建私服,一键更新方法

看着帕鲁这么火&#xff0c;估计更新会变为常态了&#xff0c;如果有自己搭建私服的话&#xff0c;跟着我下面的方法去进行更新吧&#xff01; 如果你还没有自己的私服&#xff0c;快去三五十搞一个吧&#xff0c;只需三五分钟&#xff0c;叫上你的小伙伴一起去搞起来吧 只需3分…

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…

25考研每日的时间安排

今天要给大家分享一下25考研每日的时间安排。 没有完美的计划&#xff0c;只有合适的计划。 仅供参考 很多人说复习不要只看时长而是要看效率&#xff0c;所以学多长时间不重要&#xff0c;重要的高效率完成任务。 完美的计划 这个计划看起来很完美&#xff0c;从早到晚有学习…

【产品笔记】ESP32及其物联网硬件设备——ESP32智能网关

ESP32是一款适用于许多物联网应用的强大芯片。本文作为学习笔记&#xff0c;记录ESP32及其衍生产品在物联网中的特点&#xff0c;希望对您选择基于ESP32的物联网网关也能有帮助。 什么是ESP32&#xff1f; 在嵌入式系统和物联网应用领域&#xff0c;ESP32是一款广受欢迎的微控…

【JavaMail】Java中发送邮件

文章目录 一、概念二、Java中发送邮件1.导入2.连接SMTP服务器3.创建Session会话4.发送纯文本邮件5.发送带附件邮件 三、封装工具类 一、概念 首先需要明白以下概念&#xff1a; 不需要深入了解他们是怎么工作的&#xff0c;记住关键字即可&#xff1a; SMTP协议&#xff1a;邮…

进程地址空间(Linux)

进程地址空间 一、引入概念1. 程序的地址分布2. 线性地址和物理地址 二、进程地址空间1. 初步认识2. 地址空间和物理内存的联系3. 区域划分4. 拓展——关于“线” 三、进一步理解进程地址空间四、页表总结 一、引入概念 1. 程序的地址分布 测试代码&#xff1a; #include &l…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

STM32标准库开发—W25Q64详细介绍

W25Q64简介 Flash编程原理都是只能将1写为0&#xff0c;而不能将0写成1.所以在Flash编程之前&#xff0c;必须将对应的块擦除&#xff0c;而擦除的过程就是将所有位都写为1的过程&#xff0c;块内的所有字节变为0xFF.因此可以说&#xff0c;编程是将相应位写0的过程&#xff0c…

【Java发送邮箱】spring boot 发送邮箱

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 2.在properties配置邮箱 # 发件人QQ号 spring.mail.username2508575653qq.com # QQ邮箱授权码 sp…

EIGRP实验

实验大纲 一、基本配置 1.构建网络拓扑结构图 2.路由器基本配置 3.配置PC 4.测试连通性 5.保存配置文件 二、配置EIGRP 1.查看路由表 2.配置EIGRP动态路由 3.查看路由器路由表 4.测试网络连通性 5.查看所有路由器的路由协议 6.保存配置文件 三、配置OSPF 1.配置…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…
最新文章