openssh8.4p1 rpm包制作升级

Openssh 8.4p1制作成rpm包批量升级

文章简介

目的:解决openssh安全漏洞(CVE-2019-16905、CVE-2020-15778)
机器较少时,是一台一台的编译安装是比较轻松,当机器达到几十上百台时,openssh的安装将成为一个繁重的工作,如果能将openssh的源码包制作成rpm格式的安装包,这将降低了安装openssh的难度和减轻了安装openssh的工作量。
本文将介绍如何通过openssh官方源码包生产rpm的安装包,制作RPM包报错解决思路,及升级过程的方式方法。

一、制作RPM包,确认操作系统,内核版本,openssh当前版本,目标openssh版本。

1、操作系统:CentOS Linux release 7.9.2009 (Core)
2、内核版本:Linux version 3.10.0-1160.el7.x86_64
3、openssh版本:OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
4、openssh目标版本:OpenSSH_8.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017

二、制作过程

1、下载相关依赖包,安装制作工具等。

[root@localhost ~]# yum -y install rpm-build gcc gcc-c++ glibc glibc-devel openssl-devel openssl prce pcre-devel zlib zlib-devel make wget krb5-devel pam-devel libX11-devel xmkmf libXt-devel initscripts libXt-devel imake gtk2-devel

2、查看若没有rpmbuild目录,可手动创建得到一个完整的rpmbuild目录

[root@localhost ~]# mkdir -p rpmbuild/{SOURCES,SPECS,RPMS,SRPMS,BUILD,BUILDROOT}

3、下载好制作rpm包需要的源码文件及依赖包

openssh8.4p1下载地址:https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.4p1.tar.gz
/x11-ssh-askpass下载地址:http://ftp.riken.jp/Linux/momonga/6/Everything/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz

4、切换路径,解压openssh-8.4p1.tar.gz,拷贝文件。(注,这里使用VM,root,可创建普通用户给与权限的方法操作)

[root@localhost ~]# cd /home/rpmbuild/SOURCES
[root@localhost ~]# tar xf openssh-8.4p1.tar.gz
[root@localhost ~]# cd openssh-8.4p1/contrib/redhat
[root@localhost ~]# cp openssh.spec /home/rpmbuild/SPECS/

5、修改、优化spec文件。

[root@localhost ~]# vim /home/rpmbuild/SPECS

第一处修改:12行,15行,原openssh.spec的文件内容为0,改为1
# Do we want to disable building of x11-askpass? (1=yes 0=no)
%global no_x11_askpass 1
# Do we want to disable building of gnome-askpass? (1=yes 0=no)
%global no_gnome_askpass 1
第二处修改:104行 原openssh.spec文件中把行改为注释BuildRequires: openssl-devel < 1.1
Requires: initscripts >= 5.20
%endif
BuildRequires: perl
%if %{compat_openssl}
BuildRequires: compat-openssl10-devel
%else
BuildRequires: openssl-devel >= 1.0.1
# BuildRequires: openssl-devel < 1.1
%endif
BuildRequires: /bin/login
%if ! %{build6x}
第三处修改:89行,原 openssh.spec文件89行,增加Source2: sshd,
URL: https://www.openssh.com/portable.html
Source0: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz
Source1: http://www.jmknoble.net/software/x11-ssh-askpass/x11-ssh-askpass-%{aversion}.tar.gz
Source2: sshd
License: BSD
Group: Applications/Internet
BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
第四处修改:280-281行

原openssh.spec文件把行install -m644 contrib/redhat/sshd.pam$RPM_BUILD_ROOT/etc/pam.d/sshd 改为注释

%if %{build6x}
install -m644 contrib/redhat/sshd.pam.old $RPM_BUILD_ROOT/etc/pam.d/sshd
%else
#install -m644 contrib/redhat/sshd.pam     $RPM_BUILD_ROOT/etc/pam.d/sshd
install -m644 $RPM_SOURCE_DIR/sshd $RPM_BUILD_ROOT/etc/pam.d/sshd

%endif
install -m755 contrib/redhat/sshd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/sshd
第五处修改:342行,需要添加的内容挺多的,从cp -r /etc/ssh /etc/ssh_bak 到service sshd restart ,从342行到356行的内容进行添加。
%pre server
%{_sbindir}/groupadd -r -g %{sshd_gid} sshd 2>/dev/null || :
%{_sbindir}/useradd -d /var/empty/sshd -s /bin/false -u %{sshd_uid} \
    -g sshd -M -r sshd 2>/dev/null || :
