一、实验背景
发现 SSH 存在许多安全漏洞,原因是 CentOS 7.9 使用了一个比较旧的 OpenSSH 版本 v6.6.1,而这些漏洞在新版的 OpenSSH 中均已被修复,所以出于安全考虑,需要升级。yum 仓库中并没有最新版的 OpenSSH,我们需要自己从官方下载最新的opeenSSh源码包编译制作 rpm 安装包。因为客户服务器不能连外网,所以还需要将其做成离线升级包。
二、实验环境
操作系统: CentOS7.9 Mininal
serverA 192.168.41.140 模拟开发机,能联网,用于制作离线升级包
serverB 10.202.205.22 模拟客户服务器,不能联网,openSSH相关包及其依赖版本较低
三、实验预期
在severA上完成openSSH相关编译及依赖下载,写成一键升级脚本,拖到serverB上完成openSSH的升级。
当前最新openSSh源码包版本为 openssh-8.6p1.tar.gz
四、实验操作
在serverA上操作
## 1.安装工具、依赖包
yum -y install wget epel-release
yum -y install rpm-build gcc make
yum -y install openssl openssl-devel krb5-devel pam-devel libX11-devel xmkmf libXt-devel
## (2种方法试验安装工具、依赖包)
yum -y install rpm-build openssh openssl openssl-devel zlib zlib-devel pam pam-devel tcp_wrappers tcp_wrappers-devel gcc gcc-c++ make automake autoconf libtool
## 2.下载源码包,创建打包目录
cd /root
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz
mkdir -p /root/rpmbuild/{SOURCES,SPECS}
mv openssh-8.6p1.tar.gz /root/rpmbuild/SOURCES/
cd /root/rpmbuild/SOURCES/ && tar xf openssh-8.6p1.tar.gz && cd openssh-8.6p1
## 3.对openssh.spec的12和15行做下更改,删除103行 BuildRequires: openssl-devel < 1.1
vi /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/openssh.spec
... ...
103 BuildRequires: openssl-devel < 1.1
... ...
276 %if %{build6x}
277 install -m644 contrib/redhat/sshd.pam.old $RPM_BUILD_ROOT/etc/pam.d/sshd
278 %else
279 install -m644 contrib/redhat/sshd.pam $RPM_BUILD_ROOT/etc/pam.d/sshd
280 %endif
... ...
## 4.根据openssh.spec文件中279行对源码中的sshd.pam做下修改,修改如下:
cat /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/sshd.pam
#%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
## 5.对sshd.conf文件提前做下更改,添加如下配置
vi /root/rpmbuild/SOURCES/openssh-8.6p1/sshd_config
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
## 6.装包后权限处理(备注:数字0无效 1有效)
sed -i -e "s/%define no_x11_askpass 0/%define no_x11_askpass 1/g" /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/openssh.spec
sed -i -e "s/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g" /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/openssh.spec
sed -i '/BuildRequires: openssl-devel < 1.1/d' /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/openssh.spec
## 7.复制openssh.spec到SPECS打包目录下
cd /root/rpmbuild/SOURCES/openssh-8.6p1/contrib/redhat/
cp -a openssh.spec /root/rpmbuild/SPECS/
## 8.处理掉下载的源码包,将处理后的源码包重新打包
cd /root/rpmbuild/SOURCES/
rm -f openssh-8.6p1.tar.gz
tar zcf openssh-8.6p1.tar.gz -C /root/rpmbuild/SOURCES/ openssh-8.6p1
rm -rf openssh-8.6p1
## 9.开始打包
cd /root/rpmbuild/SPECS
rpmbuild -bb openssh.spec
ll /root/rpmbuild/RPMS/x86_64/
###################################### 打包完毕 ############################################
我打包好的rpm大家可以直接下载使用:
https://pan.baidu.com/s/1iZ2erjTJbAUVeKSjkfSWGg 密码:i26h
五、升级实验
在serverA上进行升级
## 1.升级测试
cd /root/rpmbuild/RPMS/x86_64/
rpm -Uvh openssh-*
ssh -V
## 2.查看升级后sshd文件有没有被替换(如果没有sshd_config.rpmnew文件,跳过2、3步骤)
ll /etc/ssh/sshd_config*
-rw------- 1 root root 3891 May 9 2020 /etc/ssh/sshd_config
-rw------- 1 root root 3149 Mar 1 21:45 /etc/ssh/sshd_config.rpmnew
## 2.1进行手动替换
mv /etc/ssh/sshd_config{,-bak}
mv /etc/ssh/sshd_config.rpmnew /etc/ssh/sshd_config
## 3.替换完查看新配置文件
egrep -v "^$|^#" /etc/ssh/sshd_config
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
## 4.重启ssh服务,重启失败查看失败信息(多半原因是/etc/ssh/ssh_host_*_key权限问题,设置600权限)
service sshd restart
chmod 600 /etc/ssh/ssh_host_*_key
## 5.重启ssh服务
service sshd restart
## 6.通过xshell连接,弹出一个错误对话框,提示“服务器发送了一个意外的数据包。received:3,expected:20”的错误信息。在/etc/ssh/sshd_config最后增加以下一行,然后重启服务
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1
## 7.设置开机启动
chkconfig sshd on
## 8.查看状态
service sshd status
## 9.如果新开终端连接的时,root密码报错,并且已经根据上面后续操作,那可能就是SElinux的问题,我们进行临时禁用,即可正常登录.
setenforce 0
## 10.然后修改/etc/selinux/config文件,进行永久禁用SElinux即可。
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
###################################### 升级完毕 ############################################
六、引用资料、感谢各位大佬
后边跟上 https://www.cnblogs.com/hbgs/p/14466259.html
HunterMichaelG https://blog.csdn.net/michaelwoshi/article/details/108154328