各系统升级openssh
修订号: |
[V1.0] |
修订人: |
[陈土锋] |
修订日期: |
[2019.06.04] |
前言
该文档只适用用于服务器Redhat,centos,Ubuntu和suse系统的openssh升级。需要注意必须要一台一台升级,因为每台系统的环境都不一样,脚本跑出的结果也不一样,所以每个脚本我都加了人机交互的功能,确定没问题了才能进行下一步,避免升级失败带来麻烦。
我的升级方式:
1、登录**.**.**.**,用于测试Telnet,不能通过端口来判断Telnet是否打开,因为有些服务器开启防火墙限制,就算端口打开了,其他机器也不一定能登录。**.**.**.**长时间不动也不会断开。故选该机器。
2、登录**.**.**.**,通过user01用户,批量将相关的脚本和包发送到对应的服务器/tmp目录,并用该机器测试ssh是否正常。
3、直接登录服务器执行升级升级脚本。按照脚本提示测试相关功能,功能正常则进行下一步。
一、升级原理
openssh依赖两个包:zlib-1.2.8.tar.gz,openssl-1.0.1k.tar.gz (目前服务器均已安装这两个包,升级的时候可以直接先升级openssh,有问题再指定这两个包) #安装zlib 在光盘中--如有保留
NFJD-YYXX-MYSQL02:~/openssh-7.9p1 # rpm -qa | grep zlib
zlib-32bit-1.2.7-0.10.128
zlib-1.2.7-0.12.3
#安装zlib,构建共享库
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure --shared
/usr/bin/make install
cp zutil.h /usr/local/include
cp zutil.c /usr/local/include
/sbin/ldconfig -v
##进入安装包上传目录,解压openssl
tar -zxvf openssl-1.0.1k.tar.gz
cd openssl-1.0.1k
./config shared zlib
/usr/bin/make
/usr/bin/make install
#修改配置文件,显示正常版本信息
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig -v
##软件安装之-Openssh安装
##禁用sshd服务,卸载原来的openssh版本,不要乱删除软件
/sbin/service sshd stop cp /etc/init.d/sshd /root/ rpm -e openssh-6.2p2-0.9.1 --nodeps rpm -e openssh-6.2p2-0.9.1
若是系统自带才需要卸载,若是源码编译安装的则不需要卸载。
##解压缩openssh安装包,并进入解压缩文件编译安装
tar -zxvf openssh-8.0p1.tar.gz
cd openssh-8.0p1
./configure --prefix=/usr --with-md5-passwords --with-ssl-dir=/usr/local/openssl --with-zlib=/usr/local/zlib
/usr/bin/make
/usr/bin/make install
##启动调试ssh
#OS SUSE
cd contrib/suse
cp rc.sshd /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chkconfig --add sshd
#OS redhat 和centos
cd contrib/redhat
cp sshd.init /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chkconfig --add sshd
#OS Ubuntu
使用原来的ssh文件(升级之前需要备份下面两个文件):
cp /etc/init.d/ssh /etc/init.d/ssh.${updateTime}
mv /etc/ssh /etc/ssh.${updateTime}
重启服务:
suse、Redhat和centos:service sshd restart
Ubuntu:service ssh restart
相关技巧:
1、查看系统版本号:cat /etc/issue,uname -a
2、需要四个包: openssh-8.0p1.tar,openssl-1.0.1k.tar,telnet-server,zlib-1.2.8
3、安装gcc gcc-c++(各系统安装方式看下面步骤)
4、必须开启Telnet,安全问题,这里不说了。
二、Redhat系统升级openssh
说明:
Redhat开启telnet服务
a)vi /etc/xinetd.d/telnet,将disable=yes改成disable=no;
b)启动telnet服务server xinet drestart或者/etc/init.d/xinetd restart使更改生效。
关闭telnet服务
a)vi /etc/xinetd.d/telnet,将disable=no改成disable=yes;
b)重启xinted服务/etc/init.d/xinetd restart
问题:若发现Telnet已开,但是远程Telnet测试不通,则检查机器防火墙是否已打开。
redhat7.4开启telnet,直接开启,不需要xinetd托管:
systemctl start telnet.socket
systemctl start xinetd
1.1 升级脚本
#!/bin/bash
#该脚本用于红帽系统更新
#author:chentufeng
#createTime:2019 05 28
updateTime=`date +"%Y%m%d"`
verSSH="8.0p1"
#安装Telnet服务
yum -y install telnet-server
# Function : 定义启动关闭Telnet服务函数
# Parameter : $1 kai or guan
#
#
stop_start_telnet(){
if [ $1 == "kai" ];then
sed -i 's@disable[[:space:]][[:space:]]*=[[:space:]][[:space:]]*yes@disable = no@g' /etc/xinetd.d/telnet
elif [ $1 == "guan" ];then
sed -i 's@disable[[:space:]][[:space:]]*=[[:space:]][[:space:]]*no@disable = yes@g' /etc/xinetd.d/telnet
else
echo "目前Telnet处于打开的状态,请知悉!!!"
exit 1
fi
/etc/init.d/xinetd restart
}
stop_start_telnet kai
read -t 360 -p "请测试Telnet是否能通,是否继续安装?(y or n)" jixu
if [ ${jixu} == "n" ];then
echo "停止安装!"
exit 1
fi
tar -zxvf openssh-${verSSH}.tar.gz
echo -e "n\n\n\n\ SSH目前版本是:"
ssh -V
echo -e
read -t 360 -p "是否升级:(y or n)" updateSSH
if [ ${updateSSH} == "y" ];then
cd openssh-${verSSH}
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords
/usr/bin/make
if [ $? -eq 0 ];then
/usr/bin/make install
if [ $? -eq 0 ];then
cd contrib/redhat
mv /etc/init.d/sshd /etc/init.d/sshd.old.${updateTime}
cp sshd.init /etc/init.d/sshd
chmod 755 /etc/init.d/sshd
chkconfig --add sshd
/etc/init.d/sshd restart
else
echo "${hostIP} ssh安装失败!"
exit 1
fi
else
echo "openssh升级失败!!!!!!!!!"
exit 1
fi
else
echo "${hostIP} 不做升级!"
exit 1
fi
echo -e "\n\n\n 现在版本是:"
ssh -V
echo "请测试openssh是否可用!!!!可用的话请输入“guan”,关闭Telnet服务,否则直接回车或输入“kai”"
read -t 360 -p "是否需要关闭Telnet服务?(kai or guan)" telnetStatus
stop_start_telnet ${telnetStatus}
1.2 可能遇到的问题
1.2.1 Telnet没安装
问题:sed: can't read /etc/xinetd.d/telnet: No such file or directory
updateOpenssh.sh: line 22: /etc/init.d/xinetd: No such file or directory
解决:yum -y install telnet-server telnet
若发现yum安装报错,但是这个yum源能用的,可使用下面命令将rpm包下载下来。
wget http://*****8/yum-redhat66.10/Packages/telnet-server-0.17-48.el6.x86_64.rpm
wget http://****/yum-redhat66.10/Packages/telnet-0.17-48.el6.x86_64.rpm
wget http://*****/yum-redhat66.10/Packages/xinetd-2.3.14-40.el6.x86_64.rpm
安装:
rpm -ivh *.rpm
1.2.2 openssl-devel没安装
问题:configure: error: *** working libcrypto not found, check config.log
redhat解决方法:yum -y install openssl-devel
suse OS解决方法:指定openssl安装路径--with-ssl-dir=
三、centos系统升级openssh
说明:
centos6.x开启telnet服务(centos7.x需要用systemctl来启动xinetd)
a)vi /etc/xinetd.d/telnet,将disable=yes改成disable=no;
b)启动telnet服务server xinet drestart或者/etc/init.d/xinetd restart使更改生效。
关闭telnet服务
a)vi /etc/xinetd.d/telnet,将disable=no改成disable=yes;
b)重启xinted服务/etc/init.d/xinetd restart
问题:若发现Telnet已开,但是远程Telnet测试不通,则检查机器防火墙是否已打开。
脚本可以用Redhat的,若是centos7.x系统,将脚本中/etc/init.d/xinetd restart改成systemctl restart xinetd
四、suse系统升级openssh
说明:
suse开启telnet服务
a)vi /etc/xinetd.d/telnet,将disable=yes改成disable=no;
b)启动telnet服务server xinet drestart或者/etc/init.d/xinetd restart使更改生效。
关闭telnet服务
a)vi /etc/xinetd.d/telnet,将disable=no改成disable=yes;
b)重启xinted服务/etc/init.d/xinetd restart
问题:若发现Telnet已开,但是远程Telnet测试不通,则检查机器防火墙是否已打开。
1.1 升级脚本
#!/bin/bash
#该脚本用于suse系统更新
#author:chentufeng
#createTime:2019 05 28
updateTime=`date +"%Y%m%d"`
verSSH="8.0p1"
#安装telnetzypper
zypper in telnet-server
# Function : 定义启动关闭Telnet服务函数
# Parameter : $1 kai or guan
#
#
stop_start_telnet(){
if [ $1 == "kai" ];then
sed -i 's@disable[[:space:]][[:space:]]*=[[:space:]][[:space:]]*yes@disable = no@g' /etc/xinetd.d/telnet
elif [ $1 == "guan" ];then
sed -i 's@disable[[:space:]][[:space:]]*=[[:space:]][[:space:]]*no@disable = yes@g' /etc/xinetd.d/telnet
else
echo "目前Telnet处于打开的状态,请知悉!!!"
exit 1
fi
/etc/init.d/xinetd restart
}
stop_start_telnet kai
read -t 360 -p "请测试Telnet是否能通,是否继续安装?(y or n)" jixu
if [ ${jixu} == "n" ];then
echo "停止安装!"
exit 1
fi
tar -zxvf openssh-${verSSH}.tar.gz
echo -e "n\n\n\n\ SSH目前版本是:"
ssh -V
echo -e
read -t 60 -p "是否升级:(y or n)" updateSSH
if [ ${updateSSH} == "y" ];then
cd openssh-${verSSH}
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-ssl-dir=/usr/local/openssl
/usr/bin/make
if [ $? -eq 0 ];then
#备份源文件
mv /etc/ssh /etc/ssh.${updateTime}
/usr/bin/make install
if [ $? -eq 0 ];then
cd contrib/suse
mv /etc/init.d/sshd /etc/init.d/sshd.old.${updateTime}
cp rc.sshd /etc/init.d/sshd
chmod 755 /etc/init.d/sshd
chkconfig --add sshd
/etc/init.d/sshd restart
else
echo "${hostIP} ssh安装失败!"
exit 1
fi
else
echo "${hostIP} ssh安装失败!"
exit 1
fi
else
echo "${hostIP} 不做升级!"
exit 1
fi
echo -e "n\n\n\n\ SSH目前版本是:"
ssh -V
echo -e
echo "请测试openssh是否可用!!!!可用的话请输入“guan”,关闭Telnet服务,否则直接回车或输入“kai”"
read -t 360 -p "是否需要关闭Telnet服务?(kai or guan)" telnetStatus
stop_start_telnet ${telnetStatus}
1.2 可能遇到的问题
1.2.1 Telnet没安装
suse系统安装Telnet:
suse系统源存放目录:/etc/zypp/repos.d
1、suse配置zypper源
zypper ar http://****:88/suse11_SP3/ suse_20.229
zypper update 必须更新一下源,否则有些机器后面执行zypper命令会自动生成旧的repo源文件,导致安装失败。
2、安装Telnet
zypper in telnet-server
1.2.2 安装ssh成功,但是重启连接不上
查看是否存在sshd进程,切记不要把现在自己连着的进程杀掉,若不小心杀掉只能通过telnet方式进去。如下面查出来的,存在三个进程,导致sshd无法启动的,将相关的进程杀掉之后,重启服务即可。
# ps -ef|grep ssh
root 6533 1 0 11:12 ? 00:00:00 /usr/sbin/sshd -o PidFile=/var/run/sshd_heart.init.pid -f /etc/ssh/sshd_heart_config
root 6547 1 0 11:12 ? 00:00:00 /usr/sbin/sshd -o PidFile=/var/run/sshd_virtual.init.pid -f /etc/ssh/sshd_virtual_config
root 6569 1 0 11:12 ? 00:00:00 /usr/sbin/sshd -o PidFile=/var/run/sshd_intranet.init.pid -f /etc/ssh/sshd_intranet_config
1.2.3 找不到openssl库文件
问题:configure: error: *** working libcrypto not found, check config.log redhat解决方法:yum -y install openssl-devel suse OS解决方法:安装openssl之后,编译指定openssl安装路径--with-ssl-dir
1.2.4 安装成功之后root用户查看ssh -V没问题,但是user01查看版本提示下面错误: OpenSSL version mismatch. Built against 100020bf, you have 1000103f 原因:/etc/profile 设置umask 077,导致root用户创建文件的时候权限是700,即新安装的openssl权限不足,导致普通用户查看不到openssl文件。 解决:chmod 755 /usr/local/openssl -R
五、Ubuntu系统升级openssh
说明:
ubuntu内网可用源:
vim /etc/apt/sources.list
deb http://192.168.20.*:88/ubuntu/ precise main multiverse restricted universe
deb http://192.168.20.*:88/ubuntu/ precise-backports main multiverse restricted universe
deb http://192.168.20.*:88/ubuntu/ precise-proposed main multiverse restricted universe
******省略
更新源:
apt-get update
安装telnet:
apt-get -y --force-yes install openbsd-inetd
apt-get -y --force-yes install telnetd
安装完之后可看到下面信息输出:
cat /etc/inetd.conf | grep telnet
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
启动telnet服务:
/etc/init.d/openbsd-inetd start
问题:有时候启动xinetd服务提示没发现telnetd服务,可能是inetd.conf的telnet配置被注释掉了,取消注释重启即可。
1.1 升级脚本
#!/bin/bash
#该脚本用于ubuntu系统更新
#author:chentufeng
#createTime:2019 05 28
updateTime=`date +"%Y%m%d"`
verSSH="8.0p1"
#安装telnet服务
#ubuntu 源放位置:/etc/apt/sources.list
#apt-get update
apt-get -y --force-yes install openbsd-inetd
apt-get -y --force-yes install telnetd
# Function : 定义启动关闭Telnet服务函数
# Parameter : $1 kai or guan
#
#
stop_start_telnet(){
if [ $1 == "kai" ];then
/etc/init.d/openbsd-inetd start
elif [ $1 == "guan" ];then
/etc/init.d/openbsd-inetd stop
else
echo "目前Telnet处于打开的状态,请知悉!!!"
exit 1
fi
}
stop_start_telnet kai
read -t 360 -p "请测试Telnet是否能通,是否继续安装?(y or n)" jixu
if [ ${jixu} == "n" ];then
echo "停止安装!"
exit 1
fi
tar -zxvf openssh-${verSSH}.tar.gz
echo -e
echo "目前版本为:"
ssh -V
echo -e "\n \n"
read -t 60 -p "是否升级:(y or n)" updateSSH
if [ ${updateSSH} == "y" ];then
cd openssh-${verSSH}
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords -with-ssl-dir=/usr/local/openssl
/usr/bin/make
if [ $? -eq 0 ];then
# 备份原openssh文件
cp /etc/init.d/ssh /etc/init.d/ssh.${updateTime}
mv /etc/ssh /etc/ssh.${updateTime}
mv /usr/bin/ssh /usr/bin/ssh.${updateTime}
/usr/bin/make install
if [ $? -eq 0 ];then
#systemVer=`awk '{print $1}' /etc/redhat-release`
cd /etc/ssh
mv sshd_config sshd_config.default
cp ../ssh.${updateTime}/sshd_config ./
echo "/etc/init.d/ssh restart" >>/etc/rc.local
service ssh restart
ls -l /etc/init.d/ssh
ls -l /etc/ssh
else
echo "${hostIP} ssh安装失败!"
exit 1
fi
else
echo "openssh升级失败!!!!!!!!!"
exit 1
fi
else
echo "${hostIP} 不做升级!"
exit 1
fi
echo -e
echo "目前版本为:"
ssh -V
echo "请测试openssh是否可用!!!!可用的话请输入“guan”,关闭Telnet服务,否则直接回车或输入“kai”"
read -t 360 -p "是否需要关闭Telnet服务?(kai or guan)" telnetStatus
stop_start_telnet ${telnetStatus}
1.2 可能遇到的问题
1.2.1 openssl版本过低
configure: error: OpenSSL version header not found.
make: *** No targets specified and no makefile found. Stop.
OpenSSH_6.2p2, OpenSSL 0.9.8j-fips 07 Jan 2009
解决:升级openssl
1.2.2 报下面错误
configure: error: Your OpenSSL headers do not match your
library. Check config.log for details.
If you are sure your installation is consistent, you can disable the check
by running "./configure --without-openssl-header-check".
Also see contrib/findssl.sh for help identifying header/library mismatches.
以上报错处理方法都一样,尝试过多种方法,下面三种可以解决:
1、先重装下面软件,再重新编译ssh
移除多余的文件:
mv /lib/x86_64-linux-gnu/libcrypto.so.1.0.0.lib_x86 ~/bak/
mv /lib/x86_64-linux-gnu/libssl.so.1.0.0.usr_lib ~/bak/
重装:
apt-get install openssl* libssl-dev openssh* --reinstall
2、重新安装openssl,指定ssl的库文件和安装目录
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig -v
编译ssh的时候加-with-ssl-dir=/usr/local/openssl
3、先用第一种方法恢复默认openssl和ssl库,再用第二种方法
1.2.3 找不到库文件
configure: error: *** working libcrypto not found, check config.log
解决:编译ssh的时候加-with-ssl-dir=/usr/local/openssl
六、redhat7.4升级openssh
1.1 升级脚本:
#!/bin/bash
#该脚本用于北方机器红帽系统7.4更新
#author:chentufeng
#createTime:2019 06 19
updateTime=`date +"%Y%m%d"`
verSSH="8.0p1"
#安装Telnet服务
yum -y install telnet-server
# Function : 定义启动关闭Telnet服务函数
# Parameter : $1 kai or guan
#
#
stop_start_telnet(){
if [ $1 == "kai" ];then
systemctl start telnet.socket
systemctl start xinetd
echo "telnet 已开启........"
elif [ $1 == "guan" ];then
systemctl stop telnet.socket
systemctl stop xinetd
echo "telnet 已关闭........"
else
echo "目前Telnet处于打开的状态,请知悉!!!"
exit 1
fi
}
stop_start_telnet kai
read -t 360 -p "请测试Telnet是否能通,是否继续安装?(y or n)" jixu
if [ ${jixu} == "n" ];then
echo "停止安装!"
exit 1
fi
tar -zxvf openssh-${verSSH}.tar.gz
echo -e "n\n\n\n\ SSH目前版本是:"
ssh -V
echo -e
read -t 360 -p "是否升级:(y or n)" updateSSH
if [ ${updateSSH} == "y" ];then
cd openssh-${verSSH}
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords
/usr/bin/make
if [ $? -eq 0 ];then
mv /etc/ssh /etc/ssh.${updateTime}
mv /etc/init.d/sshd /etc/init.d/sshd.${updateTime}
mv /usr/bin/ssh /usr/bin/ssh.${updateTime}
mv /usr/sbin/sshd /usr/sbin/sshd.${updateTime}
/usr/bin/make install
if [ $? -eq 0 ];then
cd contrib/redhat
cp sshd.init /etc/init.d/sshd
chmod 755 /etc/init.d/sshd
chkconfig --add sshd
/etc/init.d/sshd restart
else
echo "${hostIP} ssh安装失败!"
exit 1
fi
else
echo "openssh升级失败!!!!!!!!!"
exit 1
fi
else
echo "${hostIP} 不做升级!"
exit 1
fi
echo -e "\n\n\n 现在版本是:"
ssh -V
echo "请测试openssh是否可用!!!!可用的话请输入“guan”,关闭Telnet服务,否则直接回车或输入“kai”"
read -t 360 -p "是否需要关闭Telnet服务?(kai or guan)" telnetStatus
stop_start_telnet ${telnetStatus}
1.2 可能遇到的问题:
service sshd restart --卡主很久,然后报下面错
Restarting sshd (via systemctl):
Job for sshd.service failed because a timeout was exceeded. See "systemctl status sshd.service" and "journalctl -xe" for details.[FAILED]
原因:sshd的启动文件路径改动
解决方法:
找到旧的sshd文件:locate sshd.service
/usr/lib/systemd/system/sshd.service
删除或者改名:
mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.20190619
重新加载:
systemctl daemon-reload
再重新启动sshd:
service sshd restart
附录
1.1 升级openssl
可能会报openssl的错:如找不到openssl头文件,或者openssl版本不一致等,都可以使用指定openssl(--with-ssl-dir)来进行编译安装解决。
查看原来版本:
openssl version -a
OpenSSL 1.1.0……
由于1.1版本和openssh冲突,需要降级到1.0.2
注意:一般有些机器前同事在升级openssh其他版本的时候已经安装了1.0.2,只是没有配置环境,你的解决方法有如下:
1、使用已经安装好的openssl来升级openssh(加参数:--with-ssl-dir=/usr/local/openssl),需添加库目录到/etc/ld.so.conf。参考下面步骤!
2、自己新装一个openssl
步骤如下:
tar zxvf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k/
./config --shared zlib-dynamic --prefix=/usr/local/openssl
make
make test
make install
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig -v
mv /usr/bin/openssl /usr/bin/openssl.20190604
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
mv /usr/include/openssl /usr/include/openssl.20190604
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
mv /usr/local/bin/openssl /usr/local/bin/openssl.20190604
ln -s /usr/local/openssl/bin/openssl /usr/local/bin/openssl
问题:若做完上述步骤,使用openssl version查看还是1.1版本,可能是/etc/ld.so.conf文件还配置了其他的lib。
cat /etc/ld.so.conf 发现include /etc/ld.so.conf.d/*.conf配置,发现这个子目录还包含其他lib,需要改成openssl路径:/usr/local/openssl/lib,再/sbin/ldconfig -v,再查看下版本即可。