Linux安装升级OpenSSH服务
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 -
下载地址
-
注意事项
- 升级前务必保证虚拟机已经打快照或备份。
- 注意:升级过程全程不要关闭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... no checking for OpenSSL_version_num... no checking 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 openssl openssl: /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_64 openssl-1.0.2k-19.el7.x86_64 xmlsec1-openssl-1.2.20-7.el7_4.x86_64 openssl-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/openssl lrwxrwxrwx 1 root root 30 12月 23 23:01 /usr/bin/openssl -> /usr/local/openssl/bin/openssl $ ls -al /usr/include/openssl lrwxrwxrwx 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 version OpenSSL 1.1.1w 11 Sep 2023 $ openssl version -a OpenSSL 1.1.1w 11 Sep 2023 built on: Thu Dec 14 06:43:25 2023 UTC platform: linux-x86_64 options: 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 -DNDEBUG OPENSSLDIR: "/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 ssh ssh: /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_64 openssh-clients-7.4p1-21.el7.x86_64 openssh-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.0 auth required pam_sepermit.so auth substack password-auth auth include postlogin # Used with polkit to reauthorize users in remote sessions -auth optional pam_reauthorize.so prepare account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth session 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 -V OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023
4、验证 OpenSSH 服务
4.1 验证服务是否升级成功
-
关机,重新启动虚拟机
-
通过 SSH 远程连接虚拟机/服务器
-
验证查看当前的 openssh 版本
$ ssh -V OpenSSH_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.bak mv /usr/lib64/openssl /usr/lib64/openssl.bak mv /usr/include/openssl /usr/include/openssl.bak # 解压OpenSSL安装包 echo -e "\n \033[33m 开始解压OpenSSL安装包... \033[0m \n" cd /opt/openssl tar -zxvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w/ mkdir -p /usr/local/openssl # 编译安装OpenSSL echo -e "\n \033[33m 开始初始化、编译、安装OpenSSL服务... \033[0m \n" ./config --prefix=/usr/local/openssl --shared make && make install if [ $? -ne 0 ]; then echo -e "\n \033[30m OpenSSL服务安装失败!!! \033[0m \n" exit 1 else 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/openssl ln -s /usr/local/openssl/include/openssl /usr/include/openssl ls -al /usr/bin/openssl ls -al /usr/include/openssl echo "/usr/local/openssl/lib" >> /etc/ld.so.conf ldconfig # 查看服务是否安装成功 echo -e "\n \033[33m 开始检测OpenSSL服务是否安装成功... \033[0m \n" openssl version openssl version -a
-
升级 OpenSSH 服务脚本
#!/bin/bash # 备份原有的openssl文件 echo -e "\n \033[33m 开始备份OpenSSH服务文件... \033[0m \n" mv /etc/ssh/ /etc/ssh.bak mv /usr/bin/ssh /usr/bin/ssh.bak mv /usr/sbin/sshd /usr/sbin/sshd.bak mv /etc/init.d/sshd /etc/init.d/sshd.bak ls -h /etc/pam.d/sshd.pam # 解压OpenSSH安装包 echo -e "\n \033[33m 开始解压OpenSSH安装包... \033[0m \n" cd /opt/openssh tar -zxf openssh-9.5p1.tar.gz cd openssh-9.5p1/ # 编译安装OpenSSH echo -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-hardening make && make install if [ $? -ne 0 ]; then echo -e "\n \033[30m OpenSSH服务安装失败!!! \033[0m \n" exit 1 else echo -e "\n \033[33m OpenSSH服务安装成功... \033[0m \n" fi # 进行相关使用配置 echo -e "\n \033[33m 开始为OpenSSH服务进行相关配置... \033[0m \n" ls -h /etc/pam.d/sshd if [ $? -ne 0 ]; then echo -e "\n \033[30m SSH的身份验证等相关的配置文件不存在 \033[0m \n" exit 1 else echo -e "\n \033[33m SSH的身份验证等相关的配置文件存在 \033[0m \n" fi 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 # 查看服务是否安装成功 echo -e "\n \033[33m 开始检测OpenSSH服务是否安装成功... \033[0m \n" ssh -V systemctl 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 version OpenSSL 1.1.1k 25 Mar 2021 $ ssh -V OpenSSH_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 version OpenSSL 1.1.1k 25 Mar 2021 $ ssh -V OpenSSH_9.5p1, OpenSSL 1.1.1k 25 Mar 2021
5.2 处理openssl安装版本与Library版本不一致的问题
-
解决办法:
- 检查软连接建立情况,修改 openssl 的 lib 库的链接
- 提升 lib 库在动态链接库 /etc/ld.so.conf 中的位置
-
方案一:
# 查看ssl版本和链接的ssl库 $ openssl version OpenSSL 1.1.1k 25 Mar 2021 (Library: OpenSSL 1.1.1w 11 Sep 2023) # 查看openssl调用的lib库情况 $ ldd /usr/local/openssl/bin/openssl linux-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 version OpenSSL 1.1.1w 11 Sep 2023
-
方案二:
# 查看ssl版本和链接的ssl库 $ openssl version OpenSSL 1.1.1k 25 Mar 2021 (Library: OpenSSL 1.1.1w 11 Sep 2023) # 将安装目录的lib库提高位置 $ vim /etc/ld.so.conf ld.so.conf.d/*.conf /opt/openssl/openssl/lib /usr/local/lib64 # 查看ssl版本和链接的ssl库 $ openssl version OpenSSL 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.0 auth required pam_sepermit.so auth substack password-auth auth include postlogin # Used with polkit to reauthorize users in remote sessions -auth optional pam_reauthorize.so prepare account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth session 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_64 openssl-1.0.2k-19.el7.x86_64 xmlsec1-openssl-1.2.20-7.el7_4.x86_64 openssl-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 命令无法使用。