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命令行工具

MIT 许可证

96KB
2.5K SLoC

罐头

Crates.io Build Status

罐头是一个无需样板代码的可移植容器。

  • 罐头是无根的,并以普通用户身份运行。
  • 罐头不会在 ~ 中创建任何隐藏目录,也不会未经提示读取/写入任何文件,除了当前目录。

你可以

  • 使用你当前的 / 作为基础镜像,并排除像 /home 这样的敏感路径。或者导入你自己的 rootfs 以实现完全隔离。
  • 使用 overlayfs 在容器中将 / 伪装为可写,更改要么保留在内存中,要么写入另一个目录。
  • 使用 nftables 向容器添加防火墙规则。

在底层,罐头在一个单独的 Linux 命名空间中运行一个 Podman 容器。只要 Podman 是安全的,罐头的隔离就是安全的。

示例

警告

如果你收到诸如 Cannot run [...]: Operation not permitted (os error 1) 这样的错误,你的内核可能有 此漏洞。你需要将 --share-time 追加到所有罐头容器命令中。

  1. /bin, /etc, /lib, /lib64, /opt, /sbin, /usr, /var 映射到容器中,并将当前目录映射到 /root/workspace。所有路径将显示为可写,但只有对 /root/workspace 的更改是永久的

    keg --share-net
    
  2. /bin, /etc, /lib, /lib64, /opt, /sbin, /usr, /var 映射到容器中。所有路径将显示为可写,但更改将写入到 ./container 内的路径

    keg-rootfs --share-net
    
  3. ./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