如何在 Ubuntu 20.04 上加固 OpenSSH

此教程的早期版本是由 Jamie Scaife编写的。

介绍

Linux 服务器通常通过连接到 OpenSSH服务器进行远程管理,这是 Ubuntu、Debian、CentOS、FreeBSD 和大多数其他基于 Linux/BSD 的系统中使用的默认 SSH 服务器软件。

OpenSSH服务器是SSH的服务器侧面,也被称为SSH DAEMON或sshd。您可以使用OpenSSH客户端连接到OpenSSH服务器,特别是通过运行ssh命令。您可以在 SSH Essentials: Working with SSH Servers, Clients, and Keys中了解有关SSH客户端服务器模型的更多信息。

在本教程中,您将通过使用不同的配置选项来硬化您的OpenSSH服务器,以确保远程访问您的服务器尽可能安全。

前提条件

要完成本教程,您将需要:

一个 Ubuntu 20.04 服务器是按照 Ubuntu 20.04 初始服务器设置设置的,包括一个 sudo 非 root 用户。

一旦你已经准备好了,登录你的服务器作为你的非根用户开始。

第1步:哈登将军

在这个第一步中,您将实施一些初始硬化配置,以提高您的SSH服务器的整体安全性。

最适合您自己的服务器的精确硬化配置取决于您自己的威胁模型和风险门槛(https://owasp.org/www-community/Application_Threat_Modeling)。

您将编辑主 OpenSSH 配置文件在 /etc/ssh/sshd_config 以设置本教程中的硬化选项的大多数. 在继续之前,这是一个好主意创建备份您的现有配置文件,以便您可以在不太可能的情况下恢复它,如果有什么不对劲。

使用以下cp命令创建文件备份:

1sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

这将保存文件的备份副本到 /etc/ssh/sshd_config.bak

接下来,查看当前默认的 OpenSSH 配置选项,这些选项与 /etc/ssh/sshd_config 中的设置相匹配。

1sudo sshd -T

这将以扩展测试模式运行OpenSSH服务器,这将验证完整的配置文件并打印有效的配置值。

现在您可以使用nano或您最喜欢的文本编辑器打开配置文件,开始实施最初的硬化措施:

1sudo nano /etc/ssh/sshd_config

<$>[注] 注: 与 Ubuntu 20.04 一起安装的 OpenSSH 服务器配置文件包含许多默认选项和配置。

编辑配置文件时,某些选项可能默认使用一个单个哈希字符(#)进行评论,以便编辑这些选项或启用该选项,您需要通过删除哈希来删除评论。

第一种硬化选项是禁用通过 SSH 作为 root 用户的登录. 将PermitRootLogin选项设置为通过删除评论或编辑行:

1[label sshd_config]
2PermitRootLogin no

此选项将防止潜在的攻击者直接作为 root 登录您的服务器,还鼓励您采取良好的操作安全实践,例如作为非特权用户操作,并使用sudo仅在绝对需要时升级特权。

接下来,您可以通过配置MaxAuthTries选项来限制特定登录会话的最大身份验证尝试次数:

1[label sshd_config]
2MaxAuthTries 3

对于大多数设置,标准值为3是可接受的,但您可能希望根据自己的风险门槛设置更高或更低。

如果需要,您还可以设置一个缩短的登录恩典期,即用户在最初连接到 SSH 服务器后完成身份验证所需的时间:

1[label sshd_config]
2LoginGraceTime 20

配置文件在秒钟内指定此值。

将此值设置为更低的值有助于防止某些 服务拒绝攻击,其中多个身份验证会话被保持开放长时间。

如果您已配置 SSH 密钥用于身份验证,而不是使用密码,请禁用 SSH 密码身份验证以防止泄露的用户密码允许攻击者登录:

1[label sshd_config]
2PasswordAuthentication no

作为与密码相关的进一步硬化措施,您可能还希望禁用用空密码的身份验证,从而防止登录,如果用户的密码设置为空值或空值:

1[label sshd_config]
2PermitEmptyPasswords no

在大多数用例中,SSH 将以公钥身份验证为唯一使用的身份验证方法进行配置,但是,OpenSSH 服务器还支持许多其他身份验证方法,其中一些是默认启用的。

1[label sshd_config]
2ChallengeResponseAuthentication no
3KerberosAuthentication no
4GSSAPIAuthentication no

如果您想了解有关 SSH 内一些额外的身份验证方法的更多信息,您可以查看以下资源:

X11 转发允许通过 SSH 连接显示远程图形应用程序,但在实践中很少使用。

1[label sshd_config]
2X11Forwarding no

OpenSSH服务器允许连接客户端通过自定义环境变量,例如,客户端可以尝试设置自己的$PATH或配置终端设置,但是,像X11转发一样,这些不常用,所以你可以在大多数情况下禁用此选项:

1[label sshd_config]
2PermitUserEnvironment no

如果您决定通过将此选项设置为,那么您还应该通过在指定该选项的任何行开始添加一个哈希(#)来评论配置文件中的任何引用AcceptEnv`。

接下来,您可以禁用几个与隧道和转发相关的不同选项,如果您不想在您的服务器上使用这些选项:

1[label sshd_config]
2AllowAgentForwarding no
3AllowTcpForwarding no
4PermitTunnel no

最后,您可以禁用默认启用的无语音SSH标签,因为它会显示有关您的系统的各种信息,例如操作系统版本:

1[label sshd_config]
2DebianBanner no

请注意,此选项在配置文件中可能已经不存在,所以您可能需要手动添加它。 完成后保存并退出文件。 如果您使用nanoCTRL+O来保存文件,然后按ENTER以提示文件名。 然后按CTRL+X离开编辑器。

现在通过在测试模式中运行sshd来验证新配置的语法,使用-t旗帜:

1sudo sshd -t

如果您的配置文件具有有效的语法,则不会有输出;如果出现语法错误,则会有描述问题的输出。

一旦您对配置文件满意,您可以使用systemd重新加载sshd以应用新的设置:

1sudo systemctl reload sshd.service

在此步骤中,您完成了对 OpenSSH 服务器配置文件的一些一般硬化,接下来,您将实施一个 IP 地址允许列表,以进一步限制谁可以登录您的服务器。

步骤 2 – 实施 IP 地址授权列表

您可以使用 IP 地址允许列表来限制被授权登录您的服务器的用户,以每个 IP 地址为基础. 在此步骤中,您将为您的 OpenSSH 服务器配置 IP 允许列表。

在许多情况下,您只会从少数已知、可信的IP地址登录到您的服务器,例如,您的家庭互联网连接、企业VPN设备或数据中心中的静态(Jump box)(https://en.wikipedia.org/wiki/Jump_server)或(bastion host)(https://en.wikipedia.org/wiki/Bastion_host)。

通过实施 IP 地址允许列表,您可以确保人们只能从预先批准的 IP 地址中登录,从而大大减少在您的私钥和/或密码泄露的情况下遭到破坏的风险。

<$>[注] **注:**请注意确定正确的IP地址,以添加到您的允许列表,并确保这些不是保留的或动态地址,可能会定期变化,例如经常见到消费者互联网服务提供商

您可以通过使用w命令来识别您目前连接到服务器的 IP 地址:

1w

这将产生类似于以下的东西:

1[secondary_label Output]
2 14:11:48 up 2 days, 12:25, 1 user, load average: 0.00, 0.00, 0.00
3         USER TTY FROM LOGIN@   IDLE JCPU PCPU WHAT
4your_username pts/0 203.0.113.1 12:24 1.00s 0.20s 0.00s w

在列表中查找您的用户帐户,并记住连接的 IP 地址. 在这里,我们使用203.0.113.1的示例 IP。

要开始实施您的 IP 地址允许列表,请在nano或您偏好的文本编辑器中打开 OpenSSH 服务器配置文件:

1sudo nano /etc/ssh/sshd_config

您可以使用允许用户配置指令实现 IP 地址允许列表,该指令限制基于用户名和/或 IP 地址的用户身份验证。

您自己的系统设置和要求将确定哪个特定配置最合适,以下示例将帮助您确定最合适的配置:

  • 限制所有用户到特定 IP 地址:
1AllowUsers *@203.0.113.1
1AllowUsers *@203.0.113.0/24
  • 限制所有用户到特定 IP 地址范围(使用 wildcards):
1AllowUsers *@203.0.113.*
  • 限制所有用户使用多个特定 IP 地址和范围:
1AllowUsers *@203.0.113.1 *@203.0.113.2 *@192.0.2.0/24 *@172.16.*.1
  • 禁用特定 IP 地址以外的所有用户:

限制特定用户到特定IP地址,同时继续允许所有其他用户无限制地登录:

1Match User ashley
2  AllowUsers [email protected]

<$>[警告] **警告:**在OpenSSH配置文件中,在一个匹配块下的所有配置只适用于符合标准的连接,而不论是插入或线路断裂,这意味着您必须小心,并确保旨在全球应用的配置不会意外放入一个匹配块中。

一旦您完成了配置,请将其添加到您的OpenSSH服务器配置文件的底部:

1[label sshd_config]
2AllowUsers *@203.0.113.1

保存和关闭文件,然后继续测试配置语法:

1sudo sshd -t

如果没有报告错误,您可以重新加载OpenSSH服务器来应用您的配置:

1sudo systemctl reload sshd.service

在此步骤中,您在您的 OpenSSH 服务器上实现了 IP 地址允许列表,接下来,您将限制用户的壳,以限制他们被允许使用的命令。

步骤 3 – 限制用户的壳

在此步骤中,您将探索限制 SSH 用户壳的各种选项。

除了提供远程 shell 访问之外,SSH 还适用于传输文件和其他数据,例如通过 SFTP. 但是,当用户只需要能够执行文件传输时,您可能并不总是希望向用户提供完整的 shell 访问权限。

在OpenSSH服务器中,您可以使用多种配置来限制特定用户的壳环境,例如,在本教程中,我们将使用这些配置来创建SFTP-only用户。

首先,您可以使用 /usr/sbin/nologin 壳来禁用某些用户帐户的交互式登录,同时允许非交互式会话(如文件传输、隧道等)发挥作用。

若要使用nologin壳创建新用户,请使用以下命令:

1sudo adduser --shell /usr/sbin/nologin alex

或者,您可以将现有用户的壳更改为nologin:

1sudo usermod --shell /usr/sbin/nologin sammy

如果您尝试互动地登录作为这些用户之一,请求将被拒绝:

1sudo su alex

这将产生类似于以下消息的东西:

1[secondary_label Output]
2This account is currently not available.

尽管在交互式登录上出现拒绝消息,但仍然允许其他操作,如文件转移。

接下来,您应该将nologin壳的使用与一些额外的配置选项相结合,以进一步限制相关的用户帐户。

首先,在nano或您喜爱的编辑器中重新打开 OpenSSH 服务器配置文件:

1sudo nano /etc/ssh/sshd_config

有两种配置选项可以一起实现,以创建一个严格限制的SFTP仅的用户帐户:ForceCommand internal-sftp和ChrootDirectory。

OpenSSH服务器中的ForceCommand选项强迫用户在登录时执行特定命令,这可能对某些机器到机器的通信有用,或者强制启动某个程序。

然而,在这种情况下,内部-sftp命令尤为有用,这是OpenSSH服务器的一个特殊功能,它启动了无需任何支持系统文件或配置的SFTP模型。

理想情况下,这应该与ChrootDirectory选项相结合,该选项将对特定用户的感知主目录进行翻译/更改,基本上将其限制在系统上的特定目录中。

为此,将以下配置部分添加到您的 OpenSSH 服务器配置文件中:

1[label sshd_config]
2Match User alex
3  ForceCommand internal-sftp
4  ChrootDirectory /home/alex/

<$>[警告] **警告:**正如步骤2中所指出的那样,在OpenSSH配置文件中,一个匹配块下的所有配置只适用于符合标准的连接,而不论是间隔或线路断裂,这意味着你必须小心,并确保旨在全球应用的配置不会意外地放入一个匹配块中。

保存并关闭配置文件,然后再次测试配置:

1sudo sshd -t

如果没有错误,您可以应用您的配置:

1sudo systemctl reload sshd.service

这为alex用户创建了一个强大的配置,在那里交互式登录被禁用,所有的SFTP活动都被限制在用户的主目录中。

您已经为用户实现了nologin壳,然后创建了一个配置来限制 SFTP 访问到特定目录。

步骤4:先进硬化

在这个最后一步中,您将实施各种额外的硬化措施,以便尽可能安全地访问您的SSH服务器。

OpenSSH服务器可以对每个密钥进行限制,具体来说,限制限制可以应用于任何在.ssh/authorized_keys 文件中存在的公共密钥,这项功能尤其有助于控制机器对机器会话的访问,并为非 sudo 用户提供控制他们自己的用户帐户的限制的能力。

虽然您可以使用 /etc/ssh/sshd_configuration 文件在系统或用户层面应用大多数这些限制,但在密钥层面也可实现这些限制,以提供 [defence-in-depth](https://en.wikipedia.org/wiki/Defense_in_depth_(computing)]和额外的故障保护,以防系统范围内意外配置错误。

<$>[注] 注: 如果您只使用密码身份验证,或具有更复杂的设置,如 SSH 证书权限,则这些选项将无法使用。

從「nano」或您喜愛的編輯器中開啟您的「.ssh/authorized_keys」檔案:

1nano ~/.ssh/authorized_keys

<$>[注] **注:**由于这些配置适用于每一个密钥的基础上,你需要编辑每个单独的autorized_keys文件中的每个单独的密钥,你希望它们适用于你的系统上的所有用户。

一旦你打开了authorized_keys文件,你会看到每个行都包含一个SSH公共密钥,这很可能会从ssh-rsa AAAB...开始。

以下限制选项可用:

无代理转发:禁用SSH代理转发 *无端转发:禁用SSH端口转发 *无代理转发:禁用分配tty功能(即启动壳)。 *无用户rc:防止执行 ~/.ssh/rc文件 *无X11转发:禁用X11转发显示

例如,要禁用代理转发和X11转发的密钥,你会使用以下配置:

1[label ~/.ssh/authorized_keys]
2no-agent-forwarding,no-X11-forwarding ssh-rsa AAAB...

默认情况下,这些配置使用默认允许,例外封锁方法工作;但是,也可以使用默认封锁,例外允许,这通常是安全保障的优先选择。

您可以通过使用限制选项来做到这一点,该选项将暗示地拒绝特定密钥的所有SSH功能,要求它们只在绝对需要时被明确重新启用。

例如,要禁用特定密钥的所有 SSH 功能,除了 X11 显示转发,您可以使用以下配置:

1[label ~/.ssh/authorized_keys]
2restrict,X11-forwarding ssh-rsa AAAB...

您可能还想考虑使用命令选项,这与步骤 3 中描述的ForceCommand选项非常相似,如果您已经使用了ForceCommand,这不会带来直接的好处,但在不太可能的情况下,您的主要OpenSSH服务器配置文件被重写,编辑等情况下,它是良好的防御深度。

例如,要强迫使用特定密钥进行身份验证的用户在登录时执行特定命令,您可以添加以下配置:

1[label ~/.ssh/authorized_keys]
2command="top" ssh-rsa AAAB...

<$>[警告] 警告:命令配置选项纯粹是防御的深度方法,不应该仅依赖于限制SSH用户的活动,因为根据您的环境可能有方法来过度或绕过它。

最后,为了更好地利用您在步骤 3 中创建的 SFTP 用户的每键限制,您可以使用以下配置:

1[label ~/.ssh/authorized_keys]
2restrict,command="false" ssh-rsa AAAB...

限制选项将禁用所有交互式访问,并且在ForceCommand选项或nologin壳失败的情况下,command="false选项作为第二道防线。

保存并关闭文件以应用配置. 这将立即适用于所有新登录,因此您不需要手动重新加载 OpenSSH。

在这个最后一步中,您通过在您的 .ssh/authorized_keys 文件中使用自定义选项来为 OpenSSH 服务器实施了一些额外的先进硬化措施。

结论

在本文中,您审查了您的OpenSSH服务器配置,并实施了各种硬化措施,以帮助保护您的服务器。

您配置的选项通过禁用未使用的功能和锁定特定用户的访问来减少服务器的整体攻击面积。

您可能希望查看 手动页面为 OpenSSH 服务器和相关的 配置文件,以确定您想要做的任何潜在的进一步调整。

Published At
Categories with 技术
comments powered by Disqus