是否可以使用 2 种不同的身份验证方案在 SSH 上打开 2 个端口?

是否可以使用 2 种不同的身份验证方案在 SSH 上打开 2 个端口?

我目前正在尝试设置一个 SSH 服务器,以便仅允许使用 SSH 密钥从网络外部访问它,并且不允许通过 root 或任何其他用户名/密码组合进行访问。

同时,网络内部的内部用户仍然需要能够连接到同一系统,但期望使用用户名和密码以更传统的方式登录。

外部和内部用户都将使用 PuttySSH 从 Windows 访问系统,外部访问将通过端口转发防火墙进入系统,该防火墙将在任意选择的高编号端口(如 55000)上向外界开放源端口(或管理员决定什么)

下图试图更好地显示流量。

SSH 设置

我知道如何将实际登录设置为仅使用密钥,并且我知道如何拒绝root,我不知道如何分离这两种登录类型。

我曾考虑过运行两个 SSHD 副本,侦听同一 IP 上的不同端口,并为每个端口提供两种不同的配置。

我还考虑过设置“匹配”规则,但我不确定是否可以使用这些选项来隔离服务器范围的配置。

最后,登录的外部人员将始终是同一用户,出于本问题的目的,我们称他们为“Frank”,因此“Frank”将只被允许从外部 IP 登录,而永远不会真正坐在前面任何内部连接的系统,系统的所有其他用户都只会在内部连接,而永远不会从外部 IP 连接。

他连接的 Franks IP 是动态分配的,但他连接的公共 IP 也是静态的并且永远不会改变,端口转发器的内部 IP 也永远不会改变,SSH 服务器的内部 IP 地址也不会改变。

内部客户端将始终从内部 SSH 服务器 IP 所属的专用网络范围内的 IP 进行连接,并且是 16 位掩码 EG:192.168.0.0/16

使用一个配置文件和一个 SSH 服务器实例是否可以进行此设置?如果是这样,我该怎么做?

或者

使用两台具有不同配置的正在运行的服务器是否会更好?

作为参考,SSH 服务器在 Ubuntu 18.04 上运行。

答案1

所以,事实证明答案实际上比我想象的要简单得多。

不过,我确实必须感谢“@jeff schaller”的评论,如果没有他,我就不会开始研究 SSH“匹配”配置的工作原理。

反正

诀窍是将 /etc/ssh/sshd_config 文件设置为默认配置,以作为从外部互联网连接进行访问所需的配置。

就我而言,这意味着设置以下内容

PermitRootLogin no
PasswordAuthentication no
UsePAM no

通过这样做,我强制所有登录,无论它们来自哪里,都需要使用 SSH 密钥进行基于密钥的登录。

然后,我在 Windows 计算机上使用“PuttyGen”生成保存到磁盘的公钥/私钥对,以及外部用户主目录中“authorized_hosts”文件的相应 ssh 条目。

我将此 ssh 密钥粘贴到用户主文件夹中的正确位置,然后将 putty 设置为使用 PuttyGen 生成的私有 (ppk) 文件进行登录并保存配置文件。

然后,我保存了配置文件,并使用安全方法将其和 ppk 密钥文件发送给外部用户(附有受密码保护的 zip 文件的加密电子邮件)

一旦用户在 putty 副本中拥有 ppk 和配置文件并且可以登录,我就将以下内容添加为 sshd_config 文件的最后两行

Match Host server1,server1.internalnet.local,1.2.3.4
    PasswordAuthentication yes

在“匹配”行中,我更改了服务器名称以保护我自己的服务器的名称。

请注意,每个服务器域都用逗号分隔,并且没有空格,这很重要。如果您在其中放入任何空格,会导致 SSHD 无法加载配置并报告错误,那么我在那里的 3 个匹配项将执行以下操作:

服务器1- 匹配仅使用“server1”且没有域连接 EG 的任何人:“fred@server1”

server1.internalnet.local- 匹配使用完全限定内部域名 EG 的任何人:'[电子邮件受保护]'(注意:您需要一个内部 DNS 才能正常工作)

1.2.3.4- 匹配分配给 SSH 服务器 EG 的特定 IP 地址:'[电子邮件受保护]' 这可以使用通配符,甚至更好的网络/掩码 cidr 格式 EG:1.2.* 或 192.168.1.0/8 如果您确实使用通配符,请阅读下面 fchurca 的答案以获取一些重要说明。

如果提供的任何模式与正在访问的主机匹配,则对正在运行的配置进行的唯一更改就是重新启用交互式密码登录的功能。

您还可以在此处放置其他配置指令,这些指令也将为匹配列表中列出的内部主机重新打开。

但是请阅读以下内容:

https://man.openbsd.org/OpenBSD-current/man5/ssh_config.5

小心,因为并非每个配置选项都允许在匹配块内使用,当我尝试“UsePAM yes”重新打开 PAM 身份验证时,我发现了这一点,却被明确告知这是不允许的。

完成更改后,输入

sshd -T

然后返回测试它们,然后再尝试重新启动服务器,它会报告您遇到的任何错误。

除了上述内容之外,我还从以下两个链接获得了很多帮助:

https://raymii.org/s/tutorials/Limit_access_to_openssh_features_with_the_Match_keyword.html

https://www.cyberciti.biz/faq/match-address-sshd_config-allow-root-loginfrom-one_ip_address-on-linux-unix/

答案2

1.2.* - 使用分配给 SSH 服务器的任何地址(位于服务器 EG 的 16 位网络掩码中)匹配本地网络中的任何人:'[电子邮件受保护]'

小心! .ssh/config 中的模式匹配基于字符串通配,不一定是 IP 地址。根据您正在阅读的同一手册页:

图案

模式由零个或多个非空白字符、“*”(匹配零个或多个字符的通配符)或“?”组成(与一个字符完全匹配的通配符)。例如,要为“.co.uk”域集中的任何主机指定一组声明,可以使用以下模式:

Host *.co.uk

以下模式将匹配 192.168.0.[0-9] 网络范围内的任何主机:

Host 192.168.0.?

如果有人尝试从公开反向解析为 的 IP 登录1.2.badguy.com,它将符合您的1.2.*规则。

https://man.openbsd.org/OpenBSD-current/man5/ssh_config.5#PATTERNS

[为了完整性而更新]

Match Address 1.2.0.0/16正如其他地方所指出的,您可以使用Match Host 1.2.*

[/更新]

答案3

我认为你应该研究的是拆分你的 ssh 配置。例如;设置 /etc/ssh/ssh_config 以获得默认情况下所有用户所需的全局变量(ssh 密钥身份验证、端口转发等)。

然后,如果您的用户(我们称他为 Bob)有一个本地(或安装了 nfs)主目录,请在 /home/bob/.ssh/ 中为他放置一个配置。此配置将包含您的匹配语句以及您是否需要他使用密码而不是证书以及他自己的保持活动值等进行连接...

我过去和现在都这样做过,目的是锁定某些本地帐户仅从一个 IP 地址进入,并且只允许基于证书的身份验证,而其他用户帐户可能会使用 PAM 身份验证并具有基于密码的身份验证。

简而言之,根据用户需求构建和维护单独的用户配置文件比尝试将其全部保留在 ssh 的默认配置文件下更容易管理。

相关内容