沙箱、kuasar+isulad-程序员宅基地

技术标签: 运维  

沙箱定义

沙箱技术本质上是将不信任的程序隔离在沙箱内进行运行操作,防止影响其它应用和服务。

基于隔离的沙箱

该类型的沙箱将应用的执行环境从操作系统中隔离出来形成一个独立的执行环境。

基于规则的沙箱

该类型沙箱是使用规则的方式控制每个应用的权限,且沙箱之间可以分享操作系统的逻辑资源。

VM安全隔离架构

虚拟机的安全隔离能力可以看水平和垂直维度

水平维度:虚拟机hypervisor层水平分隔不同的guest os,保证guest os 的漏洞不会影响其它的guest os ;

垂直维度:hyperviso层分隔不同的操作系统(guest os 和host os的内核不共享)和物理硬件,控制guest os中漏洞不会影响到宿主机上的操作系统和物理硬件。

Container

容器的安全隔离能力借鉴了 VM 的这种分隔的思想,将不同的应用水平分隔在不同容器环境中运行,如果容器中的应用存在漏洞,它是不会直接影响到其他应用。但是在垂直分隔的维度上,容器和容器之间共享同一个内核,没有带来完全意义上的隔离,因此如果一个容器触发了一个内核漏洞导致内核崩溃,就会导致整个系统上的其他容器中的应用也会受到影响。

WASM+WASI

从语言设计上就利用 SFI 软件故障隔离的概念,将 WASM 应用程序的故障都隔离约束在自己单独的线性地址空间中,确保应用程序不会跳转到故障域之外的地址空间,实现安全隔离的目的。并且 WASM 的虚拟指令集都是纯计算指令集,不会像 VM 或 Container 需要涉及到对内核或者硬件资源的访问,因此通过 SFI 机制就可以保障程序的漏洞不会逃逸和扩散。

WASI概念则是基于前面第二种基于规则的沙箱技术的安全模型,用规则的方式控制每个 WASM 应用的权限,需要什么能力,就需要显示地为应用配置对应的规则。

 WASM+WASI 的沙箱技术汲取了基于隔离沙箱技术和基于规则沙箱技术的优点,提供的轻量级沙箱技术。

WASM接入云原生生态

WASM 沙箱在保证安全隔离的前提下,可以获得毫秒级冷启动速度,如果接入到云原生生态中,容器运行时首先要考虑的问题是如何发挥 WASM 极速启动的优势。

Kuasar 基于 Sandbox API 接口的设计将 sandbox 的概念具体的从 containerd-shim 进程模型中解放出来,可以直接映射到实际的沙箱对象上,例如轻量级虚拟机类型的MicroVM沙箱,WASM 语言虚拟机类型的沙箱。

Kuasar 对接 Wasmtime 

Kuasar 对接 Wasmtime 运行时的架构采用的是协程模型,wasm-sandboxer 沙箱管理模块和 wasm-task 容器管理模块均运行在同一个进程中,由 wasm-task 创建的 WASM沙箱实例也同样运行在 wasm-sandboxer 进程中,这样设计的好处是可以充分利用单进程内的协程调度机制来降低 WASM 沙箱实例的调度开销,避免传统每个WASM实例单进程模式对系统PID资源的消耗,提高单节点上 WASM 沙箱实例的部署密度。

WASM 沙箱实例中 WASM 函数的 IO 流则是通过命名管道与容器引擎进行对接,让容器引擎可以收集到 WASM 函数的输出内容。

Kuasar 对接 WasmEdge 

Kuasar 对接 WasmEdge 运行时的架构与 Wasmtime 运行时稍有一些不同,当 wasm-task 接收到创建 WASM 沙箱的请求时,会通过 fork 系统调用创建出一个新的进程来实例化 WASM 沙箱,这样设计的原因是 WasmEdge 运行时当前暂不支持在一个进程中同时重定向不同 WASM 沙箱实例的标准输入和标准输出。

实例

1. 下面以 Wasmtime 作为 WASM 运行时为例进行介绍说明,WasmEdge 运行时的编译与运行步骤类似。

2. Kuasar 支持 WASM 沙箱是一个预览特性,不支持应用在商用环境中。

环境准备

1. 准备一个 openEuler 23.09 版本的 x86 环境

2. 安装 Rust 语言编译工具链,安装方法参考 Rust 官方安装教程[5]

3. 安装 iSulad 容器引擎,安装方法参考 iSulad 容器引擎 - 安装与配置[6]

4. 安装 isula-build 容器镜像构建工具,安装方法参考isula-build 容器镜像构建 - 安装[7]

制作 WASM 应用容器镜像

1.编译 WASM 格式目标应用程序​​​​​​

# 以 runwasi 项目中 wasi-demo-app 应用为例介绍$ git clone https://github.com/containerd/runwasi.git
$ cd runwasi/crates/wasi-demo-app
# 安装 rust wasm32-wasi 编译工具链$ rustup target add wasm32-wasi
# 将 "wasi-demo-app" 程序编译成 wasm 目标格式$ cargo build --target=wasm32-wasi --release
# 编译生成的 wasm 模块会存放在 target/wasm32-wasi/release/ 目录下$ ls runwasi/target/wasm32-wasi/release/*.wasm                                  target/wasm32-wasi/release/wasi-demo-app.wasm

