Linux安装升级OpenSSH服务
1、安装 OpenSSH 说明1.1 安装环境1.2 安装准备 2、安装 OpenSSL 服务2.1 安装相关说明2.2 安装前准备工作2.3 解压安装openssl2.4 安装成功后配置 3、安装 OpenSSH 服务3.1 安装前准备工作3.2 解压安装openssh3.2 安装成功后配置 4、验证 OpenSSH 服务4.1 验证服务是否升级成功4.2 编写服务升级脚本 5、异常处理5.1 处理openssh的ssl版本与openssl版本不一致问题5.2 处理openssl安装版本与Library版本不一致的问题5.3 处理openssh升级后无法登录的问题5.4 升级 openssl 后导致 yum 命令无法正常使用
1、安装 OpenSSH 说明
1.1 安装环境
虚拟机环境
虚拟机环境 | OpenSSH版本 | OpenSSL版本 | |
---|---|---|---|
升级前 | linux CentOS | OpenSSH_7.4p1 | OpenSSL 1.0.2k |
升级方案一 | linux CentOS | OpenSSH_9.3p1 | OpenSSL 1.0.2k |
升级方案二 | linux CentOS | OpenSSH_9.5p1 | OpenSSL 1.1.1k/w |
下载地址
openssl:https://openssl-library.org/source/old/1.1.1/openssh:https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/注意事项
升级前务必保证虚拟机已经打快照或备份。注意:升级过程全程不要关闭xshell窗口!!!关闭后将无法ssh登录。注意:提前将openssh和openssl安装包上传到虚拟机!!!卸载ssh后将无法上传。注意:升级openssh后检查服务器ulimit值!!!此次升级以“升级方案二”为准,进行 OpenSSH 和 OpenSSL 服务的安装升级1.2 安装准备
查看当前openssh版本,并上传 openssh-9.5p1.tar.gz
至 /opt/openssh
目录
$ ssh -V# 查看Openssh版本OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
为方便统一管理建议安装包统一上传至如下目录:
(1)openssh 服务:/opt/openssh
(2)openssl 服务:/opt/openssl
查看是否关闭selinux
$ getenforce # 查看状态Disabled$ setenforce 0 # 临时关闭
查看相关依赖包是否安装
$ rpm -qa | egrep "gcc|make|perl|zlib|zlib-devel|pam|pam-devel|openssl| "
注意:安装包有差异问题不大, 只要所需的安装包存在即可, 即使未安装在后续安装openssh时, 也会提示!
2、安装 OpenSSL 服务
2.1 安装相关说明
安装 OpenSSH 服务需要升级 OpenSSL 服务,否则安装过程会报错,报错信息如下:
...checking for OpenSSL_version... nochecking for OpenSSL_version_num... nochecking OpenSSL library version... configure: error: OpenSSL >= 1.1.1 required (have "100020bf (OpenSSL 1.0.2k-fips 26 Jan 2017)")
注意:openssh 服务安装需要基于 openssl 服务才能安装,上述报错是由于 openssl 服务版本过低导致无法安装 openssh 服务,安装 openssh9.5p 版本会出现 openssl 版本过低提示,openssh9.3p 版本不会出现该情况!
2.2 安装前准备工作
上传 openssl-1.1.1w.tar.gz
安装包至 /opt/openssl
目录下
$ mkdir -p /opt/openssl$ ll -h /opt/openssl-rw-r--r-- 1 root root 9.5M 12月 13 20:42 openssl-1.1.1w.tar.gz
备份原有的 ssl 服务相关目录
$ whereis opensslopenssl: /usr/bin/openssl /usr/lib64/openssl /usr/include/openssl /usr/share/man/man1/openssl.1ssl.gz# 备份/usr/bin/openssl目录$ mv /usr/bin/openssl /usr/bin/openssl.bak# 备份/usr/lib64/openssl目录$ mv /usr/lib64/openssl /usr/lib64/openssl.bak# 备份/usr/include/openssl目录$ mv /usr/include/openssl /usr/include/openssl.bak
安装所需依赖,查看卸载原有的 openssl 服务 (如非必要,不建议卸载依赖包)
$ yum -y install gcc make perl zlib zlib-devel pam pam-devel$ rpm -qa | grep openssl# 查看系统原有openssh包openssl-devel-1.0.2k-26.el7_9.x86_64openssl-1.0.2k-19.el7.x86_64xmlsec1-openssl-1.2.20-7.el7_4.x86_64openssl-libs-1.0.2k-19.el7.x86_64$ rpm -e --nodeps <依赖包># 卸载查询到的相关依赖包$ rpm -qa | grep openssl | xargs rpm -e --nodeps
2.3 解压安装openssl
解压openssl-1.1.1w.tar.gz
安装包
$ cd /opt/openssl$ tar -zxf openssl-1.1.1w.tar.gz# 解压安装包$ cd openssl-1.1.1w/$ mkdir -p /usr/local/openssl# 创建安装目录
初始化,编译安装 openssl-1.1.1w
服务
$ ./config --prefix=/usr/local/openssl --shared$ make && make install
2.4 安装成功后配置
进行相关使用配置
# 建立软连接, 替换原有的openssl$ ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl$ ln -s /usr/local/openssl/include/openssl /usr/include/openssl # 检查软连接建立情况$ ls -al /usr/bin/openssllrwxrwxrwx 1 root root 30 12月 23 23:01 /usr/bin/openssl -> /usr/local/openssl/bin/openssl$ ls -al /usr/include/openssllrwxrwxrwx 1 root root 34 12月 23 23:01 /usr/include/openssl -> /usr/local/openssl/include/openssl$ ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1$ ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1# 添加动态链接库$ echo "/usr/local/openssl/lib" >> /etc/ld.so.conf$ ldconfig# 刷新库
(1)ldconfig是一个动态链接库管理命令。
(2)主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如前介绍: lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
(3)缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表。
(4)ldconfig通常在系统启动时运行, 当用户安装了新的动态链接库时,就需要手动运行这个命令。
查看 openssl 版本,看是否安装成功
$ openssl versionOpenSSL 1.1.1w 11 Sep 2023$ openssl version -aOpenSSL 1.1.1w 11 Sep 2023built on: Thu Dec 14 06:43:25 2023 UTCplatform: linux-x86_64options: bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr) compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUGOPENSSLDIR: "/usr/local/openssl/ssl"ENGINESDIR: "/usr/local/openssl/lib/engines-1.1"Seeding source: os-specific
3、安装 OpenSSH 服务
3.1 安装前准备工作
上传 openssh-9.5p1.tar.gz
安装包至 /opt/openssh
目录下
$ mkdir -p /opt/openssh$ ll -h /opt/openssh-rw-r--r-- 1 root root 1.8M 4月 1 15:10 openssh-9.5p1.tar.gz
备份原有的 ssh 服务相关目录
# 查看ssh服务所在的目录$ whereis sshssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1# 备份/etc/ssh/目录$ mv /etc/ssh/ /etc/ssh.bak# 备份/usr/bin/ssh目录$ mv /usr/bin/ssh /usr/bin/ssh.bak# 备份/usr/sbin/shhd文件$ mv /usr/sbin/sshd /usr/sbin/sshd.bak# 备份/etc/init.d/shhd文件$ mv /etc/init.d/sshd /etc/init.d/sshd.bak# 注意/etc/init.d/sshd不存在,则无需备份# /etc/pam.d/sshd.pam文件$ mv /etc/pam.d/sshd.pam /etc/pam.d/sshd.pam.bak# 注意sshd.pam不存在,则无需备份,openssh9.0之前的版本可能有该文件
卸载原有的 openssh 服务
$ rpm -qa | grep openssh# 查看系统原有openssh包openssh-server-7.4p1-21.el7.x86_64openssh-clients-7.4p1-21.el7.x86_64openssh-7.4p1-21.el7.x86_64$ rpm -e --nodeps <依赖包># 卸载查询到的相关依赖包$ rpm -qa | grep openssh | xargs rpm -e --nodeps # 重新查看是否卸载完全
注意:若原 openssh 服务是基于源码安装的,则无需卸载;若基于 rpm 包安装,则可以执行卸载命令。
在 /etc/pam.d 目录下新建 sshd 文件
# 注意: 如果文件已存在则无需修改$ vim /etc/pam.d/sshd#%PAM-1.0auth required pam_sepermit.soauth substack password-authauth include postlogin# Used with polkit to reauthorize users in remote sessions-auth optional pam_reauthorize.so prepareaccount required pam_nologin.soaccount include password-authpassword include password-auth# pam_selinux.so close should be the first session rulesession required pam_selinux.so closesession required pam_loginuid.so# pam_selinux.so open should only be followed by sessions to be executed in the user contextsession required pam_selinux.so open env_paramssession required pam_namespace.sosession optional pam_keyinit.so force revokesession include password-authsession include postlogin# Used with polkit to reauthorize users in remote sessions-session optional pam_reauthorize.so prepare
注意:请确认该文件是否成功创建并有内容且未出错,否则可能导致后续无法通过 ssh 远程登录
3.2 解压安装openssh
解压openssh-9.5p1.tar.gz
$ cd /opt/openssh$ tar -zxf openssh-9.5p1.tar.gz$ cd openssh-9.5p1/
初始化,编译安装 openssh-9.5p1
服务
# 使用默认安装目录的openssl$ ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-privsep-path=/var/lib/sshd --without-hardening# 使用指定安装目录的openssl$ ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/openssl --with-privsep-path=/var/lib/sshd --without-hardening# 使用指定安装目录的openssl和zlib$ ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/openssl --with-zlib=/usr/local/zlib --with-privsep-path=/var/lib/sshd --without-hardening# 编译安装$ make && make install
初始化成功的信息如下:
安装成功的信息如下:
3.2 安装成功后配置
修改文件权限为600,否则会报权限错误
# 修改ssh的相关秘钥文件的权限$ chmod 600 /etc/ssh/ssh_host_rsa_key$ chmod 600 /etc/ssh/ssh_host_ecdsa_key$ chmod 600 /etc/ssh/ssh_host_ed25519_key# 二选一执行即可$ chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key
修改允许远程登录
# 修改配置文件,允许root直接登录$ echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config$ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config$ echo "UsePAM yes" >> /etc/ssh/sshd_config
设置sshd开机自启
# ssh服务必须开机自启动,因此要进行一些设置$ cp -p /opt/openssh/openssh-9.5p1/contrib/redhat/sshd.init /etc/init.d/sshd$ chmod +x /etc/init.d/sshd$ chkconfig --add sshd$ chkconfig sshd on$ systemctl restart sshd$ systemctl status sshd
验证查看当前的 openssh 版本
$ ssh -VOpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023
4、验证 OpenSSH 服务
4.1 验证服务是否升级成功
关机,重新启动虚拟机
通过 SSH 远程连接虚拟机/服务器
验证查看当前的 openssh 版本
$ ssh -VOpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023
查看sshd状态,sshd正常启动后可以重新打开一个窗口登录验证
$ systemctl status sshd
4.2 编写服务升级脚本
升级 OpenSSL 服务脚本
#!/bin/bash# 备份原有的openssl文件echo -e "\n \033[33m 开始备份OpenSSL服务文件... \033[0m \n"mv /usr/bin/openssl /usr/bin/openssl.bakmv /usr/lib64/openssl /usr/lib64/openssl.bakmv /usr/include/openssl /usr/include/openssl.bak# 解压OpenSSL安装包echo -e "\n \033[33m 开始解压OpenSSL安装包... \033[0m \n"cd /opt/openssltar -zxvf openssl-1.1.1w.tar.gzcd openssl-1.1.1w/mkdir -p /usr/local/openssl# 编译安装OpenSSLecho -e "\n \033[33m 开始初始化、编译、安装OpenSSL服务... \033[0m \n"./config --prefix=/usr/local/openssl --sharedmake && make install if [ $? -ne 0 ]; then echo -e "\n \033[30m OpenSSL服务安装失败!!! \033[0m \n" exit 1else echo -e "\n \033[33m OpenSSL服务安装成功... \033[0m \n"fi# 进行相关使用配置echo -e "\n \033[33m 开始为OpenSSL服务进行相关配置... \033[0m \n"ln -s /usr/local/openssl/bin/openssl /usr/bin/opensslln -s /usr/local/openssl/include/openssl /usr/include/openssl ls -al /usr/bin/opensslls -al /usr/include/opensslecho "/usr/local/openssl/lib" >> /etc/ld.so.confldconfig# 查看服务是否安装成功echo -e "\n \033[33m 开始检测OpenSSL服务是否安装成功... \033[0m \n"openssl versionopenssl version -a
升级 OpenSSH 服务脚本
#!/bin/bash# 备份原有的openssl文件echo -e "\n \033[33m 开始备份OpenSSH服务文件... \033[0m \n"mv /etc/ssh/ /etc/ssh.bakmv /usr/bin/ssh /usr/bin/ssh.bakmv /usr/sbin/sshd /usr/sbin/sshd.bakmv /etc/init.d/sshd /etc/init.d/sshd.bakls -h /etc/pam.d/sshd.pam# 解压OpenSSH安装包echo -e "\n \033[33m 开始解压OpenSSH安装包... \033[0m \n"cd /opt/opensshtar -zxf openssh-9.5p1.tar.gzcd openssh-9.5p1/# 编译安装OpenSSHecho -e "\n \033[33m 开始初始化、编译、安装OpenSSH服务... \033[0m \n"./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/openssl --with-privsep-path=/var/lib/sshd --without-hardeningmake && make install if [ $? -ne 0 ]; then echo -e "\n \033[30m OpenSSH服务安装失败!!! \033[0m \n" exit 1else echo -e "\n \033[33m OpenSSH服务安装成功... \033[0m \n"fi# 进行相关使用配置echo -e "\n \033[33m 开始为OpenSSH服务进行相关配置... \033[0m \n"ls -h /etc/pam.d/sshdif [ $? -ne 0 ]; then echo -e "\n \033[30m SSH的身份验证等相关的配置文件不存在 \033[0m \n" exit 1else echo -e "\n \033[33m SSH的身份验证等相关的配置文件存在 \033[0m \n"fichmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_keyecho "PasswordAuthentication yes" >> /etc/ssh/sshd_configecho "PermitRootLogin yes" >> /etc/ssh/sshd_configecho "UsePAM yes" >> /etc/ssh/sshd_configcp -pf /opt/openssh/openssh-9.5p1/contrib/redhat/sshd.init /etc/init.d/sshdchmod +x /etc/init.d/sshdchkconfig --add sshdchkconfig sshd onsystemctl restart sshd# 查看服务是否安装成功echo -e "\n \033[33m 开始检测OpenSSH服务是否安装成功... \033[0m \n"ssh -Vsystemctl status sshd
注意:升级前请将服务的安装包上传到指定命令目录下,先升级 OpenSSL 服务再升级 OpenSSH 服务。
5、异常处理
5.1 处理openssh的ssl版本与openssl版本不一致问题
解决办法:
方案一: 重新源码安装 openssh 并指定 openssl 的安装为重新安装的位置方案二: 重新编译生成rpm,安装openssl下编译的openssh rpm包环境说明:
OpenSSH版本 | OpenSSL版本 | |
---|---|---|
升级前 | OpenSSH_7.4p1 | OpenSSL 1.0.2k |
升级后 | OpenSSH_9.5p1 | OpenSSL 1.1.1k |
$ openssl versionOpenSSL 1.1.1k 25 Mar 2021$ ssh -VOpenSSH_9.5p1, OpenSSL 1.0.2k-fips 26 Jan 2017
具体说明:
(1)源码安装 openssl 1.1.1k,安装成功后查看 openssl 版本
(2)查看 openssh 的 ssl 版本与 openssl 版本显示不一致
重新安装 openssh 服务
# 备份原有的openssl文件$ mv /etc/ssh/ /etc/ssh.bak$ cp -r /usr/bin /usr/bin.bak$ mv /usr/sbin/sshd /usr/sbin/sshd.bak$ mv /etc/init.d/sshd /etc/init.d/sshd.bak# 解压OpenSSH安装包$ cd /opt/openssh$ tar -zxvf openssh-9.5p1.tar.gz$ cd openssh-9.5p1/# 编译安装OpenSSH$ ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/openssl --with-privsep-path=/var/lib/sshd --without-hardening$ make && make install # 进行相关使用配置$ chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key$ echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config$ echo "PermitRootLogin yes" >> /etc/ssh/sshd_config$ echo "UsePAM yes" >> /etc/ssh/sshd_config$ cp -pf /opt/openssh/openssh-9.5p1/contrib/redhat/sshd.init /etc/init.d/sshd$ chmod +x /etc/init.d/sshd$ chkconfig --add sshd$ chkconfig sshd on$ systemctl restart sshd$ systemctl status sshd
查看是否安装成功
# 查看服务是否安装成功$ openssl versionOpenSSL 1.1.1k 25 Mar 2021$ ssh -VOpenSSH_9.5p1, OpenSSL 1.1.1k 25 Mar 2021
5.2 处理openssl安装版本与Library版本不一致的问题
解决办法:
检查软连接建立情况,修改 openssl 的 lib 库的链接提升 lib 库在动态链接库 /etc/ld.so.conf 中的位置方案一:
# 查看ssl版本和链接的ssl库$ openssl versionOpenSSL 1.1.1k 25 Mar 2021 (Library: OpenSSL 1.1.1w 11 Sep 2023) # 查看openssl调用的lib库情况$ ldd /usr/local/openssl/bin/openssllinux-vdso.so.1 => (0x00007ffd013ca000)libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007f4b62a90000)libcrypto.so.1.1 => /usr/local/openssl/lib/libssl.so.1.1 (0x00007f4b625a8000)# 问题发现libdl.so.2 => /lib64/libdl.so.2 (0x00007f4b623a3000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4b62187000)libc.so.6 => /lib64/libc.so.6 (0x00007f4b61dc4000)libz.so.1 => /lib64/libz.so.1 (0x00007f4b61bad000)/lib64/ld-linux-x86-64.so.2 (0x00007f4b62d38000)# 查看软链接情况$ ls -l /usr/local/openssl/lib/libssl.so.1.1-rwxr-xr-x 1 root root 690110 Dec 22 20:05 /usr/local/openssl/lib/libssl.so.1.1# 重新建立软链接 (也有可能是/usr/local/openssl/lib64)$ ln -sf /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1$ ln -sf /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1# 查看ssl版本和链接的ssl库$ openssl versionOpenSSL 1.1.1w 11 Sep 2023
方案二:
# 查看ssl版本和链接的ssl库$ openssl versionOpenSSL 1.1.1k 25 Mar 2021 (Library: OpenSSL 1.1.1w 11 Sep 2023) # 将安装目录的lib库提高位置$ vim /etc/ld.so.confld.so.conf.d/*.conf/opt/openssl/openssl/lib/usr/local/lib64# 查看ssl版本和链接的ssl库$ openssl versionOpenSSL 1.1.1w 11 Sep 2023
5.3 处理openssh升级后无法登录的问题
环境说明:
OpenSSH版本 | OpenSSL版本 | |
---|---|---|
升级前 | OpenSSH_7.4p1 | OpenSSL 1.0.2k |
升级后 | OpenSSH_9.5p1 | OpenSSL 1.1.1k |
原因分析: 从 openssh7.x 版本升级至 openssh9.x版本可能导致 /etc/pam.d/sshd
文件被覆盖或删除,升级完 openssh 服务后,记得查看该文件是否存在,否则会导致无法通过 ssh 进行远程登录,或者显示密码错误等问题。
解決办法: 重新创建 sshd 文件即可
$ vim /etc/pam.d/sshd#%PAM-1.0auth required pam_sepermit.soauth substack password-authauth include postlogin# Used with polkit to reauthorize users in remote sessions-auth optional pam_reauthorize.so prepareaccount required pam_nologin.soaccount include password-authpassword include password-auth# pam_selinux.so close should be the first session rulesession required pam_selinux.so closesession required pam_loginuid.so# pam_selinux.so open should only be followed by sessions to be executed in the user contextsession required pam_selinux.so open env_paramssession required pam_namespace.sosession optional pam_keyinit.so force revokesession include password-authsession include postlogin# Used with polkit to reauthorize users in remote sessions-session optional pam_reauthorize.so prepare$ systemctcl restart sshd
5.4 升级 openssl 后导致 yum 命令无法正常使用
升级 openssl 至 1.1.1w 版本后使用 yum 命令出现如下情况:
这是因为 yum 使用的是旧版本的 OpenSSL 库,而新版本的 OpenSSL 已经安装。
解决办法1: 可能是由于删除了 openssl-libs 包导致的,重新安装 openssl-libs 包
$ rpm -qa | grep openssl# 查看系统原有openssh包openssl-devel-1.0.2k-26.el7_9.x86_64openssl-1.0.2k-19.el7.x86_64xmlsec1-openssl-1.2.20-7.el7_4.x86_64openssl-libs-1.0.2k-19.el7.x86_64$ rpm -e --nodeps <依赖包># 卸载查询到的相关依赖包
卸载相关依赖包时,不要卸载openssl-libs-1.0.2k-19.el7.x86_64
,卸载该依赖包会导致/usr/lib64/libssl.so.10
被删除,从而导致 yum 命令无法使用。