V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaozhu317
V2EX  ›  服务器

把生产服务器干烂了

  •  
  •   xiaozhu317 · 149 天前 · 12797 次点击
    这是一个创建于 149 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

    有这时间,另外开个端口运行备用 sshd 不就得了?
    ntgeralt
        84
    ntgeralt  
       72 天前
    @julyclyde 千言万语不如不如直接来一句:不懂 docker 鄙视 docker
    julyclyde
        85
    julyclyde  
       72 天前
    @ntgeralt 我不鄙视 docker
    我只是鄙视你而已
    ntgeralt
        86
    ntgeralt  
       72 天前
    @julyclyde 谢谢鄙视,能得到您的鄙视是 V2EX 莫大荣幸。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1091 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 19:02 · PVG 03:02 · LAX 11:02 · JFK 14:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.