仅向 sshed 用户公开公共端口

仅向 sshed 用户公开公共端口

我们有一个在 AWS 上运行的 VPS,尽管无论托管供应商如何,都需要通用解决方案。

该 VPS 充当各种其他内部服务器的 Jump Box(运行 CentOS 6),例如通过 SSH 访问其他各种盒子(通过反向 SSH 连接到 Jump Box)。 Jump Box 为每个服务公开随机的更高端口。

是否有可能仅将这些较高端口公开给当前通过 SSH 连接到 Jump Box 的 IP 地址?

我正在考虑扫描输出以who -a过滤 IP 地址并IPTABLES使用 cronjob 更新,或者可能使用 API 更新 AWS 的安全组。但这种方法似乎很粗略。有什么建议么?

答案1

如果您在启动 ssh 连接时知道目的地/端口

理想情况下,我建议您使用类似于ssh -L 8080:10.0.0.1:80 <JumpBox address>您正在寻找的位置的内容连接到 JumpBox10.0.0.1 它位于防火墙/NAT 后面,但可以通过 JumpBox 访问

这将创建一个连接并绑定到 127.0.0.1 (localhost),这样如果您打开浏览器 (或者其他一些软件)在您的客户端上并连接到http://本地主机:8080您的数据包将被路由到10.0.0.1:80就像您直接从 JumpBox 本身进行访问一样。


如果在 [ssh] 连接时无法知道端口号/目的地

需要注意的是,客户端配置为使用 SOCKS/SOCKS5 代理,您可以为连接的客户端提供对服务器可访问的任何资源的访问权限:

使用“动态转发”连接到您的 VPS

  1. ssh -D 1080 <JumpBox address>
  2. 配置客户端软件使用SOCKS代理服务器localhost:1080
  3. 通过配置的软件进行的连接将通过隧道进行连接,就像您从 JumpBox 本身连接到任何目的地一样。

答案2

您可以使用构建所描述的系统iptables,IP集pam_exec

这个想法如下:有一个单独的链,其中包含允许传入流量到达这些较高端口的规则。 iptables INPUT 链包含一个IP集规则匹配您登录的主机,跳转到单独的链。成功登录后,pam_exec 运行一个脚本(在 PAM 会话打开时)将远程主机的 IP 地址添加到 ipset 集中,并在 PAM 会话关闭时类似地删除它。

配置 IPTABLES 和 IPSET

为用户的 IP 地址创建一组。由于 ipset 不是持久性的,因此您需要在 iptables 恢复之前将其配置为在启动时创建。

ipset -N users hash:ip

配置 iptables。一个新INPUT-users链将包含允许登录用户进行流量的规则。

iptables -N INPUT-users

如果源地址已users设置,则跳转到INPUT-users链。

iptables -A INPUT -m set --match-set users src -j INPUT-users

添加相关规则到INPUT-users链中。这些规则将用于源地址与您的用户地址匹配的流量。例如允许tcp端口16384

iptables -A INPUT-users -p tcp --dport 16384

配置PAM

创建要在 pam 会话打开/关闭时执行的以下脚本。 IP地址将在PAM_RHOST环境变量中设置pam_exec

/etc/security/pam_exec-session_open

#!/bin/sh
ipset --exist --add users "$PAM_RHOST"

/etc/security/pam_exec-session_close

#!/bin/sh
ipset --del users "$PAM_RHOST"

然后配置 pam 以将它们用于 ssh 会话。附加到/etc/pam.d/sshd

session optional    pam_exec.so type=open_session /etc/security/pam_exec-session_open
session optional    pam_exec.so type=close_session /etc/security/pam_exec-session_close

陷阱

  • 如果您的用户打开了多个 ssh 会话,关闭其中任何一个会话都会从 ipset 中删除该 IP 地址。为了避免这种情况,您需要为 session_close 脚本编写一些检查,以仅当它是用户剩余的最后一个会话时才删除 IP 地址。

  • 如果您的用户在 NAT 后面连接,则连接后同一 NAT 后面的任何人都会匹配 ipset 规则(允许访问)。

相关内容