xiaozhu317
V2EX  ›  服务器

把生产服务器干烂了

  •  
  •   xiaozhu317 · Jul 25, 2024 · 17020 views
    This topic created in 835 days ago, the information mentioned may be changed or developed.

    -原由:服务器的 SSH 需要升级,因为发现了一些 SSH 漏洞

    -过程:我使用的别人整理好的 rpm 文件,确实在测试服务器中升级成功了,但是在正式服务器中升级失败。可能是服务器的 glibc 版本太低,可能导致新版本 SSH 升级失败。(可能有人会问,为什么不自己编译,我在测试服务器自行编译成功升级了,使用 rpm 文件也成功升级了,于是就优先使用的 rpm 文件)

    -结果:升级失败后,SSH Session 直接断连,远程连接不上,只好联系服务器供应商。

    -庆幸:这个服务器没有在部署的应用,都停掉了,这是唯一庆幸的一点。

    -总结: 1.遇到 SSH 升级问题,联系供应商,不要自己尝试,就算自己尝试,提前在供应商那备份快照。 2.确实需要慎重操作服务器。涉及升级软件的操作,一定多测试测试,多准备几个测试环境。 3.工作的时候难免有急躁的时刻,这个时候才是真容易犯错。 4.欢迎各位 V 友指导

    Supplement 1  ·  Jul 25, 2024
    感谢各位,收获满满
    86 replies  •  2024-10-10 21:31:42 +08:00
    tool2dx
    tool2dx
    Jul 25, 2024❤️6
    1
    可以临时开一个 dropbear 端口来应急,反正 ssh 又不止一个 openssh 。
    lstz
    lstz
    Jul 25, 2024 via Android
    2
    18 年我遇到过 glibc 升级的坑,万幸没有数据丢失,只是 centos 会有一丢丢不正常而已
    supuwoerc
    supuwoerc
    Jul 25, 2024
    3
    刺激
    julyclyde
    julyclyde
    Jul 25, 2024
    4
    (可能有 sb 会问)
    julyclyde
    julyclyde
    Jul 25, 2024❤️5
    5
    你这个总结其实没啥用
    没抓住本质,你的结论就是把事情推给别的(可能也不靠谱,甚至还不如你)人去做
    uiosun
    uiosun
    Jul 25, 2024
    6
    @lstz 所以是不是该常升级 glibc ?
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    7
    @julyclyde 哈哈哈哈,最主要的原因还是我太菜了~
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    8
    @tool2dx 现在我们这边连不上了,他们那边在处理中哈哈,希望能处理好
    julyclyde
    julyclyde
    Jul 25, 2024❤️1
    9
    @xiaozhu317 我盲猜一下
    你的 rpm 并不兼容你这个操作系统版本,而是针对另一个操作系统版本的
    你装的时候也应该有依赖关系不对的情况,然后你--nodeps 强桩进去了
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    10
    @supuwoerc 吓坏了
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    11
    @lstz 哈哈,我也是万幸,正好没有什么应用在跑
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    12
    @julyclyde 牛,你猜对了,我确实是这样操作的。在测试环境中我编译是升级成功的,rpm 也是可以升级成功的,我图省事就直接选择用 rpm 了,然后直接--nodeps ,就麻烦了。只能说我还是水平不够
    kinkin666
    kinkin666
    Jul 25, 2024
    13
    简单点,下次直接先刻一台升升看
    julyclyde
    julyclyde
    Jul 25, 2024❤️3
    14
    @xiaozhu317 不是我牛;你这属于“错的很标准”

    很多软件都和 glibc 、openssl 这几个基础组件有明确版本的依赖关系; glibc 本身应该是有几个小版本的适配宽度; openssl 是 1.0 、1.1 两个系列内部各自兼容,但是 openssl1.0 和 1.1 应该是不兼容的,它家的版本号定义和通常风格不一样

    操作系统的大版本升级,这几个基础组件一般都会发生升级(然后才有能力支持更新的其它软件)
    DonaldErvinKnuth
    DonaldErvinKnuth
    Jul 25, 2024
    15
    我也遇到过一次,也是因为 centos6.7 的太老,只支持 rsa ,不能用更高的,就想的升级,结果升级失败,连不上了。还好有一个连接没断,又查资料退回来了,吓死了。
    xjzshttps
    xjzshttps
    Jul 25, 2024
    16
    不是运维,
    可以请教一个问题吗?安全问题升级 ssh 为什么需要自己找包?
    操作系统没有提供安全更新补丁吗?
    我一般用的 ubuntu ,sudo apt-get update && sudo apt-get upgrade -y 就完事,其它系统也有自己的包管理提供安全补丁吧?
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    17
    @xjzshttps 操作系统版本太老了
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    18
    @DonaldErvinKnuth 咱俩的版本甚至一致哈哈
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    19
    @julyclyde 受教了受教了老哥
    676529483
    676529483
    Jul 25, 2024
    20
    以前搞 nfs 备份时,mv 了一半,手贱 ctrl+c 了,重启就文件系统报错了,联系了云服务商也解决不了,大数据训练的模型丢了。。。
    以后每次搞生产服务器,就只敢先快照了
    Ipsum
    Ipsum
    Jul 25, 2024 via Android
    21
    自己装的服务器?按道理应该有 ipmi 的,让机房开个 vpn 去救呀。
    defunct9
    defunct9
    Jul 25, 2024
    22
    ssh 升级要做好失败得准备,得准备好 telnet 得第二条路。
    lhsakudsgdsik
    lhsakudsgdsik
    Jul 25, 2024
    23
    我这边也是刚完成七八个项目的 openssh 升级,操作系统版本有 ubuntu22.04 和 centos7 ,ubuntu 的是有出官方修复版本 8.9p1-3ubuntu0.10 的,不过好多扫描软件扫描不出来必须手动编译到 9.8.p1 版本,centos 的麻烦些还是离线的,并且 zlib 和 openssl 版本太老了,都要单独升级,总体都是比较顺利的,都装了 telnet ,不过也没用上
    dapang1221
    dapang1221
    Jul 25, 2024
    24
    ssh 升级可以用 vnc 或 kvm 连服务器,不要用着 ssh 再升 ssh
    glibc 能不动就不动,系统组件依赖太多,建议直接开新机器,平滑的迁业务
    DonaldErvinKnuth
    DonaldErvinKnuth
    Jul 25, 2024
    25
    @xiaozhu317 我为此专门写了一个博客记录了下来,glibc 这种底层的还是不要动了,牵一发动全身
    happyxhw101
    happyxhw101
    Jul 25, 2024
    26
    @uiosun 好了,彻底挂了
    lucifer9
    lucifer9
    Jul 25, 2024
    27
    都 21 世纪了你们还能买到没有 ipmi 的服务器?
    han1988
    han1988
    Jul 25, 2024
    28
    姿势不对,老系统上装 OpenSSH 之类 C/C++的新版本的包要全静态编译
    ZeekChatCom
    ZeekChatCom
    Jul 25, 2024
    29
    我的选择是直接换操作系统
    echo1937
    echo1937
    Jul 25, 2024
    30
    @xiaozhu317 #17 看到这里我终于明白为什么 rpm 升级也会失败了, 敢情你说的 rpm 也不是官方的呀..
    sjkdsfkkfd
    sjkdsfkkfd
    Jul 25, 2024
    31
    有带外管理就好了
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    32
    @lhsakudsgdsik 有没有可以参考的链接之类的
    xiaozhu317
    xiaozhu317
    OP
    Jul 25, 2024
    33
    @han1988 我还是年轻哈哈
    stephenxiaxy
    stephenxiaxy
    Jul 25, 2024
    34
    上上周才升级完,全是编译
    darksword21
    darksword21
    Jul 25, 2024
    35
    碰上过 glibc 的问题,直接让客户开新镜像的机器,我可不想冒险升级这玩意。。
    MetalCore
    MetalCore
    Jul 25, 2024
    36
    升级前先临时开下 telnet, 大部分 ssh 升级教程的第一步
    march1993
    march1993
    Jul 25, 2024
    37
    也就 centos 会遇到这些根本不是问题的问题了。。
    sampeng
    sampeng
    Jul 25, 2024❤️1
    38
    我就烦这种。。明明提示你了 xxx 。你说不,我不 xxx 。然后一个 nodeps 。。炸了然后问我怎么坏了呢?
    julyclyde
    julyclyde
    Jul 25, 2024
    39
    @march1993 这跟 centos 没啥直接关系
    julyclyde
    julyclyde
    Jul 25, 2024
    40
    @sampeng 对,错的很标准就是这样
    不懂原理,而且胆子还大
    knva
    knva
    Jul 25, 2024❤️1
    41
    能用为什么要升级
    Pierro
    Pierro
    Jul 25, 2024
    42
    前几天也是遇到在 centos7.6 用 node20 提示 glibc 版本过旧 问 gpt 他直接说升级比较复杂不建议升级
    gscsnm
    gscsnm
    Jul 25, 2024
    43
    至少要先装个备用的登录服务器的通道,比如 telnet 。。
    Clannad0708
    Clannad0708
    Jul 25, 2024
    44
    @xjzshttps 好比你现在用的是 windows 7 然后一天命令升级到 windows11 ,你觉得你的应用,服务啥的会没问题吗?
    gvdlmjwje
    gvdlmjwje
    Jul 25, 2024
    45
    是不是虚拟机?直接克隆一个后改 ip ,然后你在克隆机上尽管操作鸭
    xjzshttps
    xjzshttps
    Jul 25, 2024
    46
    @xiaozhu317 @Clannad0708
    好吧,我这边没这么老的系统版本。
    想想以前的确在别人哪里见过老的更新源都没得版本...
    lsp7572
    lsp7572
    Jul 25, 2024
    47
    最终方案,这种事情都要想好如果失败了怎么办,因为失败是不可避免的
    julyclyde
    julyclyde
    Jul 25, 2024
    48
    @knva 仅仅是能用那显然是不够的
    hefish
    hefish
    Jul 25, 2024
    49
    ssh 升级干啥,我宁可弄 fail2ban ,宁可弄白名单,我都不自己去升那个 openssh-server
    Remember
    Remember
    Jul 25, 2024
    50
    @julyclyde 这就是 centos 的原因。几大流行发行版,只有 centos 各种组件太旧,网上各种教程教人自己编译安装。其他的都是 apt ,pacman 升级,不可能遇到这种问题的。
    julyclyde
    julyclyde
    Jul 25, 2024
    51
    @Remember centos 也有 9stream 啊,咋就是 centos 的原因了?这是人的原因
    someonedeng
    someonedeng
    Jul 25, 2024
    52
    留个 telnet 后路再动手
    wabway
    wabway
    Jul 25, 2024
    53
    1 。先备份 2 。升级前先准备 telnet 作为备用
    jim9606
    jim9606
    Jul 25, 2024 via Android
    54
    deb rpm 等二进制软件包默认不可移植,即不能跨发行版跨版本(深层原因什么都有,你自己提的 glibc 版本是一个潜在可能性),强行移植可能能用但无可用性保证,后果自负。那些非发行版提供的软件包为了可移植是做了特殊设计的。
    正规流程是只是用发行版软件源提供的包且直接使用在线源(或者私有镜像源)安装。玩不明白这套的还是老实用容器吧。
    privil
    privil
    Jul 25, 2024
    55
    @Remember #50 教编译安装就乖乖编译安装?打个 rpm 包有多难。说到底还是人的问题。
    myxingkong
    myxingkong
    Jul 25, 2024
    56
    升级好像会重置 sshd_config ,如果有使用自定义端口的话,可以尝试使用默认的 22 端口连接看看。
    SekiBetu
    SekiBetu
    Jul 25, 2024
    57
    docker 的含金量还在增加!
    Noicdi
    Noicdi
    Jul 25, 2024
    58
    上个月干过类似搞坏 ssh 的事情,在产品的构建服务器上测试一个编译链接的想法,把服务器上的 openssl 的加解密动态库的 soname 给重命名了,这个服务器只有这一个版本。重命名完所有 ssh session 手动关掉,然后准备重连,连不上去了,瞬间想到 ssh 是依赖 openssl 的。真一瞬间冷汗下来了。
    然后找到公司 IT 确认这台机器是物理机,申请了权限去了机房 tty 进环境,把动态库重命名回来,把环境又救回来了。

    还有一次 yum 升级 kernel 后重启时引导失败,又让 IT 把环境重装,还好环境上啥服务和数据都没有。

    现在公司环境凡是涉及到基础软件的升级更新和修改,一律不动手,能跑就别动。
    sunxvvv
    sunxvvv
    Jul 26, 2024
    59
    @sampeng 只能说他运气好,装不上系统提示有问题,还敢强行--nodeps ,这简直就是白给
    wtks1
    wtks1
    Jul 26, 2024
    60
    升级之前不应该先开个 telnet 端口来备用吗
    twl007
    twl007
    Jul 26, 2024 via iPhone
    61
    @lucifer9 有 ipmi 但是 oob 就不能挂掉了么 = =
    powerman
    powerman
    Jul 26, 2024
    62
    没有意义的,这种老系统,只能中午升级,因为早晚要出问题,何况容器化是大趋势,宿主机以后也要跟上时代,这种老系统,你不管怎么去维护它,跟不上时代 就是跟不上了,千疮百孔,开源社区不像微软,30 年前的屁股都给你擦,还考虑到方方面面,开源社区丢弃一个东西,连个招呼都不会打,人就走了,而且整个社区 都是各干的,一套软件依赖的版本 千奇百怪,总会有问题的
    cheng6563
    cheng6563
    Jul 26, 2024
    63
    所以才喜欢弄容器化呀,centos6 也是能装个 4.x 内核开容器的
    expy
    expy
    Jul 26, 2024
    64
    系统都 eol 了还在用,估计平常也不升级的,那还管什么漏洞。
    guanzhangzhang
    guanzhangzhang
    Jul 26, 2024
    65
    即使不是老旧的系统,如果官方包管理的源里的这类 c 软件没提供新版本,而自己要去下载最新源码编译解决 CVE 的,最好要对 c 语言和编译以及 glibc 相关的要熟悉,否则出问题了你就蒙蔽了,特别是很多运维和 CRUD 的开发这样干崩了后都蒙蔽了。
    -- 另外避免断连,机器的 tty ,vnc ,服务器的 bmc web ,iLo 都要确保能登录
    -- 以及最好找一个差不多的内网环境下的一样的 os 作为兜底手段,例如真整崩了,这个内网机器起 web server 后把本机的相关 so 打包成 tar 供下载,故障机器上 scp 或者 curl 下载
    Crixs
    Crixs
    Jul 26, 2024
    66
    完全模拟 PROD 的测试环境是必须的
    jackerbauer
    jackerbauer
    Jul 26, 2024
    67
    打个洞,开个 tenlet 也好的,起码不会失连啊
    julyclyde
    julyclyde
    Jul 26, 2024
    68
    @cheng6563 centos6 装 4.x 内核,其他基础软件能配套吗
    BadFox
    BadFox
    Jul 26, 2024
    69
    大型企业中有一个流程叫做变更管理,变更需要进行评审、测试、批准等。
    XDiLa
    XDiLa
    Jul 26, 2024
    70
    吃一堑长一智,一定要对生产环境保持敬畏,别偷懒嫌麻烦 。做好快照
    renothing
    renothing
    Jul 26, 2024
    71
    不懂不要紧,不懂还胆子大直接强制执行。换我我可能会开掉你。这太给自己埋雷了,这样的人不能做运维。
    Cola98
    Cola98
    Jul 26, 2024
    72
    前两天遇到差不多的问题,当时是在欧拉上编译出来可以执行,然后换到 centos7 上安装会提示 glibc 报错,思路是升级 gcc 在安装高版本 glibc ,操作之前还是问了一下 leader ,发现是在欧拉上编译的,于是找到开源脚本重新编译安装发现没有问题,线上在批量安装,同时保证 telnet 是可以连接的。

    出现这个问题可能是因为你 sshd_config 出现了问题
    nyxsonsleep
    nyxsonsleep
    Jul 27, 2024
    73
    为什么不用容器呢?
    telnet 就算开了也就是保证这个机器不失联,一个最底线的要求。
    系统与系统底层软件升级会遇到的问题太多了,就比如说你这次升级 ssh ,如果出现升级后 ssh 出现随机断开、延迟增大情况你准备怎么办?
    julyclyde
    julyclyde
    Jul 29, 2024
    74
    @nyxsonsleep 你见谁把宿主机的 sshd 装在容器里的
    ntgeralt
    ntgeralt
    Sep 28, 2024
    75
    @julyclyde 问了 CHATGPT 4o ,后备 ssh 可以在 docker 里跑,并给出了完整一套方案
    julyclyde
    julyclyde
    Oct 4, 2024
    76
    @ntgeralt 那你要不还是问问 gpt ,为什么穿上裤子放屁吧
    ntgeralt
    ntgeralt
    Oct 6, 2024
    77
    @julyclyde 嘴巴那么香,gpt 对你表示遗憾。自己不懂 docker 就暗地里不懂好了,不用拿上来台面秀
    julyclyde
    julyclyde
    Oct 6, 2024
    78
    @ntgeralt 十年前我手搓 cgroup 的时候你可能还没开始学计算机呢
    到现在看起来你也是拿着锤子看啥都像钉子的作风啊
    ntgeralt
    ntgeralt
    Oct 7, 2024
    79
    @julyclyde sshd 装在容器 5 秒钟的事。你那么杠精,请给出个更好的方案哦
    julyclyde
    julyclyde
    Oct 7, 2024
    80
    @ntgeralt 你把 sshd 装在容器里,登录进去之后能访问外面的系统吗?
    ntgeralt
    ntgeralt
    Oct 9, 2024
    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
    ```
    ntgeralt
    ntgeralt
    Oct 9, 2024
    82
    *补充 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
    julyclyde
    julyclyde
    Oct 9, 2024
    83
    @ntgeralt 也就是,你发明了一个穿上裤子再放屁的问题
    本来 sshd 在系统里好好的,你非要额外套个 docker 然后把外面系统 volume 给它去运行

    有这时间,另外开个端口运行备用 sshd 不就得了?
    ntgeralt
    ntgeralt
    Oct 10, 2024
    84
    @julyclyde 千言万语不如不如直接来一句:不懂 docker 鄙视 docker
    julyclyde
    julyclyde
    Oct 10, 2024
    85
    @ntgeralt 我不鄙视 docker
    我只是鄙视你而已
    ntgeralt
    ntgeralt
    Oct 10, 2024
    86
    @julyclyde 谢谢鄙视,能得到您的鄙视是 V2EX 莫大荣幸。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1092 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 148ms · UTC 17:06 · PVG 01:06 · LAX 09:06 · JFK 12:06
    ♥ Do have faith in what you're doing.