cedws/sshgate

GitHub: cedws/sshgate

这是一个具备基于策略连接控制功能的纯转发 SSH 服务器,旨在构建无 Shell 访问权限的受限跳板机或堡垒机。

Stars: 1 | Forks: 1

# ssh sshgate 一个具有基于策略的连接控制功能的仅转发 SSH 服务器,用于受限的跳板机和堡垒机。 我为我的实验性 [devenv](https://github.com/cedws/devenv) 项目开发了它,该项目旨在构建一个具有受限出站流量的锁定开发环境。sshgate 帮助实现了我的目标,即仅允许到 `github.com:22` 的出站 SSH 流量。 ## 安装 ### Brew ``` brew install cedws/tap/sshgate ``` ### Scoop ``` scoop bucket add cedws https://github.com/cedws/scoop-bucket.git scoop install sshgate ``` ### Docker ``` docker pull ghcr.io/cedws/sshgate:latest ``` ## 使用 sshgate 是一个仅处理 `direct-tcpip` 通道的 SSH 服务器,这意味着如果存在允许已连接身份的规则,它将仅不透明地转发来自远程主机的流量。它不分配 PTY。 复制示例 `config.json` 并将你自己的 SSH 公钥添加到 `authorized_keys` 数组中,然后启动它: ``` sshgate --config config.json ``` 现在你可以将其用作跳板主机来访问远程主机: ``` ssh -J localhost:2222 git@github.com ``` 示例配置包含一条允许客户端跳转到 `github.com:22` 的规则。如果你尝试其他主机或端口,将会看到类似以下内容: ``` $ ssh -J localhost:2222 bitbucket.org channel 0: open failed: administratively prohibited: remote connection denied stdio forwarding failed Connection closed by UNKNOWN port 65535 ``` sshgate 不关心用于跳转跳板的用户名。它也不关心后续跳转中的用户名;该信息是不透明的,它只是将流量转发给客户端。 ### 规则 默认策略是阻止所有连接。`rules` 数组描述了允许转发到哪些主机和端口。如果你只想将 sshgate 用作没有防火墙功能的堡垒机,可以使用 `--ruleless` 运行它,这将禁用防火墙规则。 主机可以是以下任意一种: * 主机名(例如 `github.com`,不支持通配符) * IP 地址(例如 `1.1.1.1`) * CIDR 范围(例如 `192.168.1.1/24`) 如果在规则中未指定端口,则默认允许端口 22。 ### 身份 由于我们之前没有向 sshgate 传递任何 SSH 主机密钥,它在启动时生成了一个临时的 ED25519 主机密钥。为了让服务器具有持久身份,请生成一个 SSH 密钥对并在配置文件中相应地设置 `host_key_paths`。你可以设置 ED25519、ECDSA 和 RSA 主机密钥。 例如,要设置服务器的 ED25519 身份: ``` ssh-keygen -t ed25519 -f sshgate ``` 添加到配置中: ``` { "host_key_paths": { "ed25519": "./sshgate" } } ``` ## Tailscale 集成 sshgate 可以像设备一样直接加入你的 Tailscale 网络(tailnet)。你可以在 JSON 配置中配置 tailnet 主机名和端口: ``` { "tsnet": { "enabled": true, "hostname": "sshgate", "port": 22 } } ``` 要让 sshgate 加入你的 tailnet,请在 Tailscale 控制台中创建一个 `Linux server` 设备并复制 auth key。将该值作为环境变量 `TS_AUTH_KEY` 导出并启动 sshgate。 ``` export TS_AUTH_KEY=tskey-auth-xxx sshgate --config config.json ``` 你应该会看到 sshgate 使用配置的主机名加入 tailnet,并且能够使用任何授权密钥通过 SSH 连接到它。 使用 Tailscale 的 [tsnet](https://tailscale.com/kb/1244/tsnet) 库,sshgate 可以通过 Tailscale 身份验证客户端,从而无需在配置中管理公钥,而 [app capabilities](https://tailscale.com/kb/1537/grants-app-capabilities) 允许直接在 tailnet 访问控制中配置 SSH 规则。 使用此 tailnet 策略文件作为起点。应用策略后,你需要将 `sshgate` 标签附加到网络上的 `sshgate` 机器。 ``` { "tagOwners": { "tag:sshgate": ["autogroup:admin"] }, "grants": [ { "src": ["*"], "dst": ["tag:sshgate"], "ip": ["22"], "app": { "github.com/cedws/sshgate": [ { "hosts": ["github.com"], "ports": [22] } ] } } ] } ``` 确保 `"github.com/cedws/sshgate"` 下的 JSON 格式正确,否则客户端将无法连接。
标签:direct-tcpip, Docker, EVTX分析, Go语言, JSONLines, SSH, SSH隧道, Streamlit, 内存分配, 基础设施, 堡垒机, 安全合规, 安全网关, 安全防御评估, 开发环境, 数据集, 日志审计, 流量管控, 程序破解, 端口转发, 网络代理, 网络安全, 访问控制, 请求拦截, 跳板机, 运维工具, 连接代理, 防火墙, 隐私保护, 零信任