我正在管理一个 AWS 集群,目前计划仅通过单个跳线盒运行 ssh 访问,而不是处理不断变化的访问列表的公钥或 LDAP 身份验证。相反,跳转盒的公钥将在所有其他实例上获得授权,并且它管理哪些用户可以访问哪些其他实例。但是,我不想将私钥暴露给普通用户。
我最初的解决方案是在 bash 中编写一个简单的 shell,该 shell 执行ssh [myserver]
并让用户运行ssh username@aws-jumpbox [myserver]
以连接到myserver
,或者建立一个仅接受ssh
命令的交互式会话。然而,我后来才想起来,你不能从 shell 脚本中生成交互式会话。
有没有一种简单的方法可以实现我正在寻找的目标?我是否完全走上了错误的道路?
答案1
然而,我后来才想起来,你不能从 shell 脚本中生成交互式会话。
是的,您可以,但是您必须传递-t
给ssh
命令(建立连接的命令)到跳转主机,而不是主机从跳跃乔斯特)。原因是,如果您在运行时指定命令ssh
,默认情况下它不会分配交互式会话所需的 tty。-t
解决这个问题。
一些可能的替代方案:
- 使跳转主机上的脚本允许用户以交互方式选择主机名,可能使用类似
dialog
.此方法的缺点:使他们更难运行非交互式会话。 - 在每个目标机器的跳转主机上创建一个用户,以目标机器命名。此方法的缺点:您需要在许多文件中维护用户的 ssh 密钥。为此,最好使用一些配置管理系统;例如,puppet 支持
authorized_keys
直接处理文件和 ssh 密钥。好处是您可以更轻松地定义哪个用户可以访问哪个主机。
请注意,如果您不希望您的用户能够获取 ssh 私钥,您应该确保他们也无法使用scp
或sftp
访问您的跳转主机。这可能会使他们的工作变得更加困难。
总而言之,就我个人而言,我不确定您想做的事情是否是个好主意。你的跳转主机并不能解决“太多 ssh 密钥”的问题,它只是移动它,并引入了很多它自己的问题(没有 scp/sftp;你添加的主机对于试图攻击的攻击者来说是一个很好的目标)访问全部网络上的主机,因此从安全角度来看,存在 SPOF;交互式会话和指定命令的问题)。
相反,我建议如下:
- 在 AWS 主机上使用配置管理系统,并确保它在启动前运行
sshd
。出于各种原因,无论如何这都是一个好主意。我比其他选择更了解木偶,但还有其他选择。 如果使用 puppet,请使用用户的 ssh 密钥创建一个文件,如下所示:
$user_wouter_sshkey = 'ssh public key data' $user_john_sshkey = 'ssh public key data'
ETC。
对于您想要授予资源访问权限的每组用户,创建一个定义的类型:
define dbassh ($username = $title) { ssh_authorized_key {"wouter_dba_$username": key => $user_wouter_sshkey, type => 'ssh-rsa', user => $username, } ssh_authorized_key {"john_dba_$username": key => $user_john_sshkey, type => 'ssh-rsa', user => $username, } }
ETC。
现在,在您的木偶配置中的其他地方,您可以执行以下操作:
user {"postgres": ensure => present, purge_ssh_keys => true, } dbassh {"postgres":}
答案2
答案3
1) 在跳转主机上建立 SSH 安全。如果您没有静态 IP,则仅允许您的企业公共 IP 地址或 ISP 提供的 IP 地址块。然后,您可以强制在家工作的用户首先使用 VPN 连接到您的内部网络。
https://www.freebsd.org/cgi/man.cgi?query=sshd_config&sektion=5
2) 将其他服务器的 SSH 登录锁定为仅来自该跳转主机服务器。
https://www.freebsd.org/cgi/man.cgi?query=sshd_config&sektion=5
3) 在服务器上创建一个功能帐户,并从该功能/管理帐户推送 SSH 密钥。使用 sudoers 等一系列安全功能进行锁定。 MyCorporation...mycorpsql、mycorpweb、mycorpdev、mycorpsys。
您还可以有效地使用本地安全组来锁定 su。
实际上,您只需从组中删除用户并禁用他们的帐户即可。您可以为此在根目录上创建一个脚本。
删除/终止用户
#!/bin/bash
# title : deladminusers.sh
# syntax : deladminusers.sh username
gpasswd -d $1 youradmingrouphere
userdel $1
禁用用户
#!/bin/bash
# title : disableadminusers.sh
# syntax : disableadminusers.sh username
gpasswd -d $1 youradmingrouphere
#makes password incomprehensible
sed -i "s/$1:/$1:!/g" /etc/shadow
启用用户
#!/bin/bash
# title : enableadminusers.sh
# syntax : enableadminusers.sh username
gpasswd --add $1 youradmingrouphere
#makes password comprehensible again.
sed -i "s/$1:!/$1:/g" /etc/shadow
4) 将 SSH 密钥从跳转主机推送到所有服务器。然后锁定功能帐户配置文件上的 ssh 文件,以便它们只能读取执行。
fiduser@jumphost ~: ssh-keygen -t rsa
fiduser@jumphost ~: for SERVER in `cat ~/serverlist`
do
ssh-copy-id -i .ssh/rsa_id.pub fiduser@$SERVER
done
5) 锁定允许 SU 到功能 ID 的用户,并确保跳转主机已被严格锁定。禁用跳转主机上的正常二进制访问。允许所有用户使用 SU 和 SSH - 甚至是该跳转主机上除 root 之外的功能帐户。登录后将无密码 SSH 的要求降至最低。
我不熟悉您的跳转主机的操作系统版本。您必须进行调查,因为通过将用户添加到组来锁定基本用户命令可能很难解释不同的发行版。
使用一些强力对策。也许可以使用 fail2ban?
只需确保其配置为不禁止您的企业 IP 范围即可。另外,不要忘记锁定您办公室内部的 Jump-host。