#从这里开始复制
cp -r /etc/ssh /etc/ssh_bak

%post server    #一行原文里面有,如果原文复制,这一行先,行改为注释
chmod  600  /etc/ssh/ssh_host_*_key
sed -i -e  "s/#PasswordAuthentication yes/PasswordAuthentication yes/g"  /etc/ssh/sshd_config
sed -i -e  "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g"    /etc/ssh/sshd_config
sed -i -e  "s/#PermitEmptyPasswords no/PermitEmptyPasswords no/g"  /etc/ssh/sshd_config
sed -i  -e  "s/#UsePAM no/UsePAM yes/g"  /etc/ssh/sshd_config
sed -i -e "s/#X11Forwarding no/X11Forwarding yes/g" /etc/ssh/sshd_config
echo "KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1" >>/etc/ssh/sshd_config
chmod +x /etc/init.d/sshd
mv  /usr/lib/systemd/system/sshd.service  /opt/
mv  /usr/lib/systemd/system/sshd.socket  /opt/
/sbin/chkconfig --add sshd
service sshd restart
#这里结束
%postun server
/sbin/service sshd condrestart > /dev/null 2>&1 || :

6、准备完毕,开始制作rpm包,

[root@localhost ~]# cd rpmbuild/SPECS
[root@localhost SPECS]# rpmbuild -bb openssh.spec

制作成功后的输出结果
Requires: /bin/bash libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.16)(64bit) libc.so.6(GLIBC_2.17)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libc.so.6(GLIBC_2.8)(64bit) libcom_err.so.2()(64bit) libcrypt.so.1()(64bit) libcrypt.so.1(GLIBC_2.2.5)(64bit) libcrypto.so.10()(64bit) libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) libcrypto.so.10(OPENSSL_1.0.2)(64bit) libcrypto.so.10(libcrypto.so.10)(64bit) libdl.so.2()(64bit) libgssapi_krb5.so.2()(64bit) libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit) libk5crypto.so.3()(64bit) libkrb5.so.3()(64bit) libkrb5.so.3(krb5_3_MIT)(64bit) libpam.so.0()(64bit) libpam.so.0(LIBPAM_1.0)(64bit) libresolv.so.2()(64bit) libutil.so.1()(64bit) libutil.so.1(GLIBC_2.2.5)(64bit) libz.so.1()(64bit) rtld(GNU_HASH)
Obsoletes: ssh-server
Processing files: openssh-debuginfo-8.4p1-1.el7.x86_64
Provides: openssh-debuginfo = 8.4p1-1.el7 openssh-debuginfo(x86-64) = 8.4p1-1.el7
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssh-8.4p1-1.el7.x86_64
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-8.4p1-1.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-clients-8.4p1-1.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-server-8.4p1-1.el7.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-debuginfo-8.4p1-1.el7.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.RK1ICd
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openssh-8.4p1
+ rm -rf /root/rpmbuild/BUILDROOT/openssh-8.4p1-1.el7.x86_64
+ exit 0

7、制作完RPM包。可以看到在/root/rpmbuild/RPMS/x86_64/路径下会有4个rpm包。注意:构建完成后,会生成一个debug的rpm包,安装时无需安装此包

[root@localhost ~]#ls /root/rpmbuild/RPMS/x86_64/
openssh-8.4p1-1.el7.x86_64.rpm openssh-debuginfo-8.4p1-1.el7.x86_64.rpm
openssh-clients-8.4p1-1.el7.x86_64.rpm openssh-server-8.4p1-1.el7.x86_64.rpm

三、升级

1、准备VM ,2台,确认好没安装之前ssh版本信息,多开一个信息口接收,注意,这里可以多开端口防止因升级失败无法连接。
2、升级实施过程,这里介绍三种方式
第一种安装方法如下,建议使用该方法。
确认版本信息
ssh -V                 
rpm -qa|grep openssh   
备份设置
cd /root/openssh
cp /etc/pam.d/sshd pam-ssh-conf-old-$(date +%F)      
cp -r /etc/ssh /etc/ssh_$(date +%F)      
 解压,此步骤可以省略。
tar xf openssh-8.1p1-1.el7.x86_64.tar 
 安装openssh
rpm -U *.rpm
 恢复配置
