msc*_*lli 5 ssh ssh-tunneling ssh-agent
假设以下设置:
bob
在他的工作站上本地工作foo
。alice
在她的工作站上本地工作bar
。bob
可以baz:22
通过存储在bob@foo:.ssh/id_rsa
.alice
可以通过 ssh 访问bob
工作站,foo:22
但不能访问服务器baz
。有没有办法让bob
sshbaz
共享他的会话(通过端口转发?)或密钥(通过ssh-agent
转发?),以便alice
可以baz
从bar
via foo
(假设bob
身份在foo
)访问?
附录:
还有一些我应该澄清的想法:
bob
不想alice
知道他的密码bob
不希望alice
能够运行rm -rf /home/bob
在foo
(上baz
不过这将是罚款很明显)。正如@mukesh-sai-kumar所建议的那样,人们可以从那里alice
登录foo
(作为bob
?)并ssh
使用共享密钥。
到目前为止我能看到的最好的方法是为alice
on创建一个新的密钥对bar
,允许公钥打开foo
并自动运行ssh bob@baz
via文件中的command="ssh [...]"
选项authorized_keys
。
这将允许设置ssh baz
上bar
实际ssh bob@foo
通过使用新的密钥对alice@bar:.ssh/config
与转发bob@foo
使用该特定键登录到bob@baz
通过bob@foo:.ssh/authorized_keys
(授权alice
的关键,但限制command
到ssh baz
通话)。
这样,两个新的约束将得到满足,alice
甚至不会看到任何东西,如这个假设的交互式会话所示:
[alice@foo:~] (1) $ hostname
foo
[alice@foo:~] (2) $ whoami
alice
[alice@foo:~] (3) $ ssh baz
[bob@baz:~] (1) $ hostname
baz
[bob@baz:~] (2) $ whoami
bob
[bob@baz:~] (3) $ exit
[alice@foo:~] (4) $ hostname
foo
[alice@foo:~] (5) $ whoami
alice
[alice@foo:~] (6) $
Run Code Online (Sandbox Code Playgroud)
唯一剩下的问题是bob
ssh 密钥 onfoo
需要与 from (via ?)bob
发起的会话共享。ssh
alice
ssh-agent
Alice 可以向 Bob 提供她的公钥,Bob 可以在自己的.ssh/authorized_keys
文件中添加一行,以允许 Alice 在 Bob 的工作站上启动 ssh 会话(作为 Bob)foo
。使用该command=
选项,Bob 可以限制 Alice 的密钥不授予交互式 shell,而是授予baz
Bob 的嵌套 ssh 连接,并使用 Bob 本地可访问的密钥bar
。
command="ssh -I .ssh/id_rsa bob@baz:22" ssh-rsa AAA...== alice@whatever
或者,您可以包含更多约束选项(no-port-forwarding
、from=
等 - 请参阅sshd
有关 AUTHORIZED_KEYS 文件格式的手册页部分)。
当 Alice 运行ssh bob@bar
并使用她的私钥进行身份验证时,她将连接bar
到 上的 ssh 会话baz
,而对 Bob 工作站上的中间会话没有任何控制权。
请注意,从(日志记录、安全审计)的角度来看baz
,Alice 发起的隧道连接与 Bob 从他自己的工作站发起的“正常”连接之间没有区别。这可能是您所要求的,但不是您想要的。
为了使受保护的密钥可供 Alice 的会话使用,您可以显式地将环境变量设置SSH_AUTH_SOCK
为 Bob 用于其会话的路径(将条目更改authorized_keys
为command="SSH_AUTH_SOCK=/path/to/bobs/agent_socket ssh bob@baz:22" ssh-rsa AAA...
)以避免在路径更改时必须更新路径(通常是注销/登录) ),Bob 可以代表 Alice 运行专用代理,并指定显式路径(ssh-agent -a ~/.ssh/agent_for_alice
并且仅添加特定密钥并SSH_AUTH_SOCK=~/.ssh/agent_for_alice ssh-add ~/.ssh/id_rsa
输入密码。