简介
在这个实验中,你将学习通过密钥认证和配置强化来增强 OpenSSH 中 SSH 安全性的重要技术。你将练习用安全的密钥对替换密码认证、禁用 root 登录以及修改默认端口,以减轻暴力攻击的风险。
实践练习将指导你生成加密密钥、配置适当的文件权限,并测试你的安全 SSH 设置。你还将学习管理 SSH 服务和验证安全配置的关键命令。
在这个实验中,你将学习通过密钥认证和配置强化来增强 OpenSSH 中 SSH 安全性的重要技术。你将练习用安全的密钥对替换密码认证、禁用 root 登录以及修改默认端口,以减轻暴力攻击的风险。
实践练习将指导你生成加密密钥、配置适当的文件权限,并测试你的安全 SSH 设置。你还将学习管理 SSH 服务和验证安全配置的关键命令。
在这一步中,你将在你的 LabEx 虚拟机(VM)上安装 OpenSSH 服务器软件包。OpenSSH(开放安全外壳协议)是 SSH 协议的免费开源实现,它能在不安全的网络上的两个不可信主机之间提供安全的加密通信。它是远程服务器管理和安全文件传输的标准工具。
在开始之前,了解 SSH 采用客户端 - 服务器模型很重要。服务器(即我们现在要安装的)监听传入的连接,而客户端(如你本地机器上的终端)则连接到服务器。所有通信都经过加密,以保护你的凭证和数据。
由于 LabEx 虚拟机使用 Docker 容器,其中 systemctl
不可用(Docker 容器通常运行单个进程,而非完整的操作系统),我们将使用 service
命令来管理 SSH 守护进程。这是 systemctl
的一个更简单的替代方案,在容器化环境中运行良好。
按照以下步骤安装 OpenSSH:
首先,更新你的软件包列表,以确保获取到最新版本。这会从 Ubuntu 的软件源中获取最新的软件包信息:
sudo apt update
安装 OpenSSH 服务器软件包。-y
标志会在安装过程中自动确认所有提示:
sudo apt install -y openssh-server
安装完成后,检查 SSH 服务是否正在运行。status
命令会显示服务是否处于活动状态并正在监听连接:
service ssh status
你应该会看到表明服务处于活动状态(正在运行)的输出。如果服务未运行,我们将在下一步启动它。
如果服务未运行(状态输出中会显示“inactive”),手动启动它:
service ssh start
验证 SSH 是否正在默认端口(22)上监听。netstat
命令会显示网络连接和监听端口,而 grep
会过滤出与 SSH 相关的条目:
sudo netstat -tulnp | grep sshd
你应该会看到类似以下的输出,表明 SSH 正在所有网络接口(0.0.0.0)的 22 端口上监听:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
在这一步中,你将配置基于 SSH 密钥的认证方式,这种方式比传统的密码认证更安全。与可能被猜测或暴力破解的密码不同,密钥认证使用一对加密密钥 —— 一个私钥(需保密)和一个公钥(与服务器共享)。
当你连接到 SSH 服务器时,服务器会使用数学算法来验证你是否拥有与它所保存的公钥相匹配的私钥。这种方法一旦设置好,既更安全又更方便。
让我们逐步创建和配置这些密钥:
首先,我们将生成一对新的 SSH 密钥。此命令会在你的 ~/.ssh
目录下创建两个文件:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/labex_key -N ""
-t rsa
指定密钥类型(RSA 算法)-b 4096
生成一个强度为 4096 位的密钥-f
设置密钥对的文件名-N ""
表示不设置密码短语(为了实验简便)现在你将拥有:
~/.ssh/labex_key
(切勿共享此文件!)~/.ssh/labex_key.pub
(此文件将与服务器共享)正确的文件权限对于 SSH 安全至关重要。以下命令可确保只有你能访问你的密钥:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/labex_key
chmod 644 ~/.ssh/labex_key.pub
现在,我们将通过把公钥添加到 SSH 会检查的特殊 authorized_keys
文件中来授权你的密钥:
cat ~/.ssh/labex_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
接下来,我们将配置 SSH 服务器本身。编辑主配置文件:
sudo nano /etc/ssh/sshd_config
找到并修改以下重要设置:
PubkeyAuthentication yes
PasswordAuthentication no
这会告诉 SSH:
修改配置后,务必重启 SSH 服务:
service ssh restart
最后,让我们验证一切是否正常工作。尝试使用你的新密钥连接到你自己的机器(本地主机):
ssh -i ~/.ssh/labex_key localhost
-i
标志指定要使用的私钥。如果成功,你将无需输入任何密码提示即可立即登录 —— 这证实了密钥认证已正确工作。
在这一步中,我们将禁用通过 SSH 直接以 root 用户身份登录。这很重要,因为 root 账户拥有完整的系统权限,使其成为黑客的主要攻击目标。通过禁用 root 登录,我们迫使攻击者既要猜测用户名又要猜测密码,从而大大增加了暴力破解攻击的难度。
在进行此更改后,当你需要 root 权限时,首先要使用普通用户账户登录,然后使用 sudo
执行管理任务。这增加了一层额外的安全保障,因为攻击者需要攻破两个账户。
让我们修改 SSH 配置:
首先,使用文本编辑器打开主 SSH 配置文件。这里我们使用 nano,但你可以使用任何你熟悉的编辑器:
sudo nano /etc/ssh/sshd_config
找到 PermitRootLogin
这一行(通常在第 32 行左右)。如果你找不到它,则需要添加这一行。将这一行修改或添加为:
PermitRootLogin no
在编辑此文件时,让我们设置一些与此更改配合良好的额外安全参数:
StrictModes yes
MaxAuthTries 3
LoginGraceTime 60
StrictModes
会检查文件权限以确保安全MaxAuthTries
限制登录失败的尝试次数LoginGraceTime
设置登录的最长时间在 nano 中按以下步骤保存更改:
要使更改生效,请重启 SSH 服务:
service ssh restart
让我们通过尝试以 root 用户身份进行 SSH 连接来测试更改是否生效(这应该会失败):
ssh root@localhost
你应该会看到类似“Permission denied (publickey)”的错误信息,这意味着我们的安全措施已正确生效。从现在起,你需要使用普通用户账户进行登录。
在这一步中,我们将把 SSH 的默认端口从 22 更改为自定义端口(在我们的示例中是 2222)。这是一项重要的安全措施,因为许多自动化机器人和攻击者会扫描标准端口 22 上的 SSH 服务器。通过更改为非标准端口,我们可以降低服务器被这些自动化扫描发现的概率。
在进行任何更改之前,让我们先检查当前的 SSH 端口配置。这有助于我们了解现有的设置:
sudo grep -i port /etc/ssh/sshd_config
你通常会在输出中看到 #Port 22
。#
符号表示这一行被注释掉了,因此 SSH 当前正在使用默认端口 22。
现在我们将编辑 SSH 配置文件。我们将使用 nano 文本编辑器,它对初学者来说很友好:
sudo nano /etc/ssh/sshd_config
在文件中,找到包含 #Port 22
的行。我们需要在这里进行两项更改:
#
以取消注释该行(这将激活该设置)修改后的行应该如下所示:
Port 2222
进行此更改后,在 nano 中按以下步骤保存文件:
为了使更改生效,我们需要重启 SSH 服务:
service ssh restart
让我们验证 SSH 现在是否正在监听我们的新端口(2222)而不是默认端口:
sudo netstat -tulnp | grep ssh
输出应该显示 SSH 正在监听端口 2222。如果你仍然看到端口 22,请再次检查你对配置文件所做的更改。
最后,通过使用自定义端口连接到 SSH 来测试新配置。注意,我们现在需要使用 -p
标志指定端口:
ssh -p 2222 -i ~/.ssh/labex_key localhost
成功连接后,你可以按 Ctrl+D 退出 SSH 会话。请记住,从现在起,你在连接到 SSH 服务器时始终需要指定这个自定义端口。
在这最后一步,我们将验证你所实施的所有安全强化措施。测试对于确保你的 SSH 服务器配置正确且安全至关重要。我们将检查服务器端设置和客户端连接尝试。
让我们首先检查服务器上当前的 SSH 配置。这可以确认你之前所做的更改已生效:
首先,验证所有当前的 SSH 设置:
sudo sshd -T | grep -E 'port|permitrootlogin|passwordauthentication|pubkeyauthentication'
sshd -T
命令会显示实际的运行时配置。我们正在筛选关键的安全参数。你应该会看到:
port 2222
permitrootlogin no
passwordauthentication no
pubkeyauthentication yes
此输出确认 SSH 正在端口 2222 上运行,root 登录已被禁用,密码认证已关闭,公钥认证已启用。
现在让我们从客户端的角度测试连接:
使用密钥认证测试成功连接:
ssh -p 2222 -i ~/.ssh/labex_key localhost "echo 'Key auth successful'"
这会尝试使用你的私钥进行连接(-i
标志指定密钥文件)。如果连接成功,该命令会在服务器上执行一个简单的 echo 命令。你应该会看到:
Key auth successful
测试失败的 root 登录尝试:
ssh -p 2222 root@localhost 2>&1 | grep -i "permission denied"
这会尝试以 root 用户身份登录,由于我们已禁用 root 登录,此操作应该会失败。该命令会筛选出预期的错误消息。
测试失败的密码认证尝试:
ssh -p 2222 -o PreferredAuthentications=password -o PubkeyAuthentication=no localhost 2>&1 | grep -i "permission denied"
在这里,我们强制使用密码认证(在我们的配置中已禁用),以验证它是否被正确阻止。这些选项明确禁用了密钥认证。
最后,让我们检查服务器的网络状态:
检查活动的 SSH 连接:
sudo netstat -tulnp | grep 2222
这会显示所有正在监听的端口,并筛选出我们的自定义 SSH 端口(2222)。你应该会看到 sshd
列在该端口上监听。
验证 SSH 服务状态:
service ssh status
确认 SSH 服务正在正常运行。输出应该表明服务处于活动状态。
在本次实验中,你通过实际配置学习了如何增强 OpenSSH 中的 SSH 安全性。这些练习涵盖了安装 OpenSSH 服务器、验证其状态,以及使用适当的权限设置实现基于密钥的认证。
你还探索了关键的安全强化技术,包括禁用 root 登录和更改 SSH 默认端口。这些措施在保持系统功能的同时,有效地降低了遭受暴力攻击和自动化扫描的风险。