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

news2024/11/16 21:40:00

目录

一、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.coloradmin.cn/o/1411205.html

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

相关文章

【并发编程】指令集并行原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 指令集并行原理 名词&#xff1a; Clock Cycle Time CPU的Clock Cycle Time(时钟周期时间)&#xff0c;等于主频的倒数。意思是CPU能识别的最…

VR数字展厅,平面静态跨越到3D立体化时代

近些年&#xff0c;VR的概念被越来越多的人提起&#xff0c;较为常见的形式就是VR数字展厅。VR数字展厅的出现&#xff0c;让各地以及各行业的展厅展馆的呈现和宣传都发生了很大的改变和革新&#xff0c;同时也意味着展览传播的方式不再局限于原来的图文、视频&#xff0c;而是…

redis的备份原理

1 Redis持久化之RDB 1RDB是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 也就是行话讲的Snapshot快照&#xff0c;它恢复时是将快照文件直接读到内存里 2备份是如何执行的 Redis会单独创建&#xff08;fork&#xff09;一个子进程来进行持久化&#x…

星环科技基于第五代英特尔®至强®可扩展处理器的分布式向量数据库解决方案重磅发布

12月15日&#xff0c;2023 英特尔新品发布会暨 AI 技术创新派对上&#xff0c;星环科技基于第五代英特尔至强可扩展处理器的Transwarp Hippo分布式向量数据库解决方案重磅发布。该方案利用第五代英特尔至强可扩展处理器带来的强大算力&#xff0c;实现了约 2 倍的代际性能提升&…

2021 Google Chrome RCE漏洞分析

一、复现环境&#xff1a; Win10 Google Chrome 86.0.4240.75 二、利用复现&#xff1a; 关闭沙箱安全使用命令进行关闭 &#xff0c;在正常情况下&#xff0c;浏览器沙箱提供了一个受限制的执行环境&#xff0c;以防止恶意代码对用户系统的损害。关闭沙箱可能会导致浏览器执…

银行数据仓库体系实践(7)--数据模型设计及流程

数据仓库作为全行或全公司的数据中心和总线&#xff0c;汇集了全行各系统以及外部数据&#xff0c;通过良好的系统架构可以保证系统稳定性和处理高效性&#xff0c;那如何保障系统数据的完备性、规范性和统一性呢&#xff1f;这里就需要有良好的数据分区和数据模型&#xff0c;…

「JavaSE」抽象类接口3

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 抽象类&接口3 &#x1f349;Clonable 接口和深拷贝&#x1f34c;浅拷贝和深拷贝 &#x1f349;Object类&#x1f349;抽象类…

Effective C++ 学习

Effective C浅浅学习&#xff0c;很多不太理解 尽量用const, enum, inline 替换#define尽可能使用const确认对象在使用前就已经被初始化构造&#xff0c;析构&#xff0c;赋值运算&#xff0c;拷贝构造为多态基类声明virtual析构函数不要让析构函数抛出异常不在构造和析构过程中…

javaWebssh宠物基地管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh宠物基地管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别

视频教程地址&#xff1a;【跨平台Recorder录音插件&#xff1a;支持多种格式、音频可视化、实时上传、语音识别】 https://www.bilibili.com/video/BV1jQ4y1c7e4/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c /** 先引入Recorder &#xff08; 需先…

幻兽帕鲁服务器数据备份

搭建幻兽帕鲁个人服务器&#xff0c;最近不少用户碰到内存不足、游戏坏档之类的问题。做好定时备份&#xff0c;才能轻松快速恢复游戏进度 这里讲一下如何定时将服务器数据备份到腾讯云轻量对象存储服务&#xff0c;以及如何在有需要的时候进行数据恢复。服务器中间的数据迁移…

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

一文学习Thrift RPC

Thrift RPC引言 Thrift RPC的特点 Thrift 是一个RPC的框架&#xff0c;和Hessian RPC有什么区别&#xff0c;最重要的区别是Thrift可以做异构系统开发。 什么是异构系统&#xff0c;服务的提供者和服务的调用者是用不同语言开发的。 为什么会当前系统会有异构系统的调用&…

Vue3 Teleport 将组件传送到外层DOM位置

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

音频前置放大器电路图大全

音频前置放大器电路图&#xff08;一&#xff09; 在本设计中&#xff0c;前置放大器的增益控制采用直流音量控制方式&#xff0c;其具体实现如图1所示。前置放大器是由全差分运放和电阻构成的反相比例放大器&#xff0c;其增益由反馈电阻与输人电阻的比值决定。外部输人的直流…

【Leetcode】2859. 计算 K 置位下标对应元素的和

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的…

WebSocket实现HTML+SpringBoot聊天功能,小程序+SpringBoot聊天功能

目录 一、认识WebSocket 二、HTML实现聊天 三、微信小程序实现聊天 一、认识WebSocket 1.首先博主在初学Java时自我感觉走了很多弯路&#xff0c;因为以前见识短&#xff0c;在接触聊天功能时根本就没能想到有WebSocket这个聊天框架&#xff0c;就只能用底层的UDP或TCP实现聊…

基于Spring Boot的饮食分享平台设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

vue项目打包部署到服务器并使用cdn加速

配置 vue.config.js文件 const isProd process.env.NODE_ENV production module.exports {// 其他配置chainWebpack: config > {// 生产环境下使用CDNif (isProd) {config.plugin(html).tap(args > {args[0].cdn assetsCDNreturn args})}},// 生产环境下替换路径为c…

第十二回 急先锋东郭争功 青面兽北京斗武-FreeBSD/Linux SSH配置和常用软件

周谨和杨志第一轮比枪&#xff0c;为了安全&#xff0c;将枪尖去掉&#xff0c;包上柔软的毡片&#xff0c;再蘸满石灰。两人打了四五十个回合&#xff0c;只见周谨身上斑斑点点&#xff0c;约有三五十处&#xff0c;而杨志身上只有左肩牌下一点白。 周谨不服又来比射箭&#x…