2.创建一个空的目录,将上一步生成的 wasm 格式应用文件拷贝到该空目录中​​​​​​​

$ mkdir build && cd build$ cp target/wasm32-wasi/release/wasi-demo-app.wasm .

3. 编写容器镜像构建所需的 Dockerfile​​​​​​​

$ cat DockerfileFROM scratchADD wasi-demo-app.wasm /

4. 通过 isula-build 构建 WASM 应用容器镜像,并直接导入到 iSulad 容器引擎​​​​​​​

$ isula-build ctr-img build -f Dockerfile -o isulad:wasi-demo-app:v1STEP  1: FROM scratchSTEP  2: ADD wasi-demo-app.wasm /Getting image source signaturesCopying blob sha256:2ed8f32f0a3bd46fddc96fbe1639eaebd8a3d0e49c9c284ddf24619300fcfab5Copying config sha256:59b1ccb0ae18329439e0b3995de75df9a021b5096afaad7a72925fa2b85f4ae4Writing manifest to image destinationStoring signaturesCommitted stage 0 with ID: 59b1ccb0ae18329439e0b3995de75df9a021b5096afaad7a72925fa2b85f4ae4Getting image source signaturesCopying blob sha256:2ed8f32f0a3bd46fddc96fbe1639eaebd8a3d0e49c9c284ddf24619300fcfab5Copying config sha256:59b1ccb0ae18329439e0b3995de75df9a021b5096afaad7a72925fa2b85f4ae4Writing manifest to image destinationStoring signaturesBuild success with image id: 59b1ccb0ae18329439e0b3995de75df9a021b5096afaad7a72925fa2b85f4ae4
$ isula imagesREPOSITORY                                TAG        IMAGE ID             CREATED              SIZE      wasi-demo-app                             latest     59b1ccb0ae18         2023-11-21 20:30:53  108.229KB

编译运行 WASM 沙箱运行时

1. 编译基于Wasmtime运行时的wasm-sandboxer组件​​

# 下载 kuasar 项目源码$ git clone https://github.com/kuasar-io/kuasar.git
# 切换到 wasm沙箱模块源码目录下$ cd kuasar/wasm
# 编译 wasm-sandboxer 组件$ cargo build --release --features=wasmtime
# 生成的 wasm-sandboxer 二进制可执行文件路径$ ls target/release/wasm-sandboxer

2. 启动 wasm-sandboxer 沙箱运行时进程

RUST_LOG=info wasm-sandboxer --listen /run/wasm-sandboxer.sock --dir /run/kuasar-wasm

3. 修改 iSulad 容器引擎配置支持 WASM 沙箱运行时​​​​​

// 在 iSulad 容器引擎的配置文件 /etc/isulad/daemon.json 中添加下面有关 wasm 沙箱运行时的配置信息{
     ......  "cri-runtimes": {
       "wasm": "io.containerd.wasm.v1"  },  "cri-sandboxers": {
       "wasm": {
           "name": "wasm",        "address": "/run/wasm-sandboxer.sock"      }  },  ......}

4. 重启 iSulad 使配置生效

systemctl restart isulad

创建 WASM 沙箱并执行 WASM 函数

下面的脚本中定义了 WASM 类型 Pod 沙箱和运行 WASM 函数容器的配置信息,通过 crictl 命令来创建 WASM 沙箱并执行 WASM 函数:​​​​​​​​​​​​​​​​​​​​​

$ cat run_example_wasm_container_with_isulad.shset -e# Prepare for the wasm Pod and Container config file.touch pod.json container.jsoncurrent_timestamp=$(date +%s)cat > pod.json <<EOF{
       "metadata": {
           "name": "test-sandbox$current_timestamp",        "namespace": "default"    },    "log_directory": "/tmp",    "linux": {
           "security_context": {
               "namespace_options": {
                   "network": 2,                "pid": 1            }        }    }}EOFcat > container.json <<EOF{
       "metadata": {
           "name": "wasm_$current_timestamp",        "namespace": "default"    },    "image": {
         "image": "wasi-demo-app:latest"    },    "command": [       "/wasi-demo-app.wasm","daemon"    ],    "log_path":"wasm.log",    "linux": {
           "security_context": {
               "namespace_options": {
                   "network": 2,                "pid": 1            }        }    }}EOF# Run a wasm containercrictl run --runtime="wasm" --no-pull container.json pod.jsonrm -f container.json pod.json

执行上述脚本程序后,可以通过crictl命令观测到 WASM 沙箱和 WASM 函数的运行的状态。​​​​​​​

$ crictl ps -aCONTAINER           IMAGE                  CREATED             STATE               NAME                ATTEMPT             POD ID              POD0b1dee6dc1a6c       wasi-demo-app:latest   2 seconds ago       Running             wasm                0                   37fe4fc2fc358       unknown
$  crictl podsPOD ID              CREATED             STATE               NAME                     NAMESPACE           ATTEMPT             RUNTIME37fe4fc2fc358       27 seconds ago      Ready               test-sandbox1700546390   default   

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lishuyc/article/details/134592364

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签