mv /etc/pam.d/sshd /etc/pam.d/sshd_$(date +%F)
cp pam-ssh-conf-old-$(date +%F) /etc/pam.d/sshd
重启openssh
systemctl restart sshd
查看版本信息确认升级完成
ssh -V    /   rpm -qa|grep openssh  
第二种安装方法如下(这种方法会自动处理依赖关系):
ssh -V                 
rpm -qa|grep openssh   
yum install ./*.rpm
部分机器使用方法二安装会提示依赖问题,可以使用以下方法:
yum update *.rpm
至此,升级完成,新开SSH终端连接即可。
因为openssh升级后,/etc/ssh/sshd_config会还原至默认状态,我们需要进行相应配置:
cd /etc/ssh/
chmod 400 ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes"  >> /etc/ssh/sshd_config
systemctl restart sshd
setenforce 0
即可正常登录,然后修改/etc/selinux/config 文件:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
进行永久禁用SElinux即可。
ssh -V                 
rpm -qa|grep openssh   
查看版本信息确认升级完成
注意:
如果Centos7默认openssl版本不为OpenSSL 1.0.2k,就需要先进行升级:
yum install openssl -y
然后回到第一步进行安装即可。
第三种安装方法如下:
rpm -Uvh *.rpm
安装后会如下提示:
[root@test ~]# rpm -Uvh *.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:openssh-8.4p1-1.el7              ################################# [ 14%]
   2:openssh-clients-8.4p1-1.el7      ################################# [ 29%]
   3:openssh-server-8.4p1-1.el7       ################################# [ 43%]
   4:openssh-debuginfo-8.4p1-1.el7    ################################# [ 57%]
Cleaning up / removing...
   5:openssh-server-7.4p1-16.el7      ################################# [ 71%]
   6:openssh-clients-7.4p1-16.el7     ################################# [ 86%]
   7:openssh-7.4p1-16.el7             ################################# [100%]
[root@test ~]# ssh -V
OpenSSH_8.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
 修改权限
cd /etc/ssh/
chmod 400 ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
允许 root登录
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
不修改这个文件,会出现密码是正确的,但无法登陆。
cat <<EOF>/etc/pam.d/sshd
#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
## pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
## pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth
EOF
 重启服务
systemctl restart sshd
确认版本信息
ssh -V 
rpm -qa |grep openssh

3、检查升级是否成功

ssh -V
rpm -qa |grep openssh
重开连接

无论使用的是哪种升级方法,都要重开ssh连接,或者ssh xxx@192.168.2xx.1xx。只有重新连接成功,升级才算完成。

4、报错归纳:

(1)、在制作RPM包时,可能会报以下的错误:

Processing files: openssh-server-8.4p1-1.el7.x86_64
error: File not found: /root/rpmbuild/BUILDROOT/openssh-8.4p1-1.el7.x86_64/etc/pam.d/sshd
RPM build errors:
    File not found: /root/rpmbuild/BUILDROOT/openssh-8.4p1-1.el7.x86_64/etc/pam.d/sshd

解决的办法是:在openssh.spec 280-281行中,把刚才我们标记改为注释的内容去掉,把注释改为行,重新rpmbuild -bb openssh.spec即可 。

在openssh.spec文件,以下把内容开头部分注释去掉改为行
install -m644 contrib/redhat/sshd.pam$RPM_BUILD_ROOT/etc/pam.d/sshd 

(2)安装过程,使用第一种安装方法,安装完毕后会有两个警告,但是是正常的。警告信息如下:

[root@localhost openssh]# rpm -U *.rpm
Restarting sshd (via systemctl):                           [  OK  ]
warning: file /usr/lib/systemd/system/sshd.socket: remove failed: No such file or directory
warning: file /usr/lib/systemd/system/sshd.service: remove failed: No such file or directory

(3)使用第2种安装方法,安装完毕后可能会报有以下错误。

It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Unable to load host key "/etc/ssh/ssh_host_ed25519_key": bad permissions
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
[FAILED]
sshd.service: control process exited, code=exited status=1
Failed to start SYSV: OpenSSH server daemon.
Unit sshd.service entered failed state.
sshd.service failed.

解决的办法是:

chmod 0600 /etc/ssh/ssh_host_ed25519_key
service sshd restart

(4)使用第二、三种方式进行安装,/etc/pam.d/sshd文件会被覆盖,需要进行还原。

先清空:
>/etc/pam.d/sshd;
再j进行还原:
echo '#%PAM-1.0
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth'>/etc/pam.d/sshd
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容