我们有堡垒服务器 B。我们需要使用私钥通过 B 从 A 到 C 进行 SSH 连接。
更好的选择是什么:
放在服务器上的私有 SSH 密钥B. 我们读到在生产环境中这样做是个坏主意。
从这里:
切勿将 SSH 私钥放在堡垒实例上。相反,使用 SSH 代理转发先连接到堡垒,然后从那里连接到私有子网中的其他实例。这样,您就可以将 SSH 私钥保留在您的计算机上。
使用SSH 代理转发。为了设置代理转发,我需要允许 TCP 转发。设置代理转发时,会在转发主机上创建一个套接字文件,这是将密钥转发到目的地的机制。在 AWS 的 Bastion 设置中:
TCP 转发:将此值设置为 true 将启用 TCP 转发(SSH 隧道)。这可能非常有用,但也存在安全风险,因此我们建议您保留默认(禁用)设置,除非需要
更多来自这里:
SSH 代理转发被认为有害
有什么更好的方法吗?第二个链接中的替代方案怎么样:代理命令,我知道它有助于解决套接字文件问题,但我仍然认为我必须启用 TCP 转发,那么它是否足够安全?
答案1
使用 ProxyCommand 或 ProxyJump
我建议使用ProxyCommand
(或者更好,ProxyJump
因为语法更简单,但我认为在客户端需要 openssh 7.3+),并且您不需要在 Bastion 上部署私钥,一切都保持本地。
ProxyJump 示例
在您的客户端计算机上,您编写了一个文件~/.ssh/config
,其内容类似于以下内容:
Host bastion
HostName bastion.example.com
User bastion-user
Port 22
IdentityFile ~/.ssh/id_bastion
Host srvC
HostName srvC.local
User server-user
IdentityFile ~/.ssh/id_protected_lan
ProxyJump bastion
然后这样做ssh srvC
将通过 B(堡垒)将您连接到 C,无需代理转发,也无需将私钥部署到堡垒。
在上面的例子中,“bastion”是 Bastion 主机的别名,srvC 是服务器 C 的别名。在 中,HostName
您需要输入主机的 IP 地址或真正的完全合格域名。对于用户,您需要更新User
Bastion 和服务器 C 上的正确登录名。最后,IdentityFile
如果您使用本地代理(例如 KeeAgent 或 ssh-agent),则 是可选的,但如果它没有运行,它也会工作并要求您输入每个密钥的密码。
部署公钥
当然你需要部署民众bastion 和 srvC 的密钥。您可以使用($ 符号只是为了说明提示,请不要输入它):
$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
srvC
注意:上述操作仅在仍允许密码验证的情况下才有效。完成上述部署并验证一切正常后,您应该在 2 台服务器上禁用密码验证。
使用 ProxyCommand 代替 ProxyJump 的示例
如果您的 OpenSSH 版本较旧,不支持ProxyJump
(在客户端),则替换:
ProxyJump bastion
经过
ProxyCommand ssh -q -W %h:%p bastion
据我了解,这是类似的。
答案2
我看到了关于ProxyJump的回答。我们来谈谈代理命令。
但请稍等一下!我可以写信给你如何入侵服务器使用代理转发,这样就更容易理解差异了!
开始破解吧!
对于基本步骤:你可以阅读我的帖子这里
基本步骤如下:
- 创建堡垒用户
- 禁用 root 登录
- 阻止黑客攻击
- 更改端口
- 配置防火墙
- 配置 SELinux
如何使用 AgentForwarding
-在 ~/.ssh/config 中创建配置
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
-将您的身份验证密钥添加到 ssh-agent
ssh-add ~/.ssh/name_rsa
-连接到堡垒
ssh bast
-从堡垒机连接应用服务器
ssh app@IP -p PORT
黑客攻击!
您可能会问我这个问题:
我的服务器安全吗?答案很简单:
- 不!
为什么?
- 因为您正在使用 SSH 代理转发!
那么问题又在哪里呢?
- 因为代理转发很危险并且被认为是有害的。
为什么?
- 让我们彻底解释一下:当您连接堡垒主机时,您的 ssh 代理将被转发。这意味着将设置套接字,以便有人可以使用此套接字数据访问您的服务器。想象一下您的堡垒服务器受到攻击,如果有人在您的 Linux 服务器上拥有足够的权限,他/她将只使用您的套接字信息。结果,您的所有服务器都可以访问。我知道妥协的窗口非常小,因为这取决于您连接到堡垒主机的时间。但是当您有其他选项(如 ProxyCommand)时,您真的想冒险吗?因此,只需使用 ProxyCommand!
如果堡垒主机被攻陷,该如何破解服务器?
追踪目标
在 /tmp 目录中你可能会看到类似这样的内容:
[root@localhost tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
让我们打开临时文件
[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
让我们来看看連接到该进程 id。
netstat -nxp | grep 10507
结果:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
和谁有连接?
lsof -i -a -p 10507
结果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
我们还可以看到socket文件:
cd /proc/10507/fd/
ls
结果:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
和会发生什么当客户将连接到远程服务器?让我们看看:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
我们甚至可以使用 netstat 查看套接字文件是否被使用:
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
窃取套接字信息和 IP 地址
现在我们需要在堡垒机会话处于打开哦,我们还需要目标服务器 IP,因此只需使用 netstat:
netstat -tn
这最后一步使用转发的套接字文件
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
检查密钥是否已加载。
ssh-add -l
结果应该是像那样:
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
服务器被黑客入侵,如何解决安全问题?
代理命令
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
对于基本操作:如何通过服务器传输文件(从客户端到服务器,从服务器到客户端),您可以阅读我的帖子这里
结论
- 如果您使用堡垒主机,请不要使用 AgentForwarding,而要使用 ProxyCommand
- 始终使用非 root 用户进行身份验证
- 使用防火墙并阻止所有不必要的连接。
- 使用 SELinux(一般情况下)
- 阻止使用错误凭据多次尝试登录的 IP 地址
- 如果没有必要,不要给用户 sudo 权限
- 监控您的服务器
- 更新服务器的安全补丁
更多信息,请参阅我的博客。另外我还有一些截图,可能对你有帮助。
答案3
只需使用SSH 代理转发就像大多数人一样。
- 钥匙将位于ssh 代理在您的笔记本电脑上。
- 您登录到堡垒,通过代理进行身份验证。
- 从那里登录到目标主机,并发出身份验证请求转发回你的笔记本电脑。
优点:堡垒上没有存储可能被滥用的密钥。
希望有帮助:)