在centos6下编译openssh-9.8p1的rpm包
1、创建用于rpm编译的目录
mkdir -p /root/rpmbuild/SPEC
mkdir -p /root/rpmbuild/SOURCES
2、安装rpmbuild和一些其它的基本依赖
yum install gcc gcc-c++ rpm-build -y
3、上传openssh-9.8p1.tar.gz 这个源码包到centos6服务器上,并解压,解压后将SPEC文件复制到/root/rpmbuild/SPEC目录下
(源码包和askpass压缩包都在附件1里面)
将openssh-9.8的源码包和x11-ssh-askpass-1.2.4.1.tar.gz放置到 /root/rpmbuild/SOURCES 目录下
x11-ssh-askpass-1.2.4.1.tar.gz的下载地址是Index of /repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz
以上工作做完后,试运行编译
[root@centos6666 ~]# cp openssh-9.8p1/contrib/redhat/
gnome-ssh-askpass.csh gnome-ssh-askpass.sh openssh.spec sshd.init sshd.pam
[root@centos6666 ~]# cp openssh-9.8p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/
[root@centos6666 ~]# cd !$
cd /root/rpmbuild/SPECS/
[root@centos6666 SPECS]# rpmbuild -ba openssh.spec
warning: line 97: prereq is deprecated: PreReq: initscripts >= 5.00
error: Failed build dependencies:
/usr/include/security/pam_appl.h is needed by openssh-9.8p1-1.el6.x86_64
/usr/include/X11/Xlib.h is needed by openssh-9.8p1-1.el6.x86_64
libXt-devel is needed by openssh-9.8p1-1.el6.x86_64
imake is needed by openssh-9.8p1-1.el6.x86_64
gtk2-devel is needed by openssh-9.8p1-1.el6.x86_64
krb5-devel is needed by openssh-9.8p1-1.el6.x86_64
[root@centos6666 SPECS]# ls ../SOURCES/
openssh-9.8p1.tar.gz x11-ssh-askpass-1.2.4.1.tar.gz
可以看到还是缺少很多依赖,安装以上缺少的依赖
4、安装缺少的依赖
yum install krb5-devel gtk2-devel imake libXt-devel pam pam-devel -y
5、再次执行编译
这次基本就完成了rpm包的编译,非常快
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libICE.so.6()(64bit) libSM.so.6()(64bit) libX11.so.6()(64bit) libXt.so.6()(64bit) libc.so.6()(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) rtld(GNU_HASH)
Obsoletes: ssh-extras
Processing files: openssh-askpass-gnome-9.8p1-1.el6.x86_64
Provides: config(openssh-askpass-gnome) = 9.8p1-1.el6
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libX11.so.6()(64bit) libatk-1.0.so.0()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libcairo.so.2()(64bit) libfontconfig.so.1()(64bit) libfreetype.so.6()(64bit) libgdk-x11-2.0.so.0()(64bit) libgdk_pixbuf-2.0.so.0()(64bit) libgio-2.0.so.0()(64bit) libglib-2.0.so.0()(64bit) libgmodule-2.0.so.0()(64bit) libgobject-2.0.so.0()(64bit) libgthread-2.0.so.0()(64bit) libgtk-x11-2.0.so.0()(64bit) libpango-1.0.so.0()(64bit) libpangocairo-1.0.so.0()(64bit) libpangoft2-1.0.so.0()(64bit) libpthread.so.0()(64bit) librt.so.1()(64bit) rtld(GNU_HASH)
Obsoletes: ssh-extras
Processing files: openssh-debuginfo-9.8p1-1.el6.x86_64
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssh-9.8p1-1.el6.x86_64
warning: Could not canonicalize hostname: centos6666
Wrote: /root/rpmbuild/SRPMS/openssh-9.8p1-1.el6.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-9.8p1-1.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-clients-9.8p1-1.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-server-9.8p1-1.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-askpass-9.8p1-1.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-askpass-gnome-9.8p1-1.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/openssh-debuginfo-9.8p1-1.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.8n4pMP
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openssh-9.8p1
+ rm -rf /root/rpmbuild/BUILDROOT/openssh-9.8p1-1.el6.x86_64
+ exit 0
编译产出物是在/root/rpmbuild/RPMS/x86_64目录(由于我是使用的x86架构机器编译的,因此是该目录)和SRPMS目录下
root@centos6666 SPECS]# ls -alh ../RPMS/x86_64/
total 5.6M
drwxr-xr-x 2 root root 4.0K Jul 27 20:56 .
drwxr-xr-x 3 root root 4.0K Jul 27 20:56 ..
-rw-r--r-- 1 root root 541K Jul 27 20:56 openssh-9.8p1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 42K Jul 27 20:56 openssh-askpass-9.8p1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 25K Jul 27 20:56 openssh-askpass-gnome-9.8p1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 728K Jul 27 20:56 openssh-clients-9.8p1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 3.6M Jul 27 20:56 openssh-debuginfo-9.8p1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root 660K Jul 27 20:56 openssh-server-9.8p1-1.el6.x86_64.rpm
[root@centos6666 SPECS]# ls -alh ../SRPMS/
total 1.9M
drwxr-xr-x 2 root root 4.0K Jul 27 20:56 .
drwxr-xr-x 8 root root 4.0K Jul 26 22:27 ..
-rw-r--r-- 1 root root 1.9M Jul 27 20:56 openssh-9.8p1-1.el6.src.rpm
下面是如何安全的在centos6操作系统下升级OpenSSH服务到最新版9.8p1
openssh服务升级到最新版本OpenSSH-9.8p1完全手册
升级步骤
必看的重要提示:
1、
建议启用telnet服务,给自己留一个后门,如果实在懒得安装,对本次sshd服务的升级比较有把握,在升级OpenSSH期间,必须保留一个可用的shell 窗口
2、
务必按照本文档的操作顺序执行升级步骤,遇到服务异常的问题,冷静对待;在升级OpenSSH完成后,按本文档的测试建议进行充分的测试,确认升级无误后在关闭shell窗口
3、
经常性的查看OpenSSH的服务状态,也就是service sshd status 及时发现升级中出现的问题,并按标准的流程解决所出现的问题,尽量使用yum的方式安装包括
4、
附件1是OpenSSH的源码安装包和强依赖askpass,也包含有ssh-copy-id 这个简单的脚本程序
附件2是 升级安装包,包含新旧两个版本的OpenSSH,还有telnet-server安装包和lrzsz文件传输工具以及详细的word形式的升级手册
附件3是OpenSSH的一个通用的配置文件,该配置文件开放的端口定义是10022,是一个比较通用的sshd服务主配置文件,建议统一使用这个配置文件
5、
请注意本文内的标红字段
第一个步骤---注入本地仓库
安装用得压缩包(也就是附件2)上传到服务器后,执行下面的命令,生成仓库,注意,压缩包要上传到root用户的根目录下
解压缩命令:
解压完毕后,执行以下命令,注入本地仓库
第二个步骤:
确认sshd版本,是否需要升级,也就是查看sshd的版本,命令如下:
一般输出如下,sshd的版本是5.3,或者其它的确定需要升级的版本:
第三个步骤---防止升级失败的首要措施(强烈建议执行,不要投机取巧):
启用telnet服务
yum install telnet-server –y
输出如下:
安装完毕后,执行以下命令,给予telnet登陆权限:
编辑/etc/xinetd.d/telnet,disable = yes ,yes修改为no 保存文件即可,最终如下图所示:
启动telnet服务,服务端口号是23,使用xshell等工具测试利用telnet能够成功登陆即可
telnet启动命令:
Xshell等工具登陆示例:
第四个步骤---备份
主要是sshd服务的配置文件,如果升级OpenSSH彻底失败,需要利用此备份文件完全回退
命令如下:
第五个步骤---正式升级OpenSSH
- 执行以下命令升级安装OpenSSH-9.8p1
如果升级sshd服务彻底失败后的回退方案[7]
检查确认是否升级成功
- 查看sshd的版本号
- 重启sshd服务,查看服务状态是否有报错:
sshd服务的自启动说明
,
在centos6 版本下,sshd服务是由chkconfig控制自启的,因此,自启命令为(正常情况为无输出):
测试sshd功能是否正常[i]
-
-
- 使用ssh命令远程连接一个服务器,看是否可以正常连接到,这是测试ssh客户端功能
- 利用xshell等运维工具,打开一个新的远程连接窗口,确认可正常登陆,这是测试ssh服务端功能
- 使用ssh-copy-id命令配置一次免密登陆,确认该工具是否正常
- 使用scp 命令传送任意的测试文件,确认sshd功能完整正常
-
清理升级过程的垃圾文件并关闭telnet服务
在确认sshd服务升级安装成功后
- 删除以上用到的仓库文件,仓库文件在/etc/yum.repos.d目录下
- 删除openssh-9.8p1-centos6.tar.gz 这个安装包
- 删除/root/ openssh-9.8p1-centos6这个目录
- 停止telnet服务,命令为service xinetd stop
输出如下:
一些常见的错误的处理流程
*(这些是centos7下升级sshd时的报错,目前在centos6,升级sshd还没有遇到任何错误,以后遇到了在记录,这些仅供参考)
- 第一种sshd服务状态错误情况(在cetos6还没遇到错误,这个是cetos7的,以后遇到了在补充):
如果有遇到sshd服务状态(systemctl status sshd命令)里带有Permissions字样的报错,例如下面这样的:
提示有哪些报错的文件赋权,赋权后重启sshd服务,示例如下:
- 第二种sshd服务状态错误的情况:
如果sshd服务状态(systemctl status sshd命令)内有format字样,需要回退到低版本7.4p,回退步骤见上面的回退方案,然后重新生成sshd服务的证书文件,一般是四个
命令如下:
以上命令都需要先手动输入y,表示同意覆盖,然后回车直到命令结束
证书文件生成后,在利用for循环命令删除低版本sshd,然后再次升级sshd就可以正常升级完成了,如果懒得修改配置文件,直接使用附件4命令即可,建议还是重复上面的正式升级步骤
附件1:OpenSSH-9.8p1的源码安装包和askpass
链接: https://pan.baidu.com/s/1V08KtiDrm8aH_St60KMFPw?pwd=xju7 提取码: xju7
附件2:OpenSSH-9.8p1的本地仓库文件和OpenSSH-9.8p1的升级手册
链接: https://pan.baidu.com/s/1xf1ujEIEe2TqQbsfU5t4IA?pwd=5ny2 提取码: 5ny2
附件3:
通用的sshd主配置文件:
[1] #安装方式可以使用本地仓库,也可以直接本地安装,不通过仓库,两种安装方式,任选一个就可以了,建议优先使用yum install这个命令,此方式会自动卸载旧的OpenSSH,可以避免一些不必要的麻烦
[2] #安装方式可以使用本地仓库,也可以直接本地安装,不通过仓库,两种安装方式,任选一个就可以了,建议优先使用yum install这个命令,此方式会自动卸载旧的OpenSSH,可以避免一些不必要的麻烦
[3] 权限不能太高,因此是0600,如果发现sshd服务状态有报错的情况下
[4] ###使用附件4,通用的OpenSSH服务配置文件,复制附件4,在shell内执行即可,可自动注入覆盖 OpenSSH的配置文件
[5] ###重新启动sshd服务,并查看sshd服务状态,如果sshd服务一切正常的话
[6] ###缺失的ssh-copy-id命令拷贝到操作系统的环境变量内
[7] 回退方案说明:如果新OpenSSH-9.8p1升级后,发现服务有异常并且在短期内无法解决的错误,例如,sshd服务异常断开,此时可以利用telnet-server 服务远程登陆服务器并按下面的步骤执行回退
[i] 建议测试的时候不要遗漏,sshd服务是重要的服务,不能容忍升级失败