升级openssh【RedHat/CentOS 6.3、6.4、6.5】

FileName: upgrade opensshd-linux-2018.txt

注1:本文档已在如下版本测试通过 RedHat/CentOS 6.3、6.4、6.5
注2:本文采用新安装方式,保留已有版本的openssl、openssh、zlib,好处是可以回退旧版本。

首先配置yum,用于安装可能需要的package

■■挂载OS的iso镜像
mount -o loop /u01/soft/rhel.iso /mnt/iso
修改/etc/fstab,设置开机挂载iso:
/opt/soft/rhel.iso /mnt/iso iso9660 loop,ro,auto 0 0

■■yum配置-local
■屏蔽默认配置目录/etc/yum.repos.d
mv /etc/yum.repos.d /etc/yum.repos.d.old
■修改/etc/yum.conf,添加文件位置,并启用enabled
[server]
name=server
baseurl=file:///mnt/iso
enabled=yes
gpgcheck=no

■■yum配置-http
■server端配置
yum install httpd
ln -s /mnt/iso /var/www/html/os
■client端配置
mv /etc/yum.repos.d /etc/yum.repos.d.old
修改/etc/yum.conf
[os-6.4-sxyd]
name=Red Hat Enterprise Linux
baseurl = http://10.209.199.184/os
gpgcheck=0
gpgkey  = http://10.209.199.184/os/repodata/repomd.xml
[os-6.3-nmyd]
name=Red Hat Enterprise Linux
baseurl = http://10.154.12.11/os
gpgcheck=0
gpgkey  = http://10.154.12.11/os/repodata/repomd.xml

■■配置telnet服务、gcc编译器
目的:便于远程操作、配置新版本的openssh,同时确保不会因为升级SSH失误导致无法远程登陆主机
■确认telnet服务是否已经安装
yum info telnet*
■如果没有安装telnet-server
yum install telnet-server
■安装telnet server后,修改/etc/xinetd.d/telnet的disable一行为no
service telnet
{
flags           = REUSE
socket_type     = stream
wait            = no
user            = root
server          = /usr/sbin/in.telnetd
log_on_failure  += USERID
disable         = no
}
■安装telnet server后,改名/etc/securetty文件
mv /etc/securetty /etc/securetty.old
■启动xinetd服务,即同时启动了telnet服务
service xinetd start
同时确认xinetd默认开机启动:chkconfig xinetd on
■此时测试能否远程telnet登陆服务器,确认telnet服务生效后,就可以进行下一步

■升级openssh需gcc编译器,确认是否安装
yum info gcc
如没有安装,则安装:
yum install gcc

■■安装新版本zlib
下载最新的源码【版本1.2.11】
www.zlib.net
tar xvfz zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make
make install

■■安装新版本openssl,保留已有的openssl
下载适当版本的源码【版本1.0.2m】
www.openssl.org
■配置编译openssl到/usr/local目录
tar xvfz openssl-1.0.2m.tar.gz
cd openssl-1.0.2m
./config --prefix=/usr/local --openssldir=/usr/local --shared zlib
make clean(这一步有时很关键,尤其在排错时)
make
make test
(test这一步是进行 SSL 加密协议的完整测试,如出现错误需找出原因,否则可能导致 SSH 不能使用)
make install
■确认openssl版本
/usr/local/bin/openssl version -a
■config加--shared选项, 否则openssh编译的时候可能会找不到新安装的openssl的library, 会报错: openssl的 header和library版本不匹配
■config增加zlib选项,可解决最后的错误提示“Zlib not supported: compression tests skipped”
■如果make时报错如下
c_zlib.c:25:18: 错误:zlib.h:没有那个文件或目录
原因是没有zlib的devel库,需要安装devel库:yum install zlib-delvel

■■安装新版本openssh,保留已有的openssh
下载相关源码【版本7.6p1】
www.openssh.com
■备份已有的ssh
mv /etc/ssh /etc/ssh.old
■配置、编译、安装ssh
tar xvfz openssh-7.6p1.tar.gz
cd openssh-7.6p1
./configure --prefix=/usr/local --sysconfdir=/etc/ssh --with-pam --with-zlib=/usr/local/zlib --with-md5-passwords --with-ssl-dir=/usr/local/
make
make install
注:prefix指定安装路径/usr/local;sysconfdir指定配置文件路径;with-zlib指定新版本zlib路径;with-pam指定启用pam支持;with-ssl-dir指定openssl路径

■问题1
checking OpenSSL header version... 100020df (OpenSSL 1.0.2m  2 Nov 2017)
checking OpenSSL library version... configure: error: OpenSSL >= 1.0.1 required (have "10000003 (OpenSSL 1.0.0-fips 29 Mar 2010)")
找openssl的lib没有找到合适的版本,在INSTALL文档提及:--with-ssl-dir=DIR allows you to specify where your Libre/OpenSSL libraries are installed
目前有两套openssl的lib库如下,所以需要用with-ssl-dir指定要使用的openssl库位置
[root@sxty-jkdb-184 lib64]# ll /usr/lib64/libssl.so*
lrwxrwxrwx 1 root root     15 Mar 10  2016 /usr/lib64/libssl.so -> libssl.so.1.0.0
lrwxrwxrwx 1 root root     15 Jan 24 11:37 /usr/lib64/libssl.so.10 -> libssl.so.1.0.0
-rwxr-xr-x 1 root root 375352 Oct 12  2012 /usr/lib64/libssl.so.1.0.0
[root@sxty-jkdb-184 lib64]# ll /usr/local/lib64/libssl.so*
lrwxrwxrwx 1 root root     15 Jan 23 23:25 /usr/local/lib64/libssl.so -> libssl.so.1.0.0
-r-xr-xr-x 1 root root 512648 Jan 23 23:25 /usr/local/lib64/libssl.so.1.0.0
如果指定了位置仍然报错,是因已有版本的openssl在默认库目录,则需要强行卸载低版本的openssl库【反正可以随时安装恢复旧版本openssl到默认目录】:
rpm -e openssl --allmatches --nodeps
但是此时依赖openssl的应用如yum等会找不到相应的运行库libssl和libcrypto,需要手动连接刚刚新编译的运行库到系统默认库目录:
rm /usr/lib64/libssl.so
rm /usr/lib64/libcrypto.so
ln -s /usr/local/lib64/libssl.so /usr/lib64/libssl.so.10
ln -s /usr/local/lib64/libssl.so /usr/lib64/libssl.so
ln -s /usr/local/lib64/libcrypto.so /usr/lib64/libcrypto.so.10
ln -s /usr/local/lib64/libcrypto.so /usr/lib64/libcrypto.so
此时继续configure就可以了。
如再次有新错误:
checking OpenSSL header version... not found
configure: error: OpenSSL version header not found.
但提示有openssl-devel包,怀疑此包有问题,卸载新装:
rpm -e openssl-devel --allmatches --nodeps
yum install openssl-devel
这会新装其他openssl相关的包,需要强制卸载掉无用的包,否则会影响configure,如下:
rpm -e openssl098e --allmatches --nodeps
rpm -e krb5-pkinit-openssl --allmatches --nodeps
往下就可以了。

■问题2
如果提示没有pam头文件:PAM headers not found,则需安装PAM开发包:yum install pam-devel

■配置sshd系统服务
mv /etc/init.d/sshd /etc/init.d/sshd.old
cp contrib/redhat/sshd.init /etc/init.d/sshd
mv /usr/sbin/sshd /usr/sbin/sshd.old
ln -s /usr/local/sbin/sshd /usr/sbin/sshd
【此处不用 chkconfig --add sshd】

■修改PAM配置
备份原pam配置:
cp /etc/pam.d/sshd /etc/pam.d/sshd.old
从源码编译目录拷贝新的pam配置到系统目录:
cp contrib/sshd.pam.generic /etc/pam.d/sshd
注意,这里新的pam配置文件的lib路径都有前缀“/lib/security/”,需要修改为正确的路径,否则会在/var/log/secure里面看到无法找到lib的报错,导致pam无法生效!将路径前缀“/lib/security/”删掉即可。

■修改sshd配置【make install时自动生成新sshd配置文件】
参考原sshd配置/etc/ssh.old/sshd_config,修改新sshd配置/etc/ssh/sshd_config。
ssh端口号是否是22
#Port 22
是否允许root远程登陆
#PermitRootLogin prohibit-password
PermitRootLogin yes
sshd默认没打开PAM支持
UsePAM yes

■重新启动sshd服务
service sshd restart
可能会有如下版本匹配的提示,但尚未发现具体影响:
OpenSSL version mismatch. Built against 10000003, you have 100020df

■确认升级后的版本
telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6

■验证可以远程ssh登陆以后,可以关闭telnet服务
service xinetd stop

■■其他可能的问题
■升级完成后ssh登录正常,sftp不能通过4A正常登录
处理方法:
将/etc/ssh/sshd_config文件中的
# override default of no subsystems
Subsystem       sftp    /usr/local/openssh/libexec/sftp-server
修改为:
# override default of no subsystems
Subsystem      sftp    internal-sftp
#Subsystem       sftp    /usr/local/openssh/libexec/sftp-server
后重启ssh后,绕行堡垒机登录正常;

■通过堡垒机登录设备失败,提示“不能切换至"XXXXXXXXXXXXX"指定目录”
处理方法:
修改/etc/ssh/sshd_config文件,添加
KexAlgorithms +diffie-hellman-group1-sha1
重启sshd服务后,通过堡垒机登录sftp正常。

■升级完成后部分客户端无法ssh、sftp登录
需要修改客户端用户的home目录下~/.ssh/known_hosts文件,删除已有的server端对应的密钥信息,再重新连接即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注