
farmer1992/sshpiperdSSH Piper 作为一个类代理工具,通过 username、src ip 等信息路由连接。
+---------+ +------------------+ +-----------------+ | | | | | | | Bob +----ssh -l bob----+ | SSH Piper +-------------> Bob' machine | | | | | | | | | +---------+ | | | | +-----------------+ +---> pipe-by-name--+ | +---------+ | | | | +-----------------+ | | | | | | | | | Alice +----ssh -l alice--+ | +-------------> Alice' machine | | | | | | | +---------+ +------------------+ +-----------------+ Downstream SSH Piper Upstream
docker run farmer1992/sshpiperd
使用工作目录上游驱动运行
docker run -d -p 2222:2222 \ -v /etc/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ -v /YOUR_WORKING_DIR:/var/sshpiper \ farmer1992/sshpiperd
使用额外挑战运行
使用环境变量 SSHPIPERD_CHALLENGER 指定要使用的挑战程序
docker run -d -p 2222:2222 \ -e SSHPIPERD_CHALLENGER=pam \ -v /YOUR_PAM_CONFIG:/etc/pam.d/sshpiperd \ -v /etc/ssh/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \ -v /YOUR_WORKING_DIR:/var/sshpiper \ farmer1992/sshpiperd
运行 sshpiperd 示例目录中的 showme.sh 脚本,或复制粘贴以下命令运行:
go get github.com/tg123/sshpiper/sshpiperd && `go env GOPATH`/src/github.com/tg123/sshpiper/sshpiperd/example/showme.sh
示例脚本将设置一个 sshpiper 服务器,配置如下:
bitbucket -> ***:22 # ssh 127.0.0.1 -p 2222 -l bitbucket github -> ***:22 # ssh 127.0.0.1 -p 2222 -l github gitlab -> ***:22 # ssh 127.0.0.1 -p 2222 -l gitlab
连接到 gitlab:
$ ssh 127.0.0.1 -p 2222 -l gitlab Permission denied (publickey).
连接到 github.com:
$ ssh 127.0.0.1 -p 2222 -l github Permission denied (publickey).
sshpiper 提供了 3 个可插件化组件,用于高度自定义您的管道:
使用 sshpiperd daemon -h 了解更多信息
--upstream-driver=)上游驱动帮助 sshpiper 确定要连接的上游主机以及如何连接。例如,您可以通过配置上游驱动更改连接到上游 sshd 时的用户名。
工作目录驱动
工作目录是一个类似 /home 的目录。SSHPiperd 从 workingdir/[username]/ 读取文件以了解上游的配置。
数据库驱动
数据库上游驱动连接到流行的数据库,如 mysql、pg 或 sqlite 等,以提供上游信息。
Kubernetes 驱动
Kubernetes 驱动可以使用 CRD 配置管道。
在 SSH 公钥认证期间,RFC 4252 第 7 节 中规定,SSH 客户端使用私钥对 session_id 和其他数据进行签名生成 sig。这是为了让服务器验证连接来自客户端而非"中间人"。
然而,sshpiper 实际上持有两个 SSH 连接,它正在执行"中间人"的操作。这两个 SSH 连接的 session_id 永远不会相同,因为它们是共享密钥的哈希值。RFC 4253 第 7.2 节。
为了支持公钥认证,sshpiper 将使用上游驱动提供的私钥修改 sig。例如,workingdir/[username]/ 中的 id_rsa。
工作原理:
+------------+ +------------------------+ | | | | | client | | SSH Piper | | PK_X +--------> | | | | | v | | | | Check PK_X | +------------+ | in authorized_keys | | | | | | | +----------------+ | v | | | | sign agian | | server | | using PK_Y +--------------> check PK_Y | | | | | | | | | +------------------------+ +----------------+
例如:
在客户端上:
ssh-copy-id -i PK_X test@sshpiper
在 ssh piper 服务器上:
ln -s ~test/.ssh/authorized_keys workingdir/test/authorized_keys ssh-keygen -N '' -f workingdir/test/id_rsa # 这是 PK_Y ssh-copy-id -i workingdir/test/id_rsa test@server
现在 ssh test@sshpiper -i PK_X,sshpiper 将向服务器发送 PK_Y 而不是 PK_X。
--challenger-driver=)sshpiper 允许您在连接到上游之前添加自己的挑战。如果客户端在此挑战中失败,连接将被关闭。然而,客户端必须通过上游服务器的认证才能建立整个连接。"额外挑战"是必需的,但并不足够。
当您想要使用公钥和类似 google-authenticator 之类的工具时,这非常有用。OpenSSH 不支持同时使用公钥和其他认证方式。
pam
Linux-PAM 挑战程序
此模块使用名为 sshpiperd 的 pam 服务
您可以在 /etc/pam.d/sshpiperd 配置规则
azdevcode
支持 Azure AD 设备代码授权,更多信息
authy
支持来自 <[***]> 的令牌和一键验证
--auditor-driver=)审计器为 SSH Piper 传输的消息提供钩子,可以将消息记录到磁盘或动态过滤某些特定消息。
SSH 会话日志记录 (--auditor-driver=typescript-logger)
当允许 record_typescript 时,每个管道连接将被记录到 --auditor-typescriptlogger-outputdir 中的 typescript) 文件。
文件格式与 scriptreplay(1) 兼容。
示例:
$ ./sshpiperd daemon --auditor-driver=typescript-logger ssh user_name@127.0.0.1 -p 2222 ... 执行一些命令 exit $ cd workingdir/user_name $ ls *.timing *.typescript ***.timing ***.typescript $ scriptreplay -t ***.timing ***.typescript # 将重放 SSH 会话
SSH Piper 附带了用于列出/添加/删除管道的工具。
使用 sshpiperd pipe -h 了解更多信息。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务