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, 内存分配, 基础设施, 堡垒机, 安全合规, 安全网关, 安全防御评估, 开发环境, 数据集, 日志审计, 流量管控, 程序破解, 端口转发, 网络代理, 网络安全, 访问控制, 请求拦截, 跳板机, 运维工具, 连接代理, 防火墙, 隐私保护, 零信任