各系统升级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.conftelnet配置被注释掉了,取消注释重启即可。

 

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,再查看下版本即可。

 

posted @ 2019-06-26 09:12  木与风  阅读(1714)  评论(0编辑  收藏  举报