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

2020-01-11 14:09:17 +08:00
 king1688888888
新手刚接触 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)
5503 次点击
所在节点    Linux
26 条回复
codehz
2020-01-11 14:10:45 +08:00
又见编译安装大法。。。。
0202 年了,什么发行版没有 openssh
zhao305149619
2020-01-11 14:13:00 +08:00
应该都有发行版吧,把这个依赖写上去,通过 repo 直接拉依赖啊
king1688888888
2020-01-11 14:20:15 +08:00
@codehz 请教 RHEL6/CentOS6 下的 OpenSSH 8.1p1 最新版的 rpm 在哪里获取,非常感谢。我暂时只看到官方在更新 5.3 版本,就是小版本号在升级。
dream4ever
2020-01-11 14:30:12 +08:00
@king1688888888 之前研究过类似问题,当时想在 CentOS 7 上升级 OpenSSH 和 OpenSSL,看到下面链接里的回复,强烈不建议大版本升级,于是作罢。

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

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

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

不清楚你有没有在离线服务器上安装过软件 。服务器跟你本地环境都不一样,rpm 的依赖不一样,根本不是执行几个命令就可以的,除了 home 其他目录都没有写权限,怎么装?
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
2020-01-13 18:37:09 +08:00
@ps1aniuge 朋友说到点子上了!!!我的情况是这样,单位又请了所谓的安全团队过来检查,这些人一过来就用绿盟漏洞扫描,SSH 5.3 我已经升级到官方最新的小版本,绿盟还是扫出了 SSH 漏洞。随后我就问怎样才算通过,他们就来一句 ssh -V,只要 SSH 版本和 SSL 版本是当前官网最新,就算通过(即便绿盟也扫到漏洞)!最后没办法,先去官方找 RPM 包,官方又没有,自己做 RPM 包的话,还不如自己编译,然后拷贝到别的机子上运行。瞎折腾了半天,算是全部通过检查了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/637073

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX