ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

银河麒麟Kylin V10服务器OpenSSL与OpenSSH安全升级实战指南

银河麒麟Kylin V10服务器OpenSSL与OpenSSH安全升级实战指南 1. 项目概述与核心需求解析最近在维护几台跑着银河麒麟Kylin V10的服务器遇到了一个挺典型的需求系统自带的OpenSSL和OpenSSH版本太老了。老版本意味着什么意味着潜在的安全漏洞、意味着一些新的应用或服务因为依赖新版本的TLS协议或SSH特性而无法部署。比如一个常见的场景是你想部署一个需要TLS 1.3支持的现代Web服务或者你的安全扫描工具提示SSH服务存在已知的中危甚至高危漏洞这时候升级就成了必须项。这个活儿听起来简单不就是yum update一下吗但实际操作过的人都知道在像Kylin这样的国产化发行版上直接升级核心的系统组件尤其是像OpenSSL和OpenSSH这种“基石”级别的库和服务绝对是个技术活搞不好就会把系统搞崩导致SSH连不上那就真成“从入门到跑路”了。所以今天我就把自己趟过坑、踩过雷的完整升级过程以及背后的原理和注意事项系统地梳理出来。无论你是运维工程师、系统管理员还是需要在国产化平台上部署应用的开发者这篇实操指南都能帮你避开那些隐形的“坑”安全、平稳地完成升级。2. 升级前的深度评估与准备工作在动手敲下任何升级命令之前充分的准备工作是成功的一半。盲目操作是系统管理的大忌。2.1 环境与现状核查首先我们需要摸清家底了解当前系统的确切状态。确认操作系统版本这是基础中的基础。运行cat /etc/os-release或uname -a明确你的是Kylin V10 SP1还是SP3是x86_64还是ARM架构。不同版本和架构的软件包依赖可能略有不同。记录现有软件版本这是我们的起点和目标参照。OpenSSL:openssl versionOpenSSH:sshd -V(注意这里是大写的V会输出更详细的编译信息包括其链接的OpenSSL版本) 或rpm -qa | grep openssh检查服务状态与配置运行systemctl status sshd确认SSH服务当前是活跃且正常的。同时备份关键的配置文件cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date %Y%m%d) cp /etc/pam.d/sshd /etc/pam.d/sshd.bak.$(date %Y%m%d)这些配置备份会在万一升级后认证失败时救命。2.2 依赖包与编译环境准备Kylin V10的默认仓库可能不直接提供最新版本的OpenSSL和OpenSSH RPM包或者提供的版本不符合我们的要求。因此从源码编译安装是更通用、更可控的方案。这就意味着我们需要一个完整的编译环境。注意编译安装意味着你需要自己管理依赖和安装路径但它避免了替换系统关键包可能引发的依赖地狱灵活性更高。执行以下命令安装编译工具链和必要的开发库yum groupinstall -y Development Tools yum install -y wget vim tar gzip make perl pcre-devel zlib-devel pam-develDevelopment Tools这是一个软件包组包含了gcc,gcc-c,make,autoconf等核心编译工具。这是必须的。pcre-devel, zlib-develOpenSSH和许多其他软件编译时依赖PCRE正则表达式库和zlib压缩库的开发头文件。pam-develPluggable Authentication Modules (PAM) 的开发文件。OpenSSH通常编译支持PAM认证这是系统用户登录的基础务必安装。perlOpenSSL的配置脚本是用Perl写的。2.3 制定回滚与应急方案这是最重要的一步没有之一。你必须假设升级过程可能失败。确保物理或带外管理OOB访问如果服务器在机房确保你有KVM键盘、视频、鼠标 over IP或者物理控制台访问权限。如果是在云上确保控制台的VNC功能可用。这是你最后的救命稻草当SSH完全无法连接时只能靠它。准备一个临时的“救援”SSH连接在开始升级sshd之前先不要停止旧服务。编译安装新版本OpenSSH时我们通常会将其安装到/usr/local/下的独立目录并使用不同的端口例如2222启动一个临时的新sshd进程进行测试。这样即使新配置有问题你仍然可以通过原来的22端口和旧版SSH服务连接到系统。备份整个OpenSSL和OpenSSH目录可选但推荐tar -czpf /opt/backup_openssl_$(date %Y%m%d).tar.gz /usr/bin/openssl /usr/include/openssl /usr/lib64/libssl* /usr/lib64/libcrypto* 2/dev/null || true tar -czpf /opt/backup_openssh_$(date %Y%m%d).tar.gz /etc/ssh /usr/bin/ssh* /usr/sbin/sshd /usr/lib64/openssh 2/dev/null || true这为极端情况下的文件级回滚提供了可能。3. 分步实操升级OpenSSL至稳定版本OpenSSL是加密库很多软件包括OpenSSH都动态链接到它。我们先升级它为后续OpenSSH的升级打好基础。3.1 下载与验证源码访问OpenSSL官网或国内镜像站下载一个稳定的长期支持LTS版本。这里以openssl-1.1.1w为例请注意1.1.1系列已停止支持建议选用3.x系列如openssl-3.0.13此处仅为演示流程。cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz # 建议同时下载对应的签名文件进行校验 # wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz.sha256 # sha256sum -c openssl-1.1.1w.tar.gz.sha256 tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w实操心得生产环境务必进行完整性校验。从官网下载慢的话可以寻找国内的大学或开源镜像站。版本选择上除非有明确的兼容性要求否则建议选择OpenSSL 3.x的最新稳定版其安全性和功能都更强。3.2 编译与安装配置编译安装的关键在于config或Configure脚本的参数。我们不建议直接替换系统默认的/usr/bin/openssl而是安装到独立目录。# 查看可用的编译目标Kylin V10 x86_64 通常是 linux-x86_64 ./config --prefix/usr/local/openssl --openssldir/usr/local/openssl shared zlib--prefix/usr/local/openssl指定安装根目录。所有文件二进制、库、头文件都会安装在这个目录下。--openssldir/usr/local/opensslSSL相关文件如证书、配置文件的目录。shared生成动态链接库.so文件这是大多数应用所期望的。zlib启用zlib压缩支持。然后进行编译和安装make # 这个过程可能会花几分钟到十几分钟取决于服务器性能 make test # **非常重要** 运行自带的测试套件确保编译正确无误。 make install3.3 配置系统以使用新版OpenSSL安装完成后我们需要让系统能找到新版本的库和二进制文件。创建库文件链接echo /usr/local/openssl/lib64 /etc/ld.so.conf.d/openssl-1.1.1w.conf ldconfig这条命令告诉系统的动态链接器在/usr/local/openssl/lib64目录下寻找共享库。更新PATH环境变量可选 如果你希望命令行直接调用新版的openssl命令可以将其路径加到PATH中。echo export PATH/usr/local/openssl/bin:$PATH /etc/profile.d/openssl.sh source /etc/profile.d/openssl.sh现在运行openssl version应该会显示新安装的版本。但请注意系统自带的旧版本可能仍在/usr/bin/openssl。我们通过环境变量让系统优先使用新版。验证安装/usr/local/openssl/bin/openssl version ldconfig -p | grep openssl # 查看系统识别的openssl库确保输出的是你刚刚安装的版本。关键注意事项此时系统的其他程序包括当前的sshd仍然链接着旧版的OpenSSL库通常在/usr/lib64/libssl.so.xx。只有新编译的、明确指定链接到/usr/local/openssl的程序才会使用新版。这正是我们想要的效果——渐进式升级不影响现有服务。4. 分步实操升级OpenSSH至最新稳定版OpenSSH是我们要升级的服务需要格外小心。我们的策略是编译一个全新的OpenSSH安装到独立目录测试无误后再切换系统服务。4.1 下载与解压源码从OpenSSH官网或镜像站下载源码。这里以openssh-9.7p1为例。cd /usr/local/src wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz tar -xzf openssh-9.7p1.tar.gz cd openssh-9.7p14.2 编译配置与安装编译OpenSSH时最关键的一步是指定我们刚刚安装的新版OpenSSL路径。./configure --prefix/usr/local/openssh \ --sysconfdir/etc/ssh \ --with-pam \ --with-zlib \ --with-ssl-dir/usr/local/openssl \ --with-md5-passwords \ --with-privsep-path/var/empty/sshd--prefix/usr/local/openssh安装到独立目录。--sysconfdir/etc/ssh这是关键将配置文件目录仍然指向系统的/etc/ssh。这样我们编译的新版sshd会直接使用你之前备份的原有配置无需额外迁移。当然你也可以指向一个新目录但那样需要复制并调整配置。--with-ssl-dir/usr/local/openssl这是另一个关键明确告诉configure脚本使用我们刚安装的新版OpenSSL而不是系统自带的旧版。--with-pam启用PAM支持必须。--with-privsep-path指定权限分离使用的空目录。执行编译和安装make # 注意这里先不要 make install因为这会覆盖系统文件。我们先看看会安装哪些文件。 make -n install查看make -n install的输出确认安装路径符合预期。4.3 备份旧版并安装新版现在我们开始替换。首先停止旧服务但务必保持当前的SSH连接不要断开你可以在一个tmux或screen会话中操作或者使用我们之前准备的应急方案。systemctl stop sshd # 重命名旧的可执行文件而不是删除 mv /usr/sbin/sshd /usr/sbin/sshd.old mv /usr/bin/ssh /usr/bin/ssh.old mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old # 安装新版 make install安装后/usr/local/openssh/sbin/sshd和/usr/local/openssh/bin/ssh等文件就位了。我们需要创建符号链接让系统命令指向新版。ln -sf /usr/local/openssh/sbin/sshd /usr/sbin/sshd ln -sf /usr/local/openssh/bin/ssh /usr/bin/ssh ln -sf /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen # 同样链接其他常用工具如scp, sftp, ssh-agent等4.4 配置系统服务与首次启动检查并更新PAM配置通常make install会安装一个sshd.pam文件到/etc/pam.d/。对比一下新旧文件如果差异不大可以直接使用新的。为了保险你可以用备份的旧文件。cp /etc/pam.d/sshd.bak.$(date %Y%m%d) /etc/pam.d/sshd检查sshd_config用备份的配置文件覆盖回去确保配置不变。cp /etc/ssh/sshd_config.bak.$(date %Y%m%d) /etc/ssh/sshd_config然后强烈建议在新窗口中用旧版ssh客户端或者保持一个已有的连接先测试新sshd。我们可以启动一个临时实例在另一个端口/usr/sbin/sshd -p 2222 -f /etc/ssh/sshd_config然后另开一个终端尝试连接ssh -p 2222 userlocalhost。如果成功登录说明新版sshd工作正常。正式启用系统服务# 由于我们替换了二进制文件但服务单元文件没变直接启动即可 systemctl daemon-reload systemctl start sshd systemctl status sshd如果状态是active (running)恭喜你。但先别急着庆祝进行最终验证。5. 全面验证与功能测试升级完成后的验证工作必须细致确保服务不仅“跑起来”而且是“正确地跑起来”。5.1 基础服务状态验证# 1. 检查服务状态 systemctl status sshd # 2. 检查监听端口 netstat -tlpn | grep sshd # 应该看到sshd进程在监听22端口或你配置的端口 # 3. 检查进程链接的库 ldd /usr/sbin/sshd | grep ssl # 输出应该显示链接的libssl.so和libcrypto.so路径指向/usr/local/openssl/lib64证明它确实在使用新版OpenSSL。 # 4. 检查版本 sshd -V # 输出应该显示新版本号如OpenSSH_9.7p1以及“with OpenSSL 1.1.1w ...”5.2 客户端连接与功能测试从另一台机器使用不同身份的客户端进行连接测试密码认证登录使用一个普通系统用户通过密码登录。密钥对认证登录使用配置了公钥认证的用户登录测试authorized_keys功能是否正常。SFTP功能测试使用sftp命令连接进行简单的文件上传下载。SCP功能测试使用scp命令复制文件。隧道功能测试可选如果有应用依赖SSH隧道进行简单测试。5.3 系统依赖性与兼容性检查运行一些依赖OpenSSH或OpenSSL的系统工具或第三方应用看是否正常。# 例如检查系统更新工具是否正常 yum check-update # 如果有其他服务如Git、Rsync over SSH、Ansible进行简单操作测试。6. 常见问题排查与故障恢复实录即使步骤再详细实际操作中也可能遇到各种问题。下面是我遇到过的一些典型问题及解决方法。6.1 编译阶段问题问题configure失败提示找不到OpenSSL。排查检查--with-ssl-dir参数路径是否正确。确保/usr/local/openssl目录下存在include和lib64文件夹。解决确认OpenSSL已成功安装并指定正确的路径。也可以尝试使用pkg-configexport PKG_CONFIG_PATH/usr/local/openssl/lib64/pkgconfig:$PKG_CONFIG_PATH。问题make编译失败报错undefined reference toEVP_xxx。排查这通常是链接了错误版本的OpenSSL库。可能是系统路径中旧版的库干扰。解决清理源码目录重新configure并确保在configure输出中看到OpenSSL version: x.x.x是你期望的新版。可以尝试在configure前设置LDFLAGS和CPPFLAGS环境变量明确指定库和头文件路径。6.2 安装与启动阶段问题问题启动sshd失败systemctl status sshd显示Permission denied或Could not load host key。排查检查/etc/ssh/ssh_host_*密钥文件的权限应该是600对所有者只读且所有者是root。如果错误是关于PAM的检查/etc/pam.d/sshd文件是否存在且语法正确。解决chmod 600 /etc/ssh/ssh_host_*key chown root:root /etc/ssh/ssh_host_*key # 如果PAM文件丢失从openssh源码目录复制 cp /usr/local/src/openssh-9.7p1/contrib/redhat/sshd.pam /etc/pam.d/sshd问题SSH服务能启动但客户端无法连接提示ssh_exchange_identification: read: Connection reset by peer。排查这通常是sshd_config配置错误或与新版不兼容。查看/var/log/secure或journalctl -u sshd获取详细错误信息。解决最常见的坑是加密算法或协议不匹配。新版OpenSSH可能默认禁用了一些不安全的算法如SHA-1的RSA。如果你的旧客户端太老可能无法协商出通用的算法。临时解决方案是在sshd_config中启用兼容性算法仅用于测试长期应升级客户端KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 Ciphers aes128-cbc,3des-cbc HostKeyAlgorithms ssh-rsa添加后重启sshd。成功连接后应尽快升级老旧客户端并移除这些不安全的配置。6.3 最坏情况SSH完全无法连接如果你已经替换了二进制文件重启了服务并且所有SSH连接包括原有连接都断开且无法新建而你又没有提前准备其他访问方式如控制台那就陷入了困境。这就是为什么准备工作中的“应急方案”如此重要如果万不得已走到了这一步而你又有物理或控制台访问权限通过控制台登录系统。将我们之前重命名的旧版sshd恢复回来mv /usr/sbin/sshd.old /usr/sbin/sshd mv /usr/bin/ssh.old /usr/bin/ssh重启sshd服务systemctl restart sshd。此时你应该能通过原来的方式SSH登录了。然后再仔细复盘问题所在可能是配置错误、PAM问题或库依赖问题。可以在一个安全的测试环境如虚拟机中重现并解决后再在生产环境操作。7. 升级后的优化与安全加固建议升级到新版本不仅是为了修复漏洞也为了获得更好的性能和安全性。升级完成后可以考虑进行以下优化。7.1 安全配置加固新版OpenSSH支持更安全的默认配置但我们可以进一步收紧。编辑/etc/ssh/sshd_config# 禁用密码认证强制使用密钥根据实际情况调整 PasswordAuthentication no PubkeyAuthentication yes # 禁用root用户直接登录 PermitRootLogin no # 使用更强的密钥交换算法、加密算法和MAC算法根据ssh -V输出的支持列表调整 KexAlgorithms curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512 Ciphers chacha20-poly1305openssh.com,aes256-gcmopenssh.com,aes128-gcmopenssh.com,aes256-ctr,aes192-ctr,aes128-ctr MACs hmac-sha2-512-etmopenssh.com,hmac-sha2-256-etmopenssh.com,umac-128-etmopenssh.com # 限制用户和用户组访问 AllowUsers sysadmin deployuser # AllowGroups sshusers # 启用登录失败限制需要配合pam_tally2等PAM模块 MaxAuthTries 3修改任何配置后务必使用sshd -t测试配置文件语法然后再systemctl reload sshd重载服务。7.2 服务管理与监控配置日志轮转确保/etc/logrotate.d/sshd配置合理避免日志塞满磁盘。启用systemd的更多保护选项编辑/usr/lib/systemd/system/sshd.service建议先复制到/etc/systemd/system/进行修改可以添加如PrivateTmptrue,ProtectSystemstrict等指令来沙盒化服务提升安全性需测试兼容性。设置监控告警监控sshd服务的端口状态、进程存活以及/var/log/secure中的失败登录记录对于频繁的暴力破解尝试应及时告警。7.3 长期维护考虑文档化将本次升级的详细步骤、遇到的坑、最终的有效配置记录下来形成运维文档。自动化如果有多台同质服务器需要升级可以考虑将编译好的二进制包和配置文件打包成RPM或使用Ansible等自动化工具进行分发和部署但需注意架构和依赖的一致性。版本跟踪订阅OpenSSL和OpenSSH的安全公告邮件列表关注CVE漏洞信息制定定期评估和升级的计划。对于OpenSSL由于其基础性即使没有漏洞也应规划每1-2年升级一次主要版本OpenSSH则根据安全公告及时响应。整个升级过程从谨慎的评估准备到分步的编译安装再到周密的验证和加固每一步都需要耐心和细心。核心思想就是“稳”字当头永远给自己留好退路。经过这样一番操作你的Kylin V10服务器就拥有了更强大、更安全的加密通信基础能够更好地支撑上层业务应用。
返回列表