在沙箱中运行不受信任的命令。
项目描述
Sandcastle 
在城堡(OpenShift pod)中运行不受信任的代码,它位于沙箱中。
用法
前提是您已登录OpenShift集群
$ oc status
In project Local Project (myproject) on server https://localhost:8443
最简单的用法是调用新的openshift pod中的命令
from sandcastle import Sandcastle
s = Sandcastle(
image_reference="docker.io/this-is-my/image:latest",
k8s_namespace_name="myproject"
)
output = s.run(command=["ls", "-lha"])
以下事情将发生
- 将创建一个新的pod,使用在
image_reference
中设置的镜像。 - 库将积极等待pod完成。
- 如果pod以大于0的返回码终止,将引发异常。
- 命令的输出通过
.run()
方法返回。
在沙箱和当前pod之间共享数据
这个库允许您在运行的pod和沙箱之间共享卷。
有一个专门的类和接口来访问此功能
VolumeSpec
类- 沙盘城堡构造函数的
volume_mounts
关键字参数
举例胜于千言万语
from pathlib import Path
from sandcastle import Sandcastle, VolumeSpec
# the expectation is that volume assigned to PVC set
# via env var SANDCASTLE_PVC is mounted in current pod at /path
vs = VolumeSpec(path="/path", pvc_from_env="SANDCASTLE_PVC")
s = Sandcastle(
image_reference="docker.io/this-is-my/image:latest",
k8s_namespace_name="myproject",
volume_mounts=[vs]
)
s.run()
s.exec(command=["bash", "-c", "ls -lha /path"]) # will be empty
s.exec(command=["bash", "-c", "mkdir /path/dir"]) # will create a dir
assert Path("/path/dir").is_dir() # should pass
通过复制共享数据
沙箱可以在不同的命名空间中运行。这提高了安全性,因为锁定此项目的网络是极其简单的 - Pod 将无法访问 OpenShift API 服务器或集群中部署的任何服务。更多详细信息,请参阅 出口规则 和 网络策略。
当您设置此沙箱命名空间时,请确保您的应用程序部署的命名空间的服务账户可以管理沙箱命名空间中的 Pod。此命令可能会有所帮助
$ oc adm -n ${SANDBOX_NAMESPACE} policy add-role-to-user edit system:serviceaccount:${APP_NAMESPACE}:default
真实代码
m_dir = MappedDir(
local_dir, # share this dir
sandbox_mountpoint, # make it available here
with_interim_pvc=True # the data will be placed in a volume
)
o = Sandcastle(
image_reference=container_image,
k8s_namespace_name=namespace, # can be a different namespace
mapped_dir=m_dir,
working_dir=sandbox_mountpoint,
)
o.run()
# happy execing
o.exec(command=["ls", "-lha", f"{sandbox_mountpoint}/"])
开发沙箱
为了开发此项目(并运行测试),需要满足一些要求。
-
使用 makefile 目标
make test-image-build
构建容器镜像。 -
OpenShift 集群并登录到它
这意味着运行
oc status
应该显示您想要运行测试的集群。e2e 测试
test_from_pod
构建当前代码库并在 Pod 中运行其他 e2e 测试:以验证 E2E 功能。这假定 OpenShift 集群已部署在您的当前环境中,这意味着 OpenShift 可以访问您 dockerd 中的本地容器镜像。否则,需要将镜像推送到某个地方,以便 OpenShift 可以访问它。 -
在默认的
oc cluster up
环境中,测试使用分配给每个 Pod 的默认服务账户创建沙箱 Pod。这个 SA 没有创建或删除 Pod 的权限(因此沙箱将不起作用)。使用此命令,SA 被允许更改命名空间中的任何对象oc adm policy add-role-to-user edit system:serviceaccount:myproject:default
-
Docker 二进制文件和 Docker 守护进程正在运行。这从前一个点中隐含。
项目详细信息
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分发
构建分发
sandcastle-0.1.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 71aea7b740b4f42acfd997d56fd4d408cc887437079c0f721ea92cb6d5eeb513 |
|
MD5 | 8ea7f64e3e44b8b83022e129773ce82a |
|
BLAKE2b-256 | 67f50be9a151a3aac5ace0d508c612943cce1dbae87614db4de107a164c4613f |
sandcastle-0.1.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ef4e2d64838d4d3e7ce4003c13cee7e0b3e1ff2771182e7011678ffada8c9e74 |
|
MD5 | ad7348dd35c8ba54090e18db28728c66 |
|
BLAKE2b-256 | 7c7b939c2f2a584c54b5887a64e243b35bec2548a9d6cfae1702c483f1415adb |