安全漏洞扫描,openssh经常爆出一些漏洞需要修复,升级ssh 一台一台编译安装比较慢。所以把源码包做成rpm包方便安装使用。

安装依赖包

yum install rpm-build zlib zlib-devel openssl-devel gcc perl-devel pam-devel libXt-devel imake gtk2-devel unzip

安装最新版OpenSSL(可选步骤)

CentOS 7 自带的openssl最高版本是1.0.2k,此版本还是会存在许多漏洞,所以在这里我选择编译安装当前的最新稳定版openssl。

Build OpenSSH RPM

# 创建目录
mkdir -p ~/rpmbuild/{SOURCES,SPECS} 
cd ~/rpmbuild/SOURCES/

# 下载源码包
wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.3p1.tar.gz
wget http://ftp.riken.jp/Linux/momonga/6/Everything/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz

# 解压 openssh.spec 到 SPECS 目录
# tar -zxvf openssh-8.3p1.tar.gz
cd ~/rpmbuild/SPECS
tar -xzv -f ~/rpmbuild/SOURCES/openssh-8.3p1.tar.gz openssh-8.3p1/contrib/redhat/openssh.spec
mv openssh-8.3p1/contrib/redhat/openssh.spec ./

chown sshd:sshd openssh.spec 
# 修改配置
# openssh 8.3 版本中第一次使用%global定义变量,而不是%define
# Openssh-askpass是用于图形界面下输入口令的
sed -i -e "s/%global no_gnome_askpass 0/%global no_gnome_askpass 1/g" openssh.spec
sed -i -e "s/%global no_x11_askpass 0/%global no_x11_askpass 1/g" openssh.spec
# 使用 openssl 1.1.1h 进行构建
vim +216 openssh.spec 
#加入以下行
# --with-ssl-dir=/opt/openssl \
--with-ssl-dir=/usr/local/openssl \
# 构建 rpm 包
# -bb参数,只构建二进制rpm包
rpmbuild -bb openssh.spec   
rpmbuild -bb openssh.spec

安装 OpenSSH

注意在安装前最少保证有一个 ssh 的活动窗口,避免 ssh 升级失败导致无法远程连接。

安装前先备份

tar -cvzf ~/etc_ssh-bak.tar.gz /etc/ssh
cd /etc/pam.d && cp -p sshd sshd.oldbak
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.oldbak

ll /etc/pam.d/sshd*
ll /etc/ssh/sshd*

开始安装

如果是拷贝 rpm 包到其他机器进行安装,最好先升级 openssl。或者将刚才编译好的/usr/local/openssl/lib/libcrypto.so.1.1复制到目标机器的/usr/lib64/目录下。注意复制时加-p参数,以保持文件的权限。

$ cd ~/rpmbuild/RPMS/x86_64
$ ls
openssh-8.3p1-1.el7.x86_64.rpm
openssh-clients-8.3p1-1.el7.x86_64.rpm
openssh-debuginfo-8.3p1-1.el7.x86_64.rpm
openssh-server-8.3p1-1.el7.x86_64.rpm
# 查看旧版本
rpm -qa | grep openssh
openssh-7.4p1-21.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64

# 移除旧版本(可选)
# rpm -e --nodeps openssh-7.4p1-21.el7.x86_64 openssh-clients-7.4p1-21.el7.x86_64 openssh-server-7.4p1-21.el7.x86_64
# 升级安装
# rpm -Uvh openssh-server-8.3p1-1.el7.x86_64.rpm --nodeps
# rpm -Uvh openssh-8.3p1-1.el7.x86_64.rpm --nodeps
# rpm -Uvh openssh-clients-8.3p1-1.el7.x86_64.rpm --nodeps
# rpm -Uvh openssh-debuginfo-8.3p1-1.el7.x86_64.rpm --nodeps

rpm -Uvh openssh-* --nodeps   

准备中...            ################################# [100%]
正在升级/安装...
   1:openssh-8.3p1-1.el7      ################################# [ 14%]
   2:openssh-clients-8.3p1-1.el7  ################################# [ 29%]
   3:openssh-server-8.3p1-1.el7  ################################# [ 43%]
   4:openssh-debuginfo-8.3p1-1.el7  ################################# [ 57%]
正在清理/删除...
   5:openssh-server-7.4p1-21.el7 ################################# [ 71%]
   6:openssh-clients-7.4p1-21.el7 ################################# [ 86%]
   7:openssh-7.4p1-21.el7   ################################# [100%]
# 修改配置文件,不然会出现各种报错或着密码正确但是登录失败的情况

chmod 400 /etc/ssh/ssh_host_*

sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication yes/g"  /etc/ssh/sshd_config

sed -i -e "s/#UsePAM no/UsePAM yes/g" /etc/ssh/sshd_config

echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

cd /etc/pam.d && cp -p sshd sshd.newbak && cat sshd.oldbak > sshd
# 重启服务
systemctl restart sshd.service

# 查看状态
systemctl status sshd.service 
# 查看openssh版本命令
$ ssh -V
OpenSSH_8.3p1, OpenSSL 1.1.1h  22 Sep 2020

查看openssl版本命令
openssl version                                                                              [16:23:06]
OpenSSL 1.1.1h  22 Sep 2020




Tip

错误:构建依赖失败: openssl-devel < 1.1

# rpmbuild -ba openssh.spec
# 错误:构建依赖失败: openssl-devel < 1.1 被 openssh-8.0p1-1.el7.x86_64 需要
# 解决: vim openssh.spec 注释掉 BuildRequires: openssl-devel < 1.1 这一行

vim +103 ~/rpmbuild/SPECS/openssh.spec 

错误:发现已安装(但未打包的)文件:

检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssh-8.3p1-1.el7.x86_64
错误:发现已安装(但未打包的)文件:
   /usr/libexec/openssh/ssh-sk-helper
   /usr/share/man/man8/ssh-sk-helper.8.gz

RPM 构建错误:
    发现已安装(但未打包的)文件:
   /usr/libexec/openssh/ssh-sk-helper
   /usr/share/man/man8/ssh-sk-helper.8.gz

发现已安装(但未打包的)文件

解决方法:

首先就是正面解决,把未打包的文件给打包了,修改spec文件:

# 在 openssh.spec 的 %files 段中(366行左右)插入两行。
# %attr(0644,root,root) %{_mandir}/man8/ssh-pkcs11-helper.8* #此行与%endif之间插入以下两行

vim +366 ~/rpmbuild/SPECS/openssh.spec

%attr(0755,root,root) %{_libexecdir}/openssh/ssh-sk-helper
%attr(0644,root,root) %{_mandir}/man8/ssh-sk-helper.8*

如果确实不需要打包,那么就可以按照如下方式修改。修改spec文件,在%install下面添加“%define _unpackaged_files_terminate_build 0”

参考资料:
http://www.openssh.com/
https://www.openssl.org/source/