13 个版本 (5 个稳定版本)
1.2.0 | 2024 年 5 月 25 日 |
---|---|
1.1.2 | 2024 年 4 月 5 日 |
1.1.1 | 2024 年 3 月 19 日 |
1.1.0 | 2023 年 12 月 30 日 |
0.1.1 | 2023 年 4 月 5 日 |
#400 在 命令行工具
96KB
2.5K SLoC
罐头
罐头是一个无需样板代码的可移植容器。
- 罐头是无根的,并以普通用户身份运行。
- 罐头不会在
~
中创建任何隐藏目录,也不会未经提示读取/写入任何文件,除了当前目录。
你可以
- 使用你当前的
/
作为基础镜像,并排除像/home
这样的敏感路径。或者导入你自己的 rootfs 以实现完全隔离。 - 使用
overlayfs
在容器中将/
伪装为可写,更改要么保留在内存中,要么写入另一个目录。 - 使用
nftables
向容器添加防火墙规则。
在底层,罐头在一个单独的 Linux 命名空间中运行一个 Podman 容器。只要 Podman 是安全的,罐头的隔离就是安全的。
示例
警告
如果你收到诸如
Cannot run [...]: Operation not permitted (os error 1)
这样的错误,你的内核可能有 此漏洞。你需要将--share-time
追加到所有罐头容器命令中。
-
将
/bin, /etc, /lib, /lib64, /opt, /sbin, /usr, /var
映射到容器中,并将当前目录映射到/root/workspace
。所有路径将显示为可写,但只有对/root/workspace
的更改是永久的keg --share-net
-
将
/bin, /etc, /lib, /lib64, /opt, /sbin, /usr, /var
映射到容器中。所有路径将显示为可写,但更改将写入到./container
内的路径keg-rootfs --share-net
-
将
./root
映射到容器中作为/
。更改将写入到./my_container
内的路径keg-rootfs --share-net -r ./root -u ./my_container
除了上述所有之外,使用 --net-nft-rules ./nftables_rules.txt
从 ./nftables_rules.txt
导入防火墙规则。移除 --share-net
来禁用在容器中的网络访问。
在容器中,您将显示为 root
(uid 0)。根据常规,这不会给您全局root权限。一些应用程序需要非root用户才能正确运行。如果是这种情况,请在容器内运行
keg-user
以创建一个非root用户的新的用户命名空间。您可以可选地指定 --uid <uid>
和 --gid <gid>
。
安装
Keg只要所有以下列出的依赖项都安装了就会工作
bubblewrap >= 0.4.0, fuse-overlayfs >= 1.5, libseccomp >= 2.4, linux >= 5.4.0, nftables >= 0.9.3, podman >= 3.4.2, slirp4netns >= 1.1.8
安装示例
Ubuntu >= 22.04
运行以下命令并重启
sudo apt-get update -y
sudo apt-get -qq -y install bubblewrap fuse-overlayfs libseccomp-dev nftables podman slirp4netns
# If not installed already:
sudo apt-get -qq -y install cargo
export PATH="$HOME/.cargo/bin:$PATH"
echo 'PATH="$HOME/.cargo/bin:$PATH"' >> ~/.profile
cargo install keg
Ubuntu 20.04
首先,按照 这些说明 安装 podman
。然后执行以下命令并重启
sudo apt-get -qq -y install bubblewrap fuse-overlayfs libseccomp-dev nftables slirp4netns
# If not installed already:
sudo apt-get -qq -y install cargo
export PATH="$HOME/.cargo/bin:$PATH"
echo 'PATH="$HOME/.cargo/bin:$PATH"' >> ~/.profile
cargo install keg
依赖项
~1–1.6MB
~38K SLoC