在日常运维中,因为安全需要,经常遇到sshd升级的需求,但是由于sshd升级的复杂度,可能会导致升级失败的风险。
本文详细描述了在不影响已有sshd的情况下,如何安装第二个sshd服务器。安装了新的sshd以后,可以关闭或卸载已有的sshd服务。
安装sshd服务一般采用源码编译安装的方式,因此需要gcc编译器,且由于期间需要很多依赖包,因此需要配置yum源以备不时之需。具体的yum源配置以及依赖包的安装方法,不是本文的重点,在此略过。
【第一步】安装新版本zlib
■官网下载最新的源码【版本1.2.11】
www.zlib.net
■解压缩、配置、编译、安装到/usr/local/zlib
tar xvfz zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make
make install
【第二步】安装新版本openssl
■官网下载最新版本的源码【版本1.1.1e】
www.openssl.org
■解压缩、配置、编译、安装到目录/usr/local
tar xvfz openssl-1.1.1e.tar.gz
cd openssl-1.1.1e
./config --prefix=/usr/local --openssldir=/usr/local/openssl --shared zlib
下面这一步有时很关键,尤其在排错时
make clean
make
下面test这一步是进行 SSL 加密协议的完整测试,如出现错误需找出原因,否则可能导致SSH不能用
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】
www.openssh.com
■配置、编译、安装到指定的目录
tar xvfz openssh-8.2p1.tar.gz
cd openssh-8.2p1
./configure --prefix=/usr/local --sysconfdir=/etc/ssh8.2 --with-pam --with-zlib=/usr/local/zlib --with-md5-passwords --with-ssl-dir=/usr/local/openssl
make
make install
注:prefix指定安装路径/usr/local;sysconfdir指定配置文件路径;with-zlib指定新版本zlib路径;with-pam指定启用pam支持;with-ssl-dir指定openssl路径
【第四步】配置新的sshd系统服务
这一步涉及的知识点比较多,大意是手动配置几个全新的系统服务,指定了全新的服务名字、端口号、安全key位置、服务依赖关系配置、组织方式等,本文不详述,但给出详细的源码,供参考。
■配置sshd-keygen8.service
cat >> /usr/lib/systemd/system/sshd-keygen8.service << EOF [Unit] Description=OpenSSH Server Key Generation 8.2 ConditionPathExists=|!/etc/ssh8.2/ssh_host_rsa_key ConditionPathExists=|!/etc/ssh8.2/ssh_host_ecdsa_key ConditionPathExists=|!/etc/ssh8.2/ssh_host_ed25519_key ConditionPathExists=|!/etc/ssh8.2/ssh_host_dsa_key PartOf=sshd8.service sshd8.socket [Service] ExecStart=/usr/local/bin/ssh-keygen Type=oneshot RemainAfterExit=yes EOF
■配置sshd8.service
cat >> /usr/lib/systemd/system/sshd8.service << EOF [Unit] Description=OpenSSH server daemon 8.2 After=network.target sshd-keygen8.service Wants=sshd-keygen8.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
■配置sshd8.socket
cat >> /usr/lib/systemd/system/sshd8.socket << EOF [Unit] Description=OpenSSH Server Socket 8.2 Conflicts=sshd8.service [Socket] ListenStream=12581 Accept=yes [Install] WantedBy=sockets.target EOF
■将3个服务配置文件属性改为644
chmod 644 /usr/lib/systemd/system/sshd8
chmod 644 /usr/lib/systemd/system/sshd8.service
■添加PAM配置
从源码编译目录拷贝新的pam配置到系统目录:
cp contrib/sshd.pam.generic /etc/pam.d/sshd8
注意,这里新的pam配置文件的lib路径都有前缀“/lib/security/”,需要修改为正确的路径,否则会在/var/log/secure里面看到无法找到lib的报错,导致pam无法生效!将路径前缀“/lib/security/”删掉即可。
■修改sshd配置【make install时自动生成新sshd配置文件】
参考原sshd配置/etc/ssh/sshd_config,修改新sshd配置,修改端口号,打开PAM支持
vim /etc/ssh8.2/sshd_config
Port 12581
UsePAM yes
■启动sshd服务
systemctl start sshd8
■确认sshd服务版本
新服务端口: telnet 127.0.0.1 12581 Trying 10.216.93.22... Connected to 10.216.93.22. Escape character is '^]'. SSH-2.0-OpenSSH_8.2 原服务端口: telnet 127.0.0.1 22 Trying 10.216.93.22... Connected to 10.216.93.22. Escape character is '^]'. SSH-2.0-OpenSSH_6.6.1
【备注】可能遇见的问题处理
■■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
文章评论