将 ssh 限制到特定主机名

将 ssh 限制到特定主机名

问题是这样的:

  • 我有一台具有多个主机名的服务器,这意味着我有 A 记录example.com*.example.com指向服务器的 IP 地址
  • 我想限制传入的 ssh 连接与特定的主机名,也就是说,我只想允许登录到[电子邮件保护]并禁止使用 user@ip-address 或[电子邮件保护]

sshd_config 的手册页包含以下内容ListenAddress

Specifies the local addresses sshd(8) should listen on.  
The following forms may be used:

ListenAddress host|IPv4_addr|IPv6_addr
ListenAddress host|IPv4_addr:port
ListenAddress [host|IPv6_addr]:port

这似乎表明 sshd 有能力将自身限制在特定主机名上。但是我尝试过ListenAddress secret.example.com:22,但在重新启动 sshd 后,似乎没有根据使用的主机名添加任何限制。

man sshd_config似乎没有显示任何其他类似的选项。

是我遗漏了什么,还是 sshd 根本没有这种能力?

答案1

不存在“DNS”连接。客户端获得 IP 后,只能建立 TCP/IP 连接。服务器只能看到 IP,因此不知道客户端使用什么名称来查找服务器。

我们之所以有网站虚拟主机是因为客户传输请求特定主机的标头。事实上,直到 SSL(TLS) 被修改为允许在初始连接期间进行“服务器名称指示”时,虚拟主机才与 SSL 兼容。

要使“虚拟主机”与 SSH 配合使用,客户端需要一种在连接时传输主机名的方法。但即使 SSH 支持这样的功能,通过要求使用特定主机名,您也无法增加任何安全性。原因是 sshd 必须解密攻击者的数据包才能运行过滤器。只要您禁用 SSH 密码,解密攻击者的数据包以与您的 SSH 密钥进行比较就没有什么区别。

如果您不想被扫描,请移动 SSH 端口和/或安装 fail2ban。如果您真的很偏执,您可以安装一个端口敲门器,将您的开放端口“隐藏”在临时扫描器之外和/或使用 iptables 将 IP 地址列入白名单。

答案2

是我遗漏了什么,还是 sshd 根本没有这种能力?

从根本上讲,DNS 不具备这种能力。客户端将 DNS 名称解析为 IP,然后尝试连接到该 IP,因此此信息在连接时会丢失(除非 SSH 以服务器可以在登录前使用的方式传输它,但我认为它不会这样做)。

答案3

摘自另一个科幻问题,这个怎么样?

您可以在 /etc/ssh/sshd_config 中使用 AllowUsers 指令,例如 AllowUsers[电子邮件保护]

如果您对 sshd_config 文件进行了任何更改,请不要忘记重新启动 sshd。

来自 sshd_config 手册页

此关键字后面可以跟一串用户名模式,以空格分隔。如果指定,则仅允许与其中一个模式匹配的用户名登录。'*' 和 '?' 可用作模式中的通配符。只有用户名才有效;数字用户 ID 无法识别。默认情况下,允许所有用户登录。如果模式采用 USER@HOST 形式,则分别检查 USER 和 HOST,将登录限制为特定主机的特定用户。

-- original answer ends --

据我所知,您可以定义一个通配符,这样只有提供正确通配符匹配主机名元素的用户才会被 SSHd 监听,例如*@sub.domain.tld。Boom!基于 IP 的用户登录被拒绝。

不要DenyUsers *在 AllowUsers / AllowGroups 声明之后放置任何类似的东西。拒绝列表在允许列表之前进行评估,并将覆盖任何明确的允许。我没有尝试过,但从我过去读到的内容来看,一旦明确定义了允许列表,您可能甚至不需要定义DenyUsers *

只是不要忘记始终允许自己。;-)

答案4

您可以做的是,在机器上设置多个 IP 地址。然后,您的每个 A 记录都指向不同的 IP 地址,这些 IP 地址最终都指向同一个盒子。然后,您将能够使用 ListenAddress 进行限制。不太确定您从中获得了什么,因为最终,它还是同一台机器。

相关内容