libressl + ssh 编译安装

发布 : 2020-05-21 分类 : basics 浏览 : --

总之,在不破坏原操作系统 openssl + openssh ,并且没有外网支持的情况下,在 debian 中正常安装了 libressl + openssh 的组合,网上给出的大多数方案是直接替换原本的 ssh 服务,不过如果操作不当,会导致 ssh 无法使用,视情况,后果可能很麻烦,所以这里不会影响原 ssh 服务

首先,需要有一台能够正常联网使用的 debian ,才能编译好 libresslopenssh ,目标服务器能做的就只是接收拷贝的文件了,所以这里需要在外网编译安装的位置,就是目标服务器上的安装位置

下载

libressl 官网下载 libressl ,比如 libressl-3.1.2.tar.gz

openssh 官网下载 openssh ,比如这里的 openssh-8.2p1

编译安装 libressl

1
2
3
4
5
6
tar -xf libressl-3.1.2.tar.gz
cd libressl-3.1.2
./configure --prefix=/opt/libressl # 一般习惯把用户软件安装在 /opt, 这也是为了方便移植
make -j4 # 这个过程会比较长
make check
sudo make install # sudo 主要是 /opt 一般普通用户没权限

新增动态库配置

1
2
3
# root
echo /opt/libressl/lib > /etc/ld.so.conf.d/libressl.conf # 重要
ldconfig

文件名不重要,关键在于 /etc/ld.so.conf.d/ 目录下创建 .conf 文件,并写下 /opt/libressl/lib 添加到动态库搜索路径中,ldconfig 让该配置生效,这一步不仅需要在当前机器上操作,最终也需要在目标服务器上操作

编译安装 openssh

1
2
3
tar -xf openssh-8.2p1.tar.gz
cd openssh-8.2p1
./configure --prefix=/opt/ssh --with-ssl-dir=/opt/libressl # 指定ssh安装路径,以及libressl路径

configure 之后,正常情况下应该有类似下面的输出

1
2
3
4
5
6
              Host: x86_64-pc-linux-gnu
Compiler: cc
Compiler flags: -g -O2 -pipe -Wno-error=format-truncation -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wimplicit-fallthrough -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-strong -fPIE
Preprocessor flags: -I/opt/libressl/include -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE
Linker flags: -L/opt/libressl/lib -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-strong -pie
Libraries: -lcrypto -ldl -lutil -lz -lcrypt -lresolv

如果这一步有关于 ssl 相关的错误报出的话,需要检查动态库配置是否有问题,曾经在这里徘徊了很久=。=

如果没有问题就可以继续了

1
2
3
make -j4
make tests # 时间比较久,不过应该是值得的
sudo make install

安装过程基本上就结束了,接下来需要配置 ssh 在别的端口启动

/opt/ssh/etc/sshd_config 修改端口为 23 (不与服务器当前ssh端口相同即可)

1
Port 23

验证安装结果

1
sudo /opt/ssh/sbin/sshd  # 需要超级用户权限,并且使用绝对路径

尝试本机登录

1
ssh -p 23 hellflame@localhost

输入密码,理论上能够正常登录即可

移植

将两个安装目录打包

1
sudo tar -cvf ssh.tar /opt/libressl /opt/ssh

ssh.tar 拷贝至目标服务器,恢复 libressl , ssh/opt 目录

更新动态库配置

1
2
3
# root
echo /opt/libressl/lib > /etc/ld.so.conf.d/libressl.conf # 重要
ldconfig

动作和之前相同

启动 sshd

1
2
3
mkdir /var/empty  # 大概率需要创建这个目录,然后再启动

/opt/ssh/sbin/sshd

剩下验证一下新的ssh实例是否可以正常使用

替换原ssh

这一步相对比较危险,搞不好重启之后就无法登录服务器了

此时其实新旧两个版本的ssh都可以正常运行,不一样的是原ssh还有默认的启动脚本支持,所以这里其实只需要先通过新版ssh端口登陆到服务器,更新启动脚本 /etc/init.d/ssh 即可

主要需要更新其中的 ssh配置位置可执行文件路径 ,不过我实际上并没有操作这一步,而只是简单的关闭了旧ssh服务,这是出于几个考虑

  1. 防止重启之后新版sshd启动失败,而旧版sshd已经没有启动入口,导致无法登录服务器
  2. 如果新版sshd由于误操作崩溃,硬重启服务器之后还有旧版服务可以自动启动
  3. 服务器不可登录风险低

毕竟只要正常使用新端口的ssh服务即可,客户端的默认配置可以通过 $HOME/.ssh/config 文件控制端口使用

当然,走过这一步也没问题,至少以后重启服务器之后都能使用新版本的ssh服务

最后

这里在编译 libresslopenssh 的时候都仅展示使用了最简单的配置,或者说移植编译安装中最核心的配置,实际情况中需要根据需要,添加编译参数,当然可能也会带来新的库的安装,这些就要靠每个人自由发挥了

本文作者 : hellflame
原文链接 : https://hellflame.github.io/2020/05/21/ssh-update-with-libressl/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹
点击通过issue留言