V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
king1688888888
V2EX  ›  Linux

请教在 Linux 下编译安装 OpenSSH 相关问题

  •  
  •   king1688888888 · 2020-01-11 14:09:17 +08:00 · 5503 次点击
    这是一个创建于 1780 天前的主题,其中的信息可能已经有所发展或是发生改变。
    新手刚接触 OpenSSH 源码编译安装,使用了最新的 OpenSSL 1.1.1d ,应该算是顺利完成编译吧。现在想把编译好的 OpenSSH 打个压缩包发给别人使用(操作系统发行版相同),但别人的机子上并没有安装 OpenSSL 1.1.1d ( libcrypto.so.1.1 ),所以不能解压即用。百度谷歌了一番大概说是动态库 so、静态库 a 的问题,但在操作上还是很多不明白,请教一下如何才能把 OpenSSL 1.1.1d ( libcrypto.a )“固化”到 OpenSSH 程序里,实现别人机子上也能直接使用?

    编译 OpenSSL 的参数:

    ./config \
    --prefix=/usr/local/openssl-1.1.1d \
    --openssldir=/usr/local/openssl-1.1.1d/ssl -fPIC

    编译 OpenSSH 的参数:

    ./configure \
    --prefix=/usr \
    --sysconfdir=/etc/ssh \
    --with-ssl-dir=/usr/local/openssl-1.1.1d \
    --with-zlib=/usr/local/zlib-1.2.11 \
    --with-pam \
    --with-md5-passwords

    编译后的 OpenSSH 在本机可以正常运行,版本如下:

    [root@node1 ~]# ssh -V
    OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019

    [root@node1 ~]# ldd /usr/bin/ssh
    linux-vdso.so.1 => (0x00007fff2e1e7000)
    libcrypto.so.1.1 => /usr/local/openssl-1.1.1d/lib/libcrypto.so.1.1 (0x00007f05288f7000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f05286ee000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f05284ea000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00007f05282e7000)
    libz.so.1 => /usr/local/zlib-1.2.11/lib/libz.so.1 (0x00007f05280cf000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f0527e97000)
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f0527c7d000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f05278e9000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f05276cb000)
    /lib64/ld-linux-x86-64.so.2 (0x000055568f294000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007f05274c8000)
    26 条回复    2020-01-21 07:11:48 +08:00
    codehz
        1
    codehz  
       2020-01-11 14:10:45 +08:00
    又见编译安装大法。。。。
    0202 年了,什么发行版没有 openssh
    zhao305149619
        2
    zhao305149619  
       2020-01-11 14:13:00 +08:00
    应该都有发行版吧,把这个依赖写上去,通过 repo 直接拉依赖啊
    king1688888888
        3
    king1688888888  
    OP
       2020-01-11 14:20:15 +08:00
    @codehz 请教 RHEL6/CentOS6 下的 OpenSSH 8.1p1 最新版的 rpm 在哪里获取,非常感谢。我暂时只看到官方在更新 5.3 版本,就是小版本号在升级。
    dream4ever
        4
    dream4ever  
       2020-01-11 14:30:12 +08:00
    @king1688888888 之前研究过类似问题,当时想在 CentOS 7 上升级 OpenSSH 和 OpenSSL,看到下面链接里的回复,强烈不建议大版本升级,于是作罢。

    https://forums.centos.org/viewtopic.php?t=54967
    king1688888888
        5
    king1688888888  
    OP
       2020-01-11 14:36:14 +08:00
    @dream4ever 谢谢分享。我情况是这样的,来单位检查安全的人就是一根筋难沟通,就是要看到 ssh -V 后,显示最新版本的 OpenSSH、OpenSSL 版本,我已经解释过官方在维护 5.3 这个大版本号。
    dream4ever
        6
    dream4ever  
       2020-01-11 14:43:50 +08:00
    @king1688888888 那就很麻烦了。不过能不能做个“假的” ssh -V 临时应付一下?
    prondtoo
        7
    prondtoo  
       2020-01-11 14:51:42 +08:00
    我们是除非有重大安全问题爆出来,当然软件马上会有通知,否则生产环境动都不给动。
    zhao305149619
        8
    zhao305149619  
       2020-01-11 15:14:14 +08:00
    我编译过大版本,有两个方法,可以修改版本信息欺骗过去
    z775781
        9
    z775781  
       2020-01-11 15:38:29 +08:00
    @king1688888888 只看 SSH -V 的版本,你可以编译的时候修改 ssh 为高版本,省事儿反正 5.3 的 ssh 也在维护,不怕有洞子什么的
    jinliming2
        10
    jinliming2  
       2020-01-11 15:40:32 +08:00 via iPhone
    试试:
    OpenSSH 的二进制文件,用 ldd 命令看一下依赖,然后把对应的所有依赖库都复制过去(印象中和二进制文件放在一起就可以优先加载?还是需要配个启动参数?不太记得了)
    注意的是,部分依赖是虚拟的,找不到的话应该可以跳过……
    还有就是依赖的动态库大部分都写的是个软链接的路径,记得找到原始文件……
    nicebird
        11
    nicebird  
       2020-01-11 16:49:24 +08:00
    静态编译+二进制发布。

    只要对面发行版一致一般没问题。
    Hconk
        12
    Hconk  
       2020-01-11 16:53:49 +08:00 via iPhone
    https://gist.github.com/Hconk/a3632f79f2c6db6a9d4c9a26856236c9

    用这个脚本把要用到的依赖拷到程序同目录一起打包发过去就行了。
    alphatoad
        13
    alphatoad  
       2020-01-12 04:10:39 +08:00 via iPhone
    Docker 吧,给自己多留几根头发
    maxwel1
        14
    maxwel1  
       2020-01-12 14:49:15 +08:00 via Android
    在有些情况下,只能通过编译源代码安装,比如服务器严禁了解外网,或者没有安装权限,这时候就只能选择编译安装。
    如果希望直接在另一台设备上使用,那么编译的时候--prefix 就不要选到系统相关的目录了,直接选一个自己用的目录比如~/test,安装完成后把 test 目录一起打包,拷贝到另一台设备后在另一台设备上设置一下环境变量。
    关于用到的动态库的问题,参考 10 楼的方法吧,能不能用看运气。
    king1688888888
        15
    king1688888888  
    OP
       2020-01-12 19:42:47 +08:00
    @nicebird 我就是想了解静态编译是怎么做,请大神解惑。OpenSSL 1.1.1d 编译出来的静态库是 libcrypto.a,不知道怎么才能把它“固化”到 ssh 和 sshd 这两个程序里。
    james122333
        16
    james122333  
       2020-01-12 19:51:01 +08:00
    你的作法是对的 只是不要指定 prefix
    了解越多越知道预设永远不够 不够极限
    zhao305149619
        17
    zhao305149619  
       2020-01-13 11:31:28 +08:00
    @maxwel1 严禁外网也是可以离线编译后再安装的,了解一下 RPM 包的编译吧,会把 buildrequire 和 installrequire 写的很清楚.
    maxwel1
        18
    maxwel1  
       2020-01-13 15:41:00 +08:00 via Android
    @ maxwel1 严禁外网也是可以离线编译后再安装的,了解一下 RPM 包的编译吧,会把 buildrequire 和 installrequire 写的很清楚.

    不清楚你有没有在离线服务器上安装过软件 。服务器跟你本地环境都不一样,rpm 的依赖不一样,根本不是执行几个命令就可以的,除了 home 其他目录都没有写权限,怎么装?
    ps1aniuge
        19
    ps1aniuge  
       2020-01-13 15:54:51 +08:00
    俺觉得这不是一个编译问题,而是一个 sshd 版本安全度的扯皮问题。问题如下:

    1 centos6 中,最新的 openssl,openssh-server 包,是否已经不安全?是的话,哪里不安全?
    2 1 centos6 中,最新的 openssl,openssh-server 包,对比 ssh-server 8.1p1 ,是否更不安全?即这两个哪个更安全?

    我建议楼主把这两个问题,贴到 centos 官方,让官方人员解答下。有了结论后,再进行更新与否。
    ============================
    阶段 2:
    假设得到的结论是应该更新到最新版。
    但你自己编译更新后,出现漏洞咋办?没经过大规模测试,出现问题咋办?谁负责?

    这里我主要说的呃是:
    自定义的新软件,和旧系统,隐藏的不匹配。
    比如构造一个错误,就可以绕过 sshd。
    即便没有这个错误,新软件用了后,很卡顿,咋办?谁负责?

    ============================
    额外想和大家讨论这个问题:
    1 排除发行版自带的 sshd 包不谈,只说 openssh 官方的包。
    2 用啥版本才能让 sshd 更安全?一般来讲大版本落后 1---2 个版本。小版本最新。这个策略对 openssh 管用么?

    我看貌似 openssh 官方只更新大版本,而不更新小版本。
    也就是说,openssh 官方的版本升级只有 1 条路线。而不是多版本同时维护。
    你没办法这样用“大版本落后 1---2 个版本。小版本最新”,对不?
    king1688888888
        20
    king1688888888  
    OP
       2020-01-13 18:37:09 +08:00
    @ps1aniuge 朋友说到点子上了!!!我的情况是这样,单位又请了所谓的安全团队过来检查,这些人一过来就用绿盟漏洞扫描,SSH 5.3 我已经升级到官方最新的小版本,绿盟还是扫出了 SSH 漏洞。随后我就问怎样才算通过,他们就来一句 ssh -V,只要 SSH 版本和 SSL 版本是当前官网最新,就算通过(即便绿盟也扫到漏洞)!最后没办法,先去官方找 RPM 包,官方又没有,自己做 RPM 包的话,还不如自己编译,然后拷贝到别的机子上运行。瞎折腾了半天,算是全部通过检查了。
    king1688888888
        21
    king1688888888  
    OP
       2020-01-13 18:50:22 +08:00
    @maxwel1 谢谢指导。不研究了,直接拷贝动态库过去对方机子算了。本想着把静态库加到 SSH 程序里,谷歌了一圈还是不懂怎么实现,放弃了。
    ps1aniuge
        22
    ps1aniuge  
       2020-01-14 15:26:37 +08:00
    SSH5.3 已经升级到官方最新的小版本,绿盟还是扫出了 SSH 漏洞。---------------都扫出了什么洞? cve 是多少?拿着这个到官方去问,你只需要带节奏;)让他俩去 pk。
    ps1aniuge
        23
    ps1aniuge  
       2020-01-14 15:32:04 +08:00
    随着 linux 被挂马,被挖矿,被勒索增多。快过年之前,广大 it 安全督察人员(信息部锦衣卫)行动起来了,我很欣慰。还有人讨厌 win 每月更新补丁么?
    julyclyde
        24
    julyclyde  
       2020-01-15 18:07:26 +08:00
    新手不要编译安装
    新手不要用旧版 centos6
    新手不要接历史遗留系统
    iceecream
        25
    iceecream  
       2020-01-20 17:27:06 +08:00
    楼主。。。。你这样编译,丢失了一个功能,就是 hosts.deny 和 hosts.allow 的二个功能。
    所以,吧 5.3 升级最新的小版本吧。没什么漏洞的,绿盟那些,都是看大版本的。。。
    defunct9
        26
    defunct9  
       2020-01-21 07:11:48 +08:00 via iPhone
    又见被各种检查折磨的运维。
    pci、央行、四大、等保。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:09 · PVG 05:09 · LAX 13:09 · JFK 16:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.