本文由
AI
辅助撰写,可能存在不准确之处,请读者注意甄别!
前言
近期,OpenSSH 披露了一个严重的安全漏洞 CVE-2024-6387,该漏洞可能导致未经身份验证的远程攻击者执行任意代码,对服务器安全构成巨大威胁。作为 Linux 系统中最核心的远程管理服务,确保 OpenSSH 的安全是每位系统管理员的首要任务。
本文旨在提供一份详尽且权威的操作指南,帮助您将 Ubuntu 服务器上的 OpenSSH 升级到安全的 9.9p2
或更高版本。我们将提供两种升级策略:
- 手动分步执行:适合希望理解每一个步骤背后原理的管理员。
- 一键自动化脚本:适合需要在多台服务器上进行快速、标准化部署的场景。
准备工作:升级前的检查清单
在开始之前,请务必完成以下准备工作,以确保升级过程平稳、安全。
1. 权限与环境
- 操作系统: 本指南适用于 Ubuntu 18.04, 20.04, 22.04 及更高版本。
- 用户权限: 您需要拥有
sudo
或root
权限来执行系统级操作。
2. !! 最重要的安全提醒 !!
在整个升级过程中,请务必保持当前的 SSH 连接窗口不要关闭!
因为操作会重启 SSH 服务,一旦配置失败,您可能会失去对服务器的访问权限。完成所有步骤后,请打开一个新的终端窗口尝试登录,确认新连接成功后,再关闭旧的连接窗口。
3. 网络代理设置 (如果需要)
如果您的服务器位于需要通过代理才能访问外部网络的环境,请先在终端中设置以下环境变量:
# 将地址和端口替换为您的实际代理
export http_proxy="http://your-proxy-address:port"
export https_proxy="http://your-proxy-address:port"
注意:后续 sudo
命令需要添加 -E
参数以继承这些环境变量。
策略一:手动分步升级(深入理解原理)
此方法将引导您完成从编译到替换的每一个步骤,让您清晰地了解底层发生了什么。
第1步:安装编译依赖
首先,我们需要安装编译 OpenSSH 源码所必需的工具和库文件。
# 更新软件包列表
sudo -E apt-get -y update
# 安装编译工具和依赖库
sudo -E apt-get install -y build-essential zlib1g-dev libssl-dev
第2步:下载、解压并编译源码
我们将从 OpenSSH 官方站点下载 9.9p2
版本的源码,并进行编译安装。
# 下载源码包
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz
# 解压缩
tar -xzf openssh-9.9p2.tar.gz
cd openssh-9.9p2
# 配置、编译和安装 (默认会安装到 /usr/local 目录)
./configure
make
sudo make install
第3步:替换系统默认的 OpenSSH (核心)
新版本已安装到 /usr/local
目录,但系统默认使用的仍是 /usr/bin
和 /usr/sbin
下的旧版本。我们需要手动替换它们。
# 1. 停止当前 SSH 服务
sudo systemctl stop ssh
# 2. 备份系统自带的 sshd (服务端) 和 ssh (客户端) 程序
sudo mv /usr/sbin/sshd /usr/sbin/sshd.bak
sudo mv /usr/bin/ssh /usr/bin/ssh.bak
# 3. 将新编译的程序复制到系统默认路径
sudo cp /usr/local/sbin/sshd /usr/sbin/sshd
sudo cp /usr/local/bin/ssh /usr/bin/ssh
第4步:更新 Systemd 服务配置
为确保系统服务能正确调用新版本的 sshd
,我们需要更新服务文件中的路径。
sudo sed -i 's|/usr/sbin/sshd|/usr/local/sbin/sshd|g' /lib/systemd/system/ssh.service
第5步:重启服务并验证
最后,重新加载配置,启动服务,并验证版本号。
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动 SSH 服务
sudo systemctl start ssh
# 检查服务状态,确保 active (running)
sudo systemctl status ssh
# 验证版本号
ssh -V
如果一切顺利,您应该能看到 OpenSSH_9.9p2
的输出。
策略二:一键自动化脚本(高效部署)
对于需要快速部署或管理多台服务器的管理员,此脚本将所有手动步骤封装起来,实现一键式升级。
使用方法
- 将下面的脚本内容完整复制并保存到一个文件,例如
upgrade_openssh.sh
。 - 给脚本添加执行权限:
chmod +x upgrade_openssh.sh
。 - 执行脚本:
./upgrade_openssh.sh
。
自动化脚本
#!/bin/bash
# ==================================================================================
# OpenSSH 9.9p2 强制升级脚本
# ==================================================================================
# 设置脚本在遇到错误时立即退出
set -euo pipefail
# --- 定义一些颜色输出,方便观察 ---
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}--- 开始执行 OpenSSH 9.9p2 强制升级脚本 ---${NC}"
# --- 步骤 1: 清理旧的源码文件 ---
echo -e "\n${YELLOW}>>> 步骤 1: 清理旧的源码文件...${NC}"
rm -rf openssh-9.9p2 openssh-9.9p2.tar.gz
echo "清理完成。"
# --- 步骤 2: 安装编译依赖 ---
echo -e "\n${YELLOW}>>> 步骤 2: 更新软件包列表并安装编译依赖...${NC}"
sudo -E apt-get -y update
sudo -E apt-get install -y build-essential zlib1g-dev libssl-dev
echo "依赖安装完成。"
# --- 步骤 3: 下载、解压并编译 OpenSSH 9.9p2 ---
echo -e "\n${YELLOW}>>> 步骤 3: 下载并编译 OpenSSH 9.9p2...${NC}"
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz
tar -xzf openssh-9.9p2.tar.gz
cd openssh-9.9p2
echo "正在配置..."
./configure
echo "正在编译 (这可能需要几分钟)..."
make
echo "正在安装..."
sudo make install
cd ..
echo "编译安装完成。"
# --- 步骤 4: 替换系统默认的 OpenSSH ---
echo -e "\n${YELLOW}>>> 步骤 4: 停止服务并替换系统默认 OpenSSH 文件...${NC}"
sudo systemctl stop ssh
if [ -f /usr/sbin/sshd ]; then
echo "备份 /usr/sbin/sshd -> /usr/sbin/sshd.bak"
sudo mv /usr/sbin/sshd /usr/sbin/sshd.bak
fi
if [ -f /usr/bin/ssh ]; then
echo "备份 /usr/bin/ssh -> /usr/bin/ssh.bak"
sudo mv /usr/bin/ssh /usr/bin/ssh.bak
fi
echo "复制新版 OpenSSH 文件到系统目录..."
sudo cp /usr/local/sbin/sshd /usr/sbin/sshd
sudo cp /usr/local/bin/ssh /usr/bin/ssh
echo "更新 systemd 服务配置文件..."
sudo sed -i 's|/usr/sbin/sshd|/usr/local/sbin/sshd|g' /lib/systemd/system/ssh.service
echo "文件替换完成。"
# --- 步骤 5: 重新加载服务并验证 ---
echo -e "\n${YELLOW}>>> 步骤 5: 重启服务并进行最终验证...${NC}"
sudo systemctl daemon-reload
sudo systemctl start ssh
echo -e "\n--- 验证 SSH 服务状态 ---"
sudo systemctl status ssh --no-pager
echo -e "\n--- 验证 OpenSSH 版本 ---"
ssh -V
echo -e "\n${GREEN}=====================================================${NC}"
echo -e "${GREEN}脚本执行完毕!${NC}"
echo -e "${YELLOW}请立即打开一个新的终端窗口尝试SSH登录,以确认一切正常!${NC}"
echo -e "${GREEN}=====================================================${NC}"
升级后最终确认与回滚策略
最终确认
脚本或手动步骤执行完毕后,请务必从另一台机器或打开一个新的终端窗口,发起新的 SSH 连接。ssh user@your_server_ip
如果登录成功,并再次通过 ssh -V
确认版本为 9.9p2
,则表示升级圆满成功。
紧急回滚策略
如果新版本导致无法登录,您可以通过云服务商的控制台或物理访问进入服务器,执行以下命令回滚到之前的版本:
# 停止服务
sudo systemctl stop ssh
# 恢复备份的旧版本文件
sudo mv /usr/sbin/sshd.bak /usr/sbin/sshd
sudo mv /usr/bin/ssh.bak /usr/bin/ssh
# 重新启动服务
sudo systemctl start ssh
这将使您的 SSH 服务恢复到升级前的状态。
总结
定期更新 OpenSSH 是保障服务器安全的关键措施之一。通过本文提供的手动或自动化方法,您可以有效地将系统 OpenSSH 升级到安全版本,从而抵御潜在的严重漏洞威胁。在操作时,请始终牢记安全第一,做好备份,并遵循警告提示,确保万无一失。
参考资料:
版权属于:soarli
本文链接:https://blog.soarli.top/archives/753.html
转载时须注明出处及本声明。