kknxzz/sshbox

GitHub: kknxzz/sshbox

sshbox 让你通过 SSH 连接到一次性的 Docker 容器,断开连接后容器自动销毁,适合提供临时隔离的 Linux shell 环境。

Stars: 9 | Forks: 0

# sshbox [![Go 版本](https://img.shields.io/github/go-mod/go-version/kknxzz/sshbox)](go.mod) [![最新发布](https://img.shields.io/github/v/release/kknxzz/sshbox)](https://github.com/kknxzz/sshbox/releases) [![许可证](https://img.shields.io/github/license/kknxzz/sshbox)](LICENSE) 通过 SSH 连接到一个全新的 Docker 容器。每次连接都会获得一个新的 Alpine shell;断开连接后,容器即被销毁。
sshbox disposability demo
disconnect, and the container is gone
sshbox real pty demo
a real pty -- history and vi work, not just piped text
它是一个单一的二进制文件和一个 TOML 文件。将其指向一个 Docker socket 即可开始使用。 ## 为什么使用它 把它交给朋友、同事,或者干脆在一个用后即弃的环境中进行测试——他们会获得一个真正的 Alpine 环境,并在断开连接的瞬间消失,不会留下任何你忘记清理的正在运行的进程。 它也非常适用于家庭服务器设置:将人们指向它,他们就能立即获得 Linux 访问权限,无需创建真实账户,事后也无需记住去清理容器。 ## 安全模型 sshbox 接受任何用户名和密码——身份验证完全交由部署在其前端的组件(如 Tailscale、VPN 或堡垒机)来处理。切勿将端口 2222 直接暴露在公网上。 每次连接都会获得自己的容器:不挂载主机中的任何内容,默认无网络访问权限,内存限制在 256MB 且最多使用半个 CPU,并在断开连接的瞬间被终止。这将会话之间以及会话与主机之间进行了隔离,但如果有人试图主动突破,这并不是一个经过安全强化的沙盒。

rm -rf / inside sshbox, then reconnecting to a fresh container
rm -rf / inside the container -- disconnect, reconnect, like it never happened

## 快速开始 需要先运行 Docker(`docker info` 应该能成功执行)——在 macOS 上使用 `brew install --cask docker`,在 Linux 上使用 `curl -fsSL https://get.docker.com | sh`,或者在 Windows 上使用 Docker Desktop。如果你使用的是预编译的二进制文件,则不需要安装 Go。 从[最新发布](https://github.com/kknxzz/sshbox/releases/latest)中获取适用于你平台的压缩包并解压,例如: ``` curl -LO https://github.com/kknxzz/sshbox/releases/download/v1.1.0/sshbox_1.1.0_linux_amd64.tar.gz tar -xzf sshbox_1.1.0_linux_amd64.tar.gz cd sshbox_1.1.0_linux_amd64 ``` (根据你的操作系统/架构替换相应的文件名——Windows 版本是以 `.zip` 格式提供的) 可选步骤——使用同一版本中的 `checksums.txt` 校验下载的文件: ``` shasum -a 256 -c checksums.txt --ignore-missing # sha256sum on Linux ``` 运行它,然后从另一个终端连接: ``` ./bin/sshbox ``` ``` ssh -p 2222 anyone@localhost ``` 使用任何用户名和密码均可登录。退出或断开连接后,容器将被销毁——`docker ps -a` 将无法再看到它。建议也浏览一下压缩包中的 `README.txt`——其中包含关于各项参数和配置的快速参考。 或者选择从源码构建:`git clone` 该仓库(需要安装 Go)并运行 `go run .`,或者从发布页面获取仅包含源码的压缩包(`sshbox_1.1.0_source.tar.gz`,不含文档和多媒体文件)并运行 `go build .`。 ## 配置 sshbox 默认从当前目录读取 `config.toml`。每个字段都有对应的 flag,如果传入则会覆盖配置文件中的值;可以使用 `--config path/to/file.toml` 指向不同的配置文件。 | 字段 | Flag | 默认值 | 含义 | |-------|------|---------|---------| | `listen_addr` | `--listen` | `:2222` | SSH 服务器绑定的地址 | | `image` | `--image` | `alpine:latest` | 每次会话运行的镜像 | | `shell` | `--shell` | `/bin/sh` | 在容器内运行的命令 | | `network` | `--network` | `none` | Docker 网络模式 | | `memory` | `--memory` | `256m` | Docker 内存限制 | | `cpus` | `--cpus` | `0.5` | Docker CPU 限制 | | `idle_timeout` | `--idle-timeout` | `10m` | 超过此时间无活动则断开连接 | | `host_key_path` | `--host-key` | `host_key` | 存储 ssh 主机密钥的路径,首次运行时自动生成 | | `runtime` | `--runtime` | `docker` | 容器 runtime 的二进制文件——`docker` 或 `podman` | ## 限制 - 无身份验证——参见上方的安全模型。 - 仅支持单节点,不支持集群,不支持远程 Docker 主机。 - 无持久化存储——会话之间不会保留任何数据。 - 不支持 SFTP、SCP 或端口转发。 - 不支持 Docker Compose——每次会话仅限一个镜像、一个容器。 - 仅支持 Linux 容器。 - `alpine:latest` 非常精简——没有 curl、没有 sudo、也没有 bash,只有 busybox 和 `apk`。手动执行 `apk add curl` 完全没问题,只是不会保留到下次会话。如果觉得麻烦,可以将 `image` 指向功能更丰富的镜像。 - PTY 支持涵盖了常规的交互式 shell:颜色、调整大小、历史记录。对于包含非常规 escape 序列的全屏应用程序,尚未经过详尽测试。 ## 贡献 欢迎提交 PR——请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解代码风格说明。标记为 `good-first-issue` 的 Issue 是一个很好的入门起点。如果觉得这个项目有用,欢迎点亮 Star。 ## 许可证 MIT
标签:Alpine, Docker, EVTX分析, Go, Python安全, Ruby工具, SSH, 内存分配, 安全防御评估, 日志审计, 沙箱环境, 请求拦截, 运维工具