-原由:服务器的 SSH 需要升级,因为发现了一些 SSH 漏洞
-过程:我使用的别人整理好的 rpm 文件,确实在测试服务器中升级成功了,但是在正式服务器中升级失败。可能是服务器的 glibc 版本太低,可能导致新版本 SSH 升级失败。(可能有人会问,为什么不自己编译,我在测试服务器自行编译成功升级了,使用 rpm 文件也成功升级了,于是就优先使用的 rpm 文件)
-结果:升级失败后,SSH Session 直接断连,远程连接不上,只好联系服务器供应商。
-庆幸:这个服务器没有在部署的应用,都停掉了,这是唯一庆幸的一点。
-总结: 1.遇到 SSH 升级问题,联系供应商,不要自己尝试,就算自己尝试,提前在供应商那备份快照。 2.确实需要慎重操作服务器。涉及升级软件的操作,一定多测试测试,多准备几个测试环境。 3.工作的时候难免有急躁的时刻,这个时候才是真容易犯错。 4.欢迎各位 V 友指导
1
tool2dx 157 天前 6
可以临时开一个 dropbear 端口来应急,反正 ssh 又不止一个 openssh 。
|
2
lstz 157 天前 via Android
18 年我遇到过 glibc 升级的坑,万幸没有数据丢失,只是 centos 会有一丢丢不正常而已
|
3
supuwoerc 157 天前
刺激
|
4
julyclyde 157 天前
(可能有 sb 会问)
|
5
julyclyde 157 天前 5
你这个总结其实没啥用
没抓住本质,你的结论就是把事情推给别的(可能也不靠谱,甚至还不如你)人去做 |
7
xiaozhu317 OP @julyclyde 哈哈哈哈,最主要的原因还是我太菜了~
|
8
xiaozhu317 OP @tool2dx 现在我们这边连不上了,他们那边在处理中哈哈,希望能处理好
|
9
julyclyde 157 天前 1
|
10
xiaozhu317 OP @supuwoerc 吓坏了
|
11
xiaozhu317 OP @lstz 哈哈,我也是万幸,正好没有什么应用在跑
|
12
xiaozhu317 OP @julyclyde 牛,你猜对了,我确实是这样操作的。在测试环境中我编译是升级成功的,rpm 也是可以升级成功的,我图省事就直接选择用 rpm 了,然后直接--nodeps ,就麻烦了。只能说我还是水平不够
|
13
kinkin666 157 天前
简单点,下次直接先刻一台升升看
|
14
julyclyde 157 天前 3
@xiaozhu317 不是我牛;你这属于“错的很标准”
很多软件都和 glibc 、openssl 这几个基础组件有明确版本的依赖关系; glibc 本身应该是有几个小版本的适配宽度; openssl 是 1.0 、1.1 两个系列内部各自兼容,但是 openssl1.0 和 1.1 应该是不兼容的,它家的版本号定义和通常风格不一样 操作系统的大版本升级,这几个基础组件一般都会发生升级(然后才有能力支持更新的其它软件) |
15
DonaldErvinKnuth 157 天前
我也遇到过一次,也是因为 centos6.7 的太老,只支持 rsa ,不能用更高的,就想的升级,结果升级失败,连不上了。还好有一个连接没断,又查资料退回来了,吓死了。
|
16
xjzshttps 157 天前
不是运维,
可以请教一个问题吗?安全问题升级 ssh 为什么需要自己找包? 操作系统没有提供安全更新补丁吗? 我一般用的 ubuntu ,sudo apt-get update && sudo apt-get upgrade -y 就完事,其它系统也有自己的包管理提供安全补丁吧? |
17
xiaozhu317 OP @xjzshttps 操作系统版本太老了
|
18
xiaozhu317 OP @DonaldErvinKnuth 咱俩的版本甚至一致哈哈
|
19
xiaozhu317 OP @julyclyde 受教了受教了老哥
|
20
676529483 157 天前
以前搞 nfs 备份时,mv 了一半,手贱 ctrl+c 了,重启就文件系统报错了,联系了云服务商也解决不了,大数据训练的模型丢了。。。
以后每次搞生产服务器,就只敢先快照了 |
21
Ipsum 157 天前 via Android
自己装的服务器?按道理应该有 ipmi 的,让机房开个 vpn 去救呀。
|
22
defunct9 157 天前
ssh 升级要做好失败得准备,得准备好 telnet 得第二条路。
|
23
lhsakudsgdsik 157 天前
我这边也是刚完成七八个项目的 openssh 升级,操作系统版本有 ubuntu22.04 和 centos7 ,ubuntu 的是有出官方修复版本 8.9p1-3ubuntu0.10 的,不过好多扫描软件扫描不出来必须手动编译到 9.8.p1 版本,centos 的麻烦些还是离线的,并且 zlib 和 openssl 版本太老了,都要单独升级,总体都是比较顺利的,都装了 telnet ,不过也没用上
|
24
dapang1221 157 天前
ssh 升级可以用 vnc 或 kvm 连服务器,不要用着 ssh 再升 ssh
glibc 能不动就不动,系统组件依赖太多,建议直接开新机器,平滑的迁业务 |
25
DonaldErvinKnuth 157 天前
@xiaozhu317 我为此专门写了一个博客记录了下来,glibc 这种底层的还是不要动了,牵一发动全身
|
26
happyxhw101 157 天前
@uiosun 好了,彻底挂了
|
27
lucifer9 157 天前
都 21 世纪了你们还能买到没有 ipmi 的服务器?
|
28
han1988 157 天前
姿势不对,老系统上装 OpenSSH 之类 C/C++的新版本的包要全静态编译
|
29
ZeekChatCom 157 天前
我的选择是直接换操作系统
|
30
echo1937 157 天前
@xiaozhu317 #17 看到这里我终于明白为什么 rpm 升级也会失败了, 敢情你说的 rpm 也不是官方的呀..
|
31
sjkdsfkkfd 157 天前
有带外管理就好了
|
32
xiaozhu317 OP @lhsakudsgdsik 有没有可以参考的链接之类的
|
33
xiaozhu317 OP @han1988 我还是年轻哈哈
|
34
stephenxiaxy 157 天前
上上周才升级完,全是编译
|
35
darksword21 157 天前
碰上过 glibc 的问题,直接让客户开新镜像的机器,我可不想冒险升级这玩意。。
|
36
MetalCore 157 天前
升级前先临时开下 telnet, 大部分 ssh 升级教程的第一步
|
37
march1993 157 天前
也就 centos 会遇到这些根本不是问题的问题了。。
|
38
sampeng 157 天前 1
我就烦这种。。明明提示你了 xxx 。你说不,我不 xxx 。然后一个 nodeps 。。炸了然后问我怎么坏了呢?
|
41
knva 156 天前 1
能用为什么要升级
|
42
Pierro 156 天前
前几天也是遇到在 centos7.6 用 node20 提示 glibc 版本过旧 问 gpt 他直接说升级比较复杂不建议升级
|
43
gscsnm 156 天前
至少要先装个备用的登录服务器的通道,比如 telnet 。。
|
44
Clannad0708 156 天前
@xjzshttps 好比你现在用的是 windows 7 然后一天命令升级到 windows11 ,你觉得你的应用,服务啥的会没问题吗?
|
45
gvdlmjwje 156 天前
是不是虚拟机?直接克隆一个后改 ip ,然后你在克隆机上尽管操作鸭
|
46
xjzshttps 156 天前
|
47
lsp7572 156 天前
最终方案,这种事情都要想好如果失败了怎么办,因为失败是不可避免的
|
49
hefish 156 天前
ssh 升级干啥,我宁可弄 fail2ban ,宁可弄白名单,我都不自己去升那个 openssh-server
|
50
Remember 156 天前
@julyclyde 这就是 centos 的原因。几大流行发行版,只有 centos 各种组件太旧,网上各种教程教人自己编译安装。其他的都是 apt ,pacman 升级,不可能遇到这种问题的。
|
52
someonedeng 156 天前
留个 telnet 后路再动手
|
53
wabway 156 天前
1 。先备份 2 。升级前先准备 telnet 作为备用
|
54
jim9606 156 天前 via Android
deb rpm 等二进制软件包默认不可移植,即不能跨发行版跨版本(深层原因什么都有,你自己提的 glibc 版本是一个潜在可能性),强行移植可能能用但无可用性保证,后果自负。那些非发行版提供的软件包为了可移植是做了特殊设计的。
正规流程是只是用发行版软件源提供的包且直接使用在线源(或者私有镜像源)安装。玩不明白这套的还是老实用容器吧。 |
56
myxingkong 156 天前
升级好像会重置 sshd_config ,如果有使用自定义端口的话,可以尝试使用默认的 22 端口连接看看。
|
57
SekiBetu 156 天前
docker 的含金量还在增加!
|
58
Noicdi 156 天前
上个月干过类似搞坏 ssh 的事情,在产品的构建服务器上测试一个编译链接的想法,把服务器上的 openssl 的加解密动态库的 soname 给重命名了,这个服务器只有这一个版本。重命名完所有 ssh session 手动关掉,然后准备重连,连不上去了,瞬间想到 ssh 是依赖 openssl 的。真一瞬间冷汗下来了。
然后找到公司 IT 确认这台机器是物理机,申请了权限去了机房 tty 进环境,把动态库重命名回来,把环境又救回来了。 还有一次 yum 升级 kernel 后重启时引导失败,又让 IT 把环境重装,还好环境上啥服务和数据都没有。 现在公司环境凡是涉及到基础软件的升级更新和修改,一律不动手,能跑就别动。 |
60
wtks1 156 天前
升级之前不应该先开个 telnet 端口来备用吗
|
62
powerman 156 天前
|
63
cheng6563 156 天前
所以才喜欢弄容器化呀,centos6 也是能装个 4.x 内核开容器的
|
64
expy 156 天前
系统都 eol 了还在用,估计平常也不升级的,那还管什么漏洞。
|
65
guanzhangzhang 156 天前
即使不是老旧的系统,如果官方包管理的源里的这类 c 软件没提供新版本,而自己要去下载最新源码编译解决 CVE 的,最好要对 c 语言和编译以及 glibc 相关的要熟悉,否则出问题了你就蒙蔽了,特别是很多运维和 CRUD 的开发这样干崩了后都蒙蔽了。
-- 另外避免断连,机器的 tty ,vnc ,服务器的 bmc web ,iLo 都要确保能登录 -- 以及最好找一个差不多的内网环境下的一样的 os 作为兜底手段,例如真整崩了,这个内网机器起 web server 后把本机的相关 so 打包成 tar 供下载,故障机器上 scp 或者 curl 下载 |
66
RockShake 156 天前
完全模拟 PROD 的测试环境是必须的
|
67
jackerbauer 156 天前
打个洞,开个 tenlet 也好的,起码不会失连啊
|
69
BadFox 156 天前
大型企业中有一个流程叫做变更管理,变更需要进行评审、测试、批准等。
|
70
XDiLa 155 天前
吃一堑长一智,一定要对生产环境保持敬畏,别偷懒嫌麻烦 。做好快照
|
71
renothing 155 天前
不懂不要紧,不懂还胆子大直接强制执行。换我我可能会开掉你。这太给自己埋雷了,这样的人不能做运维。
|
72
Cola98 155 天前
前两天遇到差不多的问题,当时是在欧拉上编译出来可以执行,然后换到 centos7 上安装会提示 glibc 报错,思路是升级 gcc 在安装高版本 glibc ,操作之前还是问了一下 leader ,发现是在欧拉上编译的,于是找到开源脚本重新编译安装发现没有问题,线上在批量安装,同时保证 telnet 是可以连接的。
出现这个问题可能是因为你 sshd_config 出现了问题 |
73
nyxsonsleep 154 天前
为什么不用容器呢?
telnet 就算开了也就是保证这个机器不失联,一个最底线的要求。 系统与系统底层软件升级会遇到的问题太多了,就比如说你这次升级 ssh ,如果出现升级后 ssh 出现随机断开、延迟增大情况你准备怎么办? |
74
julyclyde 153 天前
@nyxsonsleep 你见谁把宿主机的 sshd 装在容器里的
|
81
ntgeralt 81 天前
@julyclyde
``` sudo docker network create --driver bridge --subnet 172.18.0.0/16 my_network 创建 ssh Docker 容器,这次使用可写模式挂载主机文件系统: sudo docker run -d --name ssh-container \ --network my_network \ -v /:/host \ -p 2222:22 \ -e ROOT_PASSWORD=123456 \ rastasheep/ubuntu-sshd:18.04 重建 docker ssh 密码为 123456 并 sudo docker exec -it ssh-container passwd root 连接 ssh 2222 ,进入主机的文件系统并使用 chroot: cd /host chroot . 现在尝试更新包列表: apt update 您应该能够重建容器以外的 SSH 服务器: apt install openssh-server ``` |
82
ntgeralt 81 天前
*补充 docker restart 参数和完整重建过程,已经实测。
#建立 docker 打通网络 sudo docker network create --driver bridge --subnet 172.18.0.0/16 my_network #拉取并创建 ssh Docker 容器 sudo docker run -d --name ssh-container \ --network my_network \ -v /:/host \ -p 2222:22 \ -e ROOT_PASSWORD=123456 \ --restart unless-stopped \ rastasheep/ubuntu-sshd:18.04 #ssh 连接 2222 root 123456 提示密码错误,重建 docker ssh 密码为 123456 sudo docker exec -it ssh-container passwd root #重新连接连接 ssh 2222 ( root 123456 ),进入主机的文件系统并使用 chroot: cd /host chroot . #您现在能够重建容器外 SSH 服务器: apt update && apt purge openssh-server && apt install openssh-server passwd root |