kubernetes--安全沙箱运行容器gVisor

news2024/11/16 3:34:54

gVisor介绍

 

       所知,容器的应用程序可以直接访问Linux内核的系统调用,容器在安全隔离上还是比较弱,虽然内核在不断的增强自身的安全特性,但由于内核自身代码极端复杂,CVE漏洞层出不穷。

       所以要想减少这方面安全风险,就是做好安全隔离,阻断容器内程序对物理机内核的依赖。

Google开源的一种gVisor容器沙箱技术就是采用这种思路,gVisor隔离容器和内核之间访问,提供了大部分内核的系统调用,巧妙的将容器内进程的系统调用转为给gViosr的访问。

       gVisor兼容OCI,与Docker和K8s无缝集成,很方便使用

容器中的OCI指的是Open Container Initiative即开放容器计划

项目地址:https://github.com/goole/gvisor

和其他安全防范措施对比:

       seccomp:系统调用过滤

       app armor:限制容器里进程访问文件系统,网络等权限

       capability:限制容器进程拥有的访问内核能力(逻辑上对系统调用做了一个分组)

       非root用户运行容器,减少容器进程拥有的能力

防止容器进程拥有大权限,但只是一定程度,无法避免容器中的进程访问linux内核,而gVisor是在容器和内核之间。避免了容器之间访问内核

缺点:增加对系统调用时间,和开销。但技术相对成熟,消耗不大。阿里云部分产品已加入容器沙箱机制

gVisor架构:

 

gVisor由3个组件构成:

       Runsc是一种Runtime引擎,负责容器的创建与销毁

       Sentry负责容器内程序的系统调用处理

       Gofer负责文件系统的操作代理,IO请求都会由他转接到HOST上

gVisor与Docker集成:

gVisor内核要求:Linux 3.17+

如果用的是CentOS7则需要升级内核,Ubuntu不需要。

CentOS7内核升级步骤(一个节点也行):

【】rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

【】rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

【】yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml –y

【】awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg  #查看可用内核

【】grub2-set-default 0

【】reboot

【】uname -r

https://blog.csdn.net/inthat/article/details/117074180

Centos 7 rpm升级到指定内核

rpm 去

https://pkgs.org/download/kernel(list_del) 找 kernel-xxx.rpm

https://pkgs.org/download/kernel-devel 找 kernel-devel-xxxx.rpm

yum -y install kernel-3.10.0-1160.el7.x86_64 kernel-devel-3.10.0-1160.el7.x86_64  && grub2-set-default 0 && reboot

下载指定版本用rpm -Uvh安装或者用yum安装

1.准备二进制文件

【】sha512sum -c runsc.sha512

【】rm -f *.sha512

【】chmod a+rx runsc containerd-shim-runsc-v1
【】mv runsc containerd-shim-runsc-v1 /usr/local/bin

2、Docker配置使用gVisor

【】runsc install

# 查看加的配置/etc/docker/daemon.json

 

【】systemctl restart docker

参考文档:https://gvisor.dev/docs/user_guide/install/

 

使用runsc运行容器:

【】docker run -d --runtime=runsc  nginx

使用dmesg验证

docker run  --runtime=runsc  -it  nginx dmesg

进入容器与不指定runtime的容器对比,观察内核,发现vgisor会使用沙箱的独立内核

 

已经测试过的应用和工具:https://gvisor.dev/docs/user_guide/compatibility/

 gVisor与Containerd集成:

1、准备配置(装docker时已经启用)

【】cat > /etc/sysctl.d/99-kubernetes-cri.conf << EOF

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

EOF

【】sysctl -system

2、安装

【】cd /etc/yum.repos.d

【】wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

【】yum install -y containerd.io  #此处执行这一条就行前面的都配置好了

装好之后停掉docker只用containerd做容器运行时

3、修改配置文件

• pause镜像地址

• Cgroup驱动改为systemd

 • 增加runsc容器运行时

 • 配置docker镜像加速器

3、修改配置文件

#创建配置文件并修改

https://gvisor.dev/docs/user_guide/containerd/quick_start/

【】mkdir -p /etc/containerd

【】containerd config default > /etc/containerd/config.toml

vi /etc/containerd/config.toml

...

[plugins."io.containerd.grpc.v1.cri"]

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"

...

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]

SystemdCgroup = true

...

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]

runtime_type = "io.containerd.runsc.v1"

 

#runtime类型,增加了runsc是gVios

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]

endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]

...

【】systemctl  stop  docker

【】systemctl stop docker.socket

【】systemctl restart containerd

4、配置kubelet使用containerd

【】vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd

上面的配置中我们增加了两个参数,--container-runtime 参数是用来指定使用的容器运行时的,可选值为 docker 或者 remote,默认是 docker,由于我们这里使用的是 containerd 这种容器运行时,所以配置为 remote 值(也就是除 docker 之外的容器运行时都应该指定为 remote),然后第二个参数 --container-runtime-endpoint 是用来指定远程的运行时服务的 endpiont 地址的,在 Linux 系统中一般都是使用 unix 套接字的形式,比如这里我们就是指定连接 containerd 的套接字地址

【】systemctl restart kubelet

5、验证

kubectl get node -o wide

 

 #注意之前docker创建的容器containerd无法使用会导致该节点上的pod异常,会重新调度,并下载镜像。非平滑切换

  K8s使用gVisor运行容器:

gvisor与containerd比docker集成更好,K8S目前没有适配docker的gvisor

       RuntimeClass是一个用于选择容器运行时配置的特性,容器运行时配置用于运行Pod中的容器。

创建RuntimeClass:

创建pod:

 

 

依次应用

kubectl get pod nginx-gvisor -o wide

kubectl exec nginx-gvisor -- dmesg

 

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

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

相关文章

MATLAB | 这些花里胡哨的热图怎么画

好早之前写过一个绘制相关系数矩阵的代码&#xff0c;但是会自动求相关系数&#xff0c;而且画出来的热图只能是方形&#xff0c;这里写一款允许nan值出现&#xff0c;任意形状的热图绘制代码&#xff0c;绘制效果如下&#xff1a; 如遇到bug请后台提出&#xff0c;并去gitee下…

Spring Boot+Vue前后端分离项目练习02之网盘项目利用token进行登陆验证

1.添加依赖 首先需要添加jwt对应的依赖。 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>2.添加配置 JWT由三部分构成&#xff0c;分别是 header, pa…

详解数据结构中的顺序表的手动实现,顺序表功能接口【数据结构】

文章目录线性表顺序表接口实现尾插尾删头插头删指定位置插入指定位置删除练习线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列…

Freemarker动态模板渲染flyingsaucer将html转PDF(多页固定头尾)

目录一、序言二、CSS样式控制打印模板三、代码示例1、pom.xml2、application.yml3、PdfGenerationController4、Freemarker模板内容四、展示效果一、序言 一般正常来说&#xff0c;生成PDF的操作都是通过将HTML转成PDF&#xff0c;HTML动态渲染可以借助模板引擎&#xff0c;如…

从外行到外包,从手工测试到知名互联大厂测开,我经历了什么...

本人本科就读于某普通一本院校&#xff08;非985&#xff0c;211&#xff09;&#xff0c;经管类专业&#xff0c;从大四实习到15年毕业后前两年一直在从事自己专业相关的工作。17年时决定想要转业从事计算机相关领域工作&#xff0c;在17年9月的一个机遇大跨度转行到测试行业&…

vue子组件监听父组件数据变化并作出改变(亲测有效)

vue子组件监听父组件数据变化并作出改变&#xff08;亲测有效&#xff09; 1. 问题 1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑 1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效 1.3 类型table组件需要根据父组件数据…

Java多线程学习——线程的创建、Thread类以及多线程状态

文章目录学习目标一、认识线程1、线程是什么&#xff1f;2、为什么要有线程3、进程和线程的区别二、Thread类以及常见方法1.创建线程的几种方式2、Thread类属性及方法2.1、Thread的常见构造方法2.2、Thread的常见属性3、线程的中断-interrupt()中断一个线程&#xff1a;4、等待…

前端面试题 —— 浏览器原理(一)

目录 一、进程与线程的概念 二、如何实现浏览器内多个标签页之间的通信? 三、浏览器资源缓存的位置有哪些&#xff1f; 四、对浏览器内核的理解 五、常见的浏览器内核比较 六、浏览器的主要组成部分 七、渲染过程中遇到 JS 文件如何处理&#xff1f; 八、什么情况会阻塞…

【C语言】动态内存管理

我们之前开辟的空间&#xff0c;大小固定&#xff0c;且在申明数组的时候&#xff0c;必须指定数组的长度。但是有时候我们需要的空间大小在程序运行的时候才知道&#xff0c;这就得动态内存开辟出马了。 目录 1.malloc和free 2.calloc 3.realloc 4.常见动态内存错误 5.经…

TCP 握手过程 三次 四次

蛋老师视频 SYN 同步 ACK 确认 FIN 结束 核心机制是确定哪些请求或响应需要丢弃 SYN、ACK、FIN 通过 1/0 设置开启/关闭 开启SYN后&#xff0c;报文中会随机生成 Sequence序号 用于校验 &#xff08;应用可能发起多个会话&#xff0c;可以区分&#xff09; 服务器的同步序…

2023版D盾防火墙v2.1.7.2,主动防御保护,以内外保护的方式 防止网站和服务器给入侵。限制了常见的入侵方法,让服务器更安全

v2.1.7.2 (20230107) 2023-1-7 1.修正PHP一处文件检测的bug。 2.修正某些情况下无法文件加白问题。 v2.1.7.2 2022-10-13 1.针对aspx的样本加入了新的识别。 2.针对上传 doc格式文件提示“上传格式不符” 的修正。 3.工具“HTTPS安全”,把 TLS 1.1 和 TLS 1.0 设置为默认不选中…

杰理AD16N简介

一、概述&#xff1a; AD16N是杰理新出的一个MP3解码芯片&#xff0c;是高集成度的 32 位通用音频 SOC&#xff0c; 集成 40KByte SRAM&#xff0c; 时钟源可选内部 RC 或外部12MHz 晶振&#xff0c; 最高主频可达 160MHz&#xff1b; 主要是替代AC109N系列和AC608N、AC104N系列…

Python爬虫书写时遇到的问题汇总

文章目录python的xpath插件需要的库下载出现问题懒加载python 爬取图片,网址都正确但是下不下来的原因:爬取下来的文字包含Windows不能识别的特殊字符selenium的find_element_by_id()出现的问题爬虫信息写入mysql时的1045号错误python的xpath插件需要的库下载出现问题 ERROR: C…

MySQL特殊语法insert into ... on duplicate key update ...

一、前言 在日常开发中&#xff0c;经常会遇到这样的需求&#xff1a;查看某条记录是否存在&#xff0c;不存在的话创建一条新记录&#xff0c;存在的话更新某些字段。 比如下列伪代码&#xff1a; $row mysql_query($result);if($row){mysql_execute(update ...);}else{my…

MongoDB复习

目录 1.docker安装 2.mondo概念解析 3.数据库操作 4.基本数据类型 5. 适合使用场景 6.对集合操作 7.常用操作 1.docker安装 docker pull mongo:latest docker run -d --restartalways -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo docker exec -it m…

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表

【SpringBoot高级篇】SpringBoot集成Sharding-JDBC分库分表Apache ShardingSphere分库分表分库分表的方式垂直切分垂直分表垂直分库水平切分水平分库水平分表分库分表带来的问题分库分表中间件Sharding-JDBCsharding-jdbc实现水平分表sharding-jdbc实现水平分库sharding-jdbc实…

数据结构-考研难点代码突破(查找算法 - 散列表(哈希表)C++实现除留余数法拉链法哈希)

文章目录1. 哈希表与解决哈希冲突的方法2. C实现除留余数法拉链法哈希1. 哈希表与解决哈希冲突的方法 散列表(Hash Table)&#xff0c;又称哈希表。是一种数据结构。 特点&#xff1a;数据元素的关键字与其存储地址直接相关。 关键字通过散列函数&#xff08;哈希函数&#…

Vue3.0文档整理:2、创建单页面应用程序

2.1&#xff1a;创建步骤 2.1.1&#xff1a;vue-cli 安装并执行create-vue:npm init vuelatest 它是Vue官方的项目脚手架工具 选择项目功能 除了第一项的项目名字外&#xff0c;其他可以暂时默认回撤或者选择No 切换到项目目录:cd <your-project-name> 安装项目依赖&…

山寨APP频出?安全工程师和黑灰产在较量

在山寨这个领域&#xff0c;没有人比黑灰产更懂模仿。 据安全从业者介绍&#xff0c;一般而言&#xff0c;对于成熟的山寨开发者来说&#xff0c;几天时间内就可以做出一套前端框架。服务器、源代码、域名、服务商这些内容的创建&#xff0c;通过网上租赁的方式就可以解决。 比…

【面试题】2023前端vue面试题及答案

Vue3.0 为什么要用 proxy&#xff1f;在 Vue2 中&#xff0c; 0bject.defineProperty 会改变原始数据&#xff0c;而 Proxy 是创建对象的虚拟表示&#xff0c;并提供 set 、get 和 deleteProperty 等处理器&#xff0c;这些处理器可在访问或修改原始对象上的属性时进行拦截&…