install another opensshd on linux7

2020年10月22日 808点热度 0人点赞 0条评论

注1:本文已在如下版本测试通过 RedHat/CentOS 7.1/7.6
注2:本文采用新安装方式,保留已有版本,好处是不影响旧版本

■■■■■■■■■■■■■■■■■■■■■ 目录
■■配置telnet服务、gcc编译器
■■安装新版本zlib
■■安装新版本openssl
■■安装新版本openssh
■■配置新的sshd系统服务
■■可能遇见的问题处理---openssl
■■可能遇见的问题处理---openssh
■■其他问题1 sftp不能通过4A正常登录
■■其他问题2 通过堡垒机登录设备失败
■■其他问题3 部分客户端无法ssh、sftp登录
■■■■■■■■■■■■■■■■■■■■■ 目录

■■配置telnet服务、gcc编译器
目的:确保不会因为升级ssh失误导致无法远程登陆主机
■确认telnet服务是否已经安装
yum info telnet*
■如果没有安装telnet-server
yum install telnet-server
■linux7
安装了telnet-server后,可直接启动telnet-server,不必配置xinetd
systemctl start telnet.socket
systemctl enable telnet.socket
■添加aqgk用户
useradd aqgk
passwd passwd

■此时测试能否远程telnet登陆服务器,确认telnet服务生效后,就可以进行下一步

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

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

■■安装新版本openssl
www.openssl.org
下载最新版本的源码【版本1.1.1h】
■配置编译openssl到/usr/local目录
tar xvfz openssl-1.1.1h.tar.gz
cd openssl-1.1.1h
./config --prefix=/usr/local --openssldir=/usr/local/openssl --shared zlib
make clean #这一步有时很关键,尤其在排错时
make
此时可能报错无法找到zlib.h,需要安装zlib-devel包:yum install zlib-devel
下面test这一步是进行 SSL 加密协议的完整测试,如出现错误需找出原因,否则可能导致SSH不能用
make test
此时报错:Can't locate Test/Harness.pm in @INC
需要安装perl的如下模块:
yum install perl-Test-Harness
重新make clean && make
再次make test报错:
Parse errors: No plan found in TAP output
需按照openssl说明文件 INSTALL, NOTES.UNIX, NOTES.PERL,应该通过 CPAN 工具安装 Perl 模块“Text::Template”,如下操作:
yum install perl-CPAN
perl -MCPAN -e shell
在 cpan[1]> 命令行提示符后面输入命令 install Text::Template
遇到询问时一律按字母键 y 表示同意
安装完成后,键入 exit 退出 cpan 命令行
重新make clean && make
再次make test成功
make install
■确认openssl版本
/usr/local/bin/openssl version -a
此时一般会报错如下:
/usr/local/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
/usr/local/bin/openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
这是由于新建的openssl运行库文件libssl和libcrypto位于/usr/local/lib64而不是系统的默认路径/usr/lib64
因此需要新建软连接到系统默认目录:
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
或者配置LD_LIBRARY_PATH环境变量【不建议使用,使用限制条件太多】

■再次执行
/usr/local/bin/openssl version -a
OpenSSL 1.1.1e 17 Mar 2020
■此时系统原有的openssl并不受影响
/usr/bin/openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013

■■安装新版本openssh
官网下载最新版本源码
【版本8.2p1,8.4p1】
www.openssh.com
■配置、编译、安装
tar xvfz openssh-8.4p1.tar.gz
cd openssh-8.4p1
./configure --prefix=/usr/local --sysconfdir=/etc/ssh2 --with-pam --with-zlib=/usr/local/zlib --with-md5-passwords --with-ssl-dir=/usr/local/openssl
此时一般提示找不到pam文件头,安装pam-devel包即可:yum install pam-devel
make
make install
注:prefix指定安装路径/usr/local;sysconfdir指定配置文件路径;with-zlib指定新版本zlib路径;with-pam指定启用pam支持;with-ssl-dir指定openssl路径

■■配置新的sshd系统服务
cat >> /usr/lib/systemd/system/sshd-keygen2.service << EOF
[Unit]
Description=OpenSSH Server Key Generation 2
ConditionPathExists=|!/etc/ssh2/ssh_host_rsa_key
ConditionPathExists=|!/etc/ssh2/ssh_host_ecdsa_key
ConditionPathExists=|!/etc/ssh2/ssh_host_ed25519_key
ConditionPathExists=|!/etc/ssh2/ssh_host_dsa_key
PartOf=sshd2.service sshd2.socket

[Service]
ExecStart=/usr/local/bin/ssh-keygen
Type=oneshot
RemainAfterExit=yes
EOF


cat >> /usr/lib/systemd/system/sshd2.service << EOF
[Unit]
Description=OpenSSH server daemon 2
After=network.target sshd-keygen2.service
Wants=sshd-keygen2.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/local/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF


cat >> /usr/lib/systemd/system/sshd2.socket << EOF
[Unit]
Description=OpenSSH Server Socket 2
Conflicts=sshd2.service

[Socket]
ListenStream=12581
Accept=yes

[Install]
WantedBy=sockets.target
EOF

将3个服务配置文件属性改为644
chmod 644 /usr/lib/systemd/system/sshd2
chmod 644 /usr/lib/systemd/system/sshd
2.service

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

■修改sshd配置【make install时自动生成新sshd配置文件】
参考原sshd配置/etc/ssh/sshd_config,修改新sshd配置
如下命令行操作,修改默认端口号,打开PAM支持:
sed -i "s/#Port 22/Port 12581/g" /etc/ssh2/sshd_config
sed -i "s/#UsePAM no/UsePAM yes/g" /etc/ssh2/sshd_config

■启动sshd服务
systemctl start sshd2
systemctl enable sshd2

■确认升级后的版本
telnet localhost 12581

■验证可以远程ssh登陆以后,可以关闭telnet服务
systemctl stop telnet.socket
systemctl disable telnet.socket
如果不能远程登录,一般是因为防火墙和SELINUX设置问题,可以关闭防火墙和关闭SELINUX:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
永久关闭selinux,修改/etc/selinux/config 文件:
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

■ssh客户端程序更新【可选】
[root@localhost ~]# mv /usr/bin/ssh /usr/bin/ssh.old
[root@localhost ~]# ln -s /usr/local/bin/ssh /usr/bin/ssh

■关闭原有sshd服务
systemctl stop sshd
systemctl disable sshd

■■可能遇见的问题处理---openssl

■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-devel

■■可能遇见的问题处理---openssh

■configure提示没有pam头文件:
PAM headers not found
则需安装PAM开发包:yum install pam-devel

■configure提示openssl版本问题
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)")
可见--with-ssl-dir=/usr/local/openssl指定以后找到了新版本的openssl,但是没有找到新版本的openssl库文件,根据【openssl安装到最后的提示信息】,修改环境变量LD_LIBRARY_PATH,重新configure即可!
export LD_LIBRARY_PATH=/usr/local/lib64

■如果不指定openssl库文件,启动服务时可能会报错:
[root@localhost openssh-7.6p1]# service sshd restart
Stopping sshd:[ OK ]
Starting sshd:/usr/sbin/sshd: symbol lookup error: /usr/sbin/sshd: undefined symbol: EVP_aes_128_ctr
[FAILED]
指定LD_LIBRARY_PATH,手动执行/usr/sbin/sshd可以:
[root@localhost sbin]# export LD_LIBRARY_PATH=/usr/local/lib64
[root@localhost sbin]# /usr/sbin/sshd
在此处,需修改服务sshd配置,在/etc/init.d/sshd行首增加如下变量设定:
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
即可正常启动sshd服务

■其他问题参考

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库如下:
[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
所以需要用with-ssl-dir指定要使用的openssl库位置。
如果指定了位置仍然报错,是因已有版本的openssl在默认库目录,则需要强行卸载低版本的openssl库:
rpm -e openssl --allmatches --nodeps
但是此时依赖openssl的应用如yum等会找不到相应的运行库libssl和libcrypto,需要手动连接刚刚新编译的运行库到系统默认库目录:
【rm -f /usr/lib64/libssl.so】 改为以回退-> mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
【rm -f /usr/lib64/libcrypto.so】 改为以回退-> mv /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.old
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
往下就可以了。

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

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

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

liking

这个人很懒,什么都没留下

文章评论