升级openssh到9.9全流程

升级openssh到9.9全流程

1. ✅麒麟v10 sp3系统升级openssh 9.9

# 下载源码包
wget  https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz

# 解压源码包
tar xf openssh-9.9p2.tar.gz

# 进入源码包目录
cd openssh-9.9p2/

# 初始化配置
./configure  --prefix=/app/tools/openssh-9.9p2/

# 编译
make -j `nproc`

# 安装
make install

# 创建软链接
ln -s /app/tools/openssh-9.9p2/ /app/tools/openssh

1.1. 💡启动测试

#安装并启动telnet
yum install -y telnet-server
systemctl enable telnet.socket --now

useradd zbl
echo 'zhubaolin@123' | passwd --stdin zbl
echo 'zbl ALL=(ALL)  NOPASSWD: ALL '  >>/etc/sudoers

#测试telnet 
这里会断开连接,这里使用telnet连接 使用普通用户,sudo su - 切换为root 
telnet 10.0.0.210
输入用户名
输入密码 

修改sshd配置文件 注意这里配置不在/etc/在/app/tools/openssh/etc下.

#修改新的opensssh配置文件 
cp /app/tools/openssh/etc/sshd_config{,.bak}
cat >>/app/tools/openssh/etc/sshd_config <<EOF
Port 22
PermitRootLogin yes
PasswordAuthentication yes
#GSSAPIAuthentication no 这个不用配置,默认就关闭了.
UseDNS no
EOF

#关闭sshd服务
pkill sshd

#使用新的openssh启动sshd服务.
启动服务测试
/app/tools/openssh/sbin/sshd

1.2. ☕️测试

1.3. ✂️清理(可选)

# 关闭并删除openssh 8.2版本的服务端
rpm -qa |grep openssh |xargs rpm -e --nodeps   

1.4. 🌞后续收尾-环境变量

#1. 配置PATH环境变量
echo 'export PATH=/app/tools/openssh/bin/:/app/tools/openssh/sbin/:$PATH' >>/etc/profile
source  /etc/profile

#2.检查命令位置
[root@ky201 ~]# which ssh ssh-keygen sshd
/app/tools/openssh/bin/ssh
/app/tools/openssh/bin/ssh-keygen
/app/tools/openssh/sbin/sshd
[root@ky201 ~]# 

1.5. 📁书写systemctl文件

cat>/usr/lib/systemd/system/sshd99.service<<'EOF'
[Unit]
Description=OpenSSH 9.9 server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target 

[Service]
Type=simple
ExecStart=/app/tools/openssh/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl disable --now sshd
systemctl enable  --now  sshd99

1.6. 📝修改配置文件为/etc/ssh

mkdir -p /backup/
mv  /etc/ssh  /backup/
ln -s  /app/tools/openssh/etc/  /etc/ssh
#后续修改/etc/ssh/sshd_config配置文件即可.

1.7. 🚀测试连接并关闭telnet服务

systemctl  disable --now  telnet.socket

1.8. 💾复制ssh-copy-id命令

cp ~/openssh-9.9p2/contrib/ssh-copy-id  /app/tools/openssh/bin/ 

升级Openssh后没有ssh-copy-id解决方案.

chmod +x  /app/tools/openssh/bin/ssh-copy-id

2. ✅ubt 22.04 lts编译安装openssh-9.9p2

2.1. 🚀升级前准备

# 安装
apt install -y openbsd-inetd telnetd

# 修改telnet配置文件
mkdir -p /etc/xinetd.d/
cat>/etc/xinetd.d/telnet<<'EOF'
service telnet  
{  
    disable         = no  
    flags           = REUSE  
    socket_type     = stream  
    wait            = no  
    user            = root  
    server          = /usr/sbin/in.telnetd  
    log_on_failure  += USERID  
}
EOF


systemctl enable inetd --now
useradd zbl
echo 'zhubaolin@123' |passwd --stdin zbl
echo  'oldboy ALL=(ALL)  NOPASSWD: ALL '  >>/etc/sudoers 

2.2. 📝编译安装流程

#1. 安装依赖  
apt install -y gcc zlib1g zlib1g-dev libssl-dev make

# 下载源码包
wget  https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz

# 解压源码包
tar xf openssh-9.9p2.tar.gz

# 进入源码包目录
cd openssh-9.9p2/

# 编译前准备
./configure  --prefix=/app/tools/openssh-9.9p2/

# 编译
make -j `nproc`

# 安装
make install
ln -s  /app/tools/openssh-9.9p2/  /app/tools/openssh

2.3. 🔍启动测试

这里会断开连接,这里使用telnet 23端口连接 使用oldboy普通用户,sudo su - 切换为root 
telnet 10.0.0.5 23 #10.0.0.5为服务器ip   
输入oldboy
和输入密码

pkill sshd 
结束已有sshd进程

修改sshd配置文件 注意这里配置不在/etc/在/app/tools/openssh/etc下.

cp /app/tools/openssh/etc/sshd_config{,.bak}
cat >>/app/tools/openssh/etc/sshd_config <<EOF
Port 22
PermitRootLogin yes
PasswordAuthentication yes
#GSSAPIAuthentication no 这个不用配置,默认就关闭了.
UseDNS no
EOF

启动服务测试 
/app/tools/openssh/sbin/sshd

2.4. ✂️清理(谨慎操作-可选)

# 关闭并删除openssh 8.2版本的服务端
dpkg -l |grep openssh |awk '{print $2}' |xargs dpkg --purge 

2.5. ☀️后续收尾-环境变量

#1. 配置PATH环境变量
echo 'export PATH=/app/tools/openssh/bin/:/app/tools/openssh/sbin/:$PATH' >>/etc/profile
source  /etc/profile 

#2.检查命令位置
which ssh ssh-keygen sshd

2.6. 📝书写systemctl文件与管理sshd

#如果没有sshd用户则创建一个虚拟sshd用户
useradd -s /sbin/nologin -M sshd

#配置sshd服务自启动管理文件
cat>/usr/lib/systemd/system/sshd99.service<<'EOF'
[Unit]
Description=OpenSSH 9.9 server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target 

[Service]
Type=simple
ExecStart=/app/tools/openssh/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

#杀死 sshd进程,谨慎操作,会断开连接。
pkill sshd

systemctl daemon-reload
systemctl disable ssh --now
systemctl enable sshd99 --now

2.7. 💾复制ssh-copy-id命令

cp ~/openssh-9.9p2/contrib/ssh-copy-id  /app/tools/openssh/bin/ 

升级Openssh后没有ssh-copy-id解决方案.

chmod +x  /app/tools/openssh/bin/ssh-copy-id

2.8. ✂️关闭telnet仅使用sshd

systemctl disable  --now  inetd

3. ✅centos 7.9升级openssl到1.1.1最新版与openssh 9.9

  • centos 7.9 是openssl0.9.8e和1.0.2k,先升级openssl再升级openssh

3.1. 🚀升级openssl 1.1.1w

3.1.1. 🌏源码安装openssl 1.1.1w

# 安装依赖
yum install -y  zlib-devel

# 下载openssl-1.1.1w源码包
wget https://ghfast.top/https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz

# 解压openssl-1.1.1w源码包
tar xf openssl-1.1.1w.tar.gz

# 进入openssl-1.1.1w源码包目录
cd openssl-1.1.1w/

# 编译前准备
./config

# 编译
make  -j `nproc`

# 安装
make install

# 更新动态链接库数据
echo  '/usr/local/lib64/' >/etc/ld.so.conf.d/openssl.conf

# 使配置生效
ldconfig -v

# 查看版本
openssl  version

3.1.2. 🚀升级openssh 9.9

# 下载源码包
wget  https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz

# 解压源码包
tar xf openssh-9.9p2.tar.gz

# 进入源码包目录
cd openssh-9.9p2/

# 编译前准备
./configure  --prefix=/app/tools/openssh-9.9p2/

# 编译
make -j `nproc`

# 安装
make install

# 创建软链接
ln -s  /app/tools/openssh-9.6p1/  /app/tools/openssh

#安装并启动telnet
yum -y install telnet-server
systemctl enable telnet.socket --now

useradd zbl
echo 'zhubaolin@123' | passwd --stdin zbl
echo 'zbl ALL=(ALL)  NOPASSWD: ALL '  >>/etc/sudoers

这里会断开连接,这里使用telnet 23端口连接 使用oldboy普通用户,sudo su - 切换为root 
telnet 10.0.0.5 23 #10.0.0.5为服务器ip   
输入oldboy
和输入密码 


修改sshd配置文件 注意这里配置不在/etc/在/app/tools/openssh/etc下.

cp /app/tools/openssh/etc/sshd_config{,.bak}
cat >>/app/tools/openssh/etc/sshd_config <<EOF
Port 22
PermitRootLogin yes
PasswordAuthentication yes
#GSSAPIAuthentication no 这个不用配置,默认就关闭了.
UseDNS no
EOF

kill sshd的pid 
结束已有sshd进程

# 启动服务测试 
/app/tools/openssh/sbin/sshd

# 查看ssh版本
[root@centos ~]# /app/tools/openssh/sbin/sshd -V
OpenSSH_9.9p2, OpenSSL 1.1.1w  11 Sep 2023

3.2. 🔍测试

3.3. ✂️清理(谨慎操作-可选)

# 关闭并删除openssh 7.4p1版本的服务端
rpm -qa |grep openssh  |xargs rpm -e  --nodeps   

# 删除openssl 旧版本的
[root@update-sshd ~]# rpm -qa |grep ^openssl 
openssl098e-0.9.8e-29.el7.centos.3.x86_64
openssl-libs-1.0.2k-19.el7.x86_64
openssl-1.0.2k-19.el7.x86_64
[root@update-sshd ~]# rpm -qa |grep ^openssl  |xargs rpm -e  --nodeps 
[root@update-sshd ~]# 
[root@update-sshd ~]# 
[root@update-sshd ~]# rpm -qa |grep openssl 
xmlsec1-openssl-1.2.20-7.el7_4.x86_64

3.4. ☀️后续收尾-环境变量

#1. 配置PATH环境变量
echo 'export PATH=/app/tools/openssh/bin/:/app/tools/openssh/sbin/:$PATH' >>/etc/profile
source  /etc/profile

#2.检查命令位置

3.5. 📝书写systemctl文件

mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/oldsshd.service
cat >/usr/lib/systemd/system/sshd.service<<'EOF'
[Unit]
Description=OpenSSH 9.9 server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target 

[Service]
Type=simple
ExecStart=/app/tools/openssh/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl disable --now oldsshd
systemctl enable --now sshd

3.6. 📝修改配置文件为/etc/ssh

mkdir -p /backup/
mv  /etc/ssh  /backup/
ln -s  /app/tools/openssh/etc/  /etc/ssh
#后续修改/etc/ssh/sshd_config配置文件即可.

3.7. ✂️测试连接并关闭telnet服务

systemctl  disable --now  telnet.socket

3.8. 💾复制ssh-copy-id命令

cp ~/openssh-9.9p2/contrib/ssh-copy-id  /app/tools/openssh/bin/ 

升级Openssh后没有ssh-copy-id解决方案.

chmod +x  /app/tools/openssh/bin/ssh-copy-id

4. ✅openssh9.9升级脚本(kylin/ubuntu/centos7.9)

#!/bin/bash
##############################################################
# File Name:openssh-update.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################

function line() {
	echo -e "\E[1;33m######$1######\E[0m\E[1;34m脚本运行中\E[0m\E[1;33m######$1######\E[0m"
}

function check(){
	if [ $? -eq 0 ];then
		echo -e "\E[1;32m${1}======>success\E[0m"
	else
		echo -e "\E[5;31m${1}======>faild\E[0m"
		exit 1
	fi
}
line "openssh9.9升级脚本"

function update_sslver() {
		source /etc/os-release
		if [ "${ID}" = "centos" ];then

			echo -e "\E[1;33m当前${ID}系统openssl版本不符合要求,需要升级到1.1.1最新版\E[0m"

			echo -e "\E[1;34m安装openssl升级所需要的依赖\E[0m"
			yum install -y  zlib-devel >/dev/null 2>&1
			check "安装openssh升级所需要的依赖"

			echo -e "\E[1;34m下载openssl-1.1.1w源码包\E[0m"
			wget https://ghfast.top/https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz >/dev/null 2>&1
			check "下载openssl-1.1.1w源码包"

			echo -e "\E[1;34m解压openssl-1.1.1w源码包\E[0m"
			tar xf openssl-1.1.1w.tar.gz
			check "解压openssl-1.1.1w源码包"

			echo -e "\E[1;34m进入openssl-1.1.1w源码包目录\E[0m"
			cd openssl-1.1.1w/
			check "进入openssl-1.1.1w源码包目录"

			echo -e "\E[1;34m编译前准备\E[0m"
			./config >/dev/null 2>&1
			check "编译前准备"

			echo -e "\E[1;34m编译\E[0m"
			make  -j `nproc` >/dev/null 2>&1
			check "编译"

			echo -e "\E[1;34m安装\E[0m"
			make install >/dev/null 2>&1
			check "安装"

			echo -e "\E[1;34m更新动态链接库数据\E[0m"
			echo  '/usr/local/lib64/' >/etc/ld.so.conf.d/openssl.conf
			check "更新动态链接库数据"

			echo -e "\E[1;34m更新动态链接库数据\E[0m"
			ldconfig -v >/dev/null 2>&1
			check "更新动态链接库数据"

			echo -e "\E[1;34m升级openssl成功,当前openssl版本\E[0m"
			openssl  version

			echo -e "\E[1;34m正在清理升级遗留文件\E[0m"
			cd ~
			rm -rf ~/openssl-1.1.1w*
			check "清理升级遗留文件"

		else
			echo -e "\E[1;34m当前${ID}系统openssl版本符合要求,无需升级\E[0m"
		fi
		return $?
}
update_sslver

function check_package() {
	which gcc make >/dev/null 2>&1
	rc=$?
	if [ $rc -ne 0 ];then
		source /etc/os-release
		case "$ID" in
			kylin|centos)
				yum clean all >/dev/null 2>&1
				yum -y install gcc zlib zlib-devel make >/dev/null 2>&1
				;;
			ubuntu)
				apt update >/dev/null 2>&1
				apt -y install gcc zlib1g zlib1g-dev libssl-dev make >/dev/null 2>&1
				;;
			*)
				echo "未识别的操作系统,请先手动安装编译需要的依赖"
				exit 1
		esac
	fi
	return $?
}

echo -e "\E[1;34m0.当前系统环境符合升级要求,开始安装openssh升级所需要的依赖\E[0m"
check_package
check "安装openssh升级所需要的依赖"

echo -e "\E[1;34m1.下载openssh9.9源码包\E[0m"
wget  https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.9p2.tar.gz >/dev/null 2>&1
check "下载openssh9.9源码包"

echo -e "\E[1;34m2.解压openssh9.9源码包\E[0m"
tar xf openssh-9.9p2.tar.gz
check "解压openssh9.9源码包"

echo -e "\E[1;34m3.进入openssh9.9源码包目录\E[0m"
cd openssh-9.9p2/
check "进入openssh9.9源码包目录"

echo -e "\E[1;34m4.编译前准备\E[0m"
./configure  --prefix=/app/tools/openssh-9.9p2/ >/dev/null 2>&1
check "编译前准备"

echo -e "\E[1;34m5.开始编译\E[0m"
make -j `nproc` >/dev/null 2>&1
check "开始编译"

echo -e "\E[1;34m6.开始安装\E[0m"
make install >/dev/null 2>&1
check "开始安装"

echo -e "\E[1;34m7.创建openssh软链接\E[0m"
ln -s /app/tools/openssh-9.9p2/ /app/tools/openssh
check "创建openssh软链接"

echo -e "\E[1;34m8.备份sshd_config配置文件\E[0m"
cp /app/tools/openssh/etc/sshd_config{,.bak}
check "备份sshd_config配置文件"

echo -e "\E[1;34m9.修改sshd_config配置文件\E[0m"
cat >>/app/tools/openssh/etc/sshd_config <<EOF
Port 22
PermitRootLogin yes
PasswordAuthentication yes
#GSSAPIAuthentication no 这个不用配置,默认就关闭了.
UseDNS no
EOF
check "修改sshd_config配置文件"

echo -e "\E[1;34m11.配置环境变量\E[0m"
echo 'export PATH=/app/tools/openssh/bin/:/app/tools/openssh/sbin/:$PATH' >>/etc/profile
check "配置环境变量"

echo -e "\E[1;34m12.加载环境变量\E[0m"
source  /etc/profile
check "加载环境变量"

function add_sshduser() {
	id sshd >/dev/null 2>&1
	rc=$?
	if [ $rc -ne 0 ];then
        useradd -s /sbin/nologin -M sshd
	fi
	return $rc
}

echo -e "\E[1;34m13.添加sshd虚拟用户\E[0m"
add_sshduser
check "添加sshd虚拟用户"

echo -e "\E[1;34m14.书写自启动服务文件\E[0m"
cat>/usr/lib/systemd/system/sshd99.service<<'EOF'
[Unit]
Description=OpenSSH 9.9 server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target

[Service]
Type=simple
ExecStart=/app/tools/openssh/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF
check "书写自启动服务文件"

echo -e "\E[1;34m15.加载自启动服务文件\E[0m"
systemctl daemon-reload
check "加载自启动服务文件"

function disable_ssh() {
		source /etc/os-release
		case "$ID" in
			kylin|centos)
				systemctl disable sshd --now >/dev/null 2>&1
				;;
			ubuntu)
				systemctl disable ssh --now >/dev/null 2>&1
				;;
			*)
				echo "未识别的操作系统,请手动关闭ssh服务"
				exit 1
		esac
	return $?
}

echo -e "\E[1;34m16.关闭旧版本ssh服务\E[0m"
disable_ssh
check "关闭旧版本ssh服务"

echo -e "\E[1;34m17.启动新版本ssh服务\E[0m"
systemctl enable sshd99 --now >/dev/null 2>&1
check "启动新版本ssh服务"

function mkbackup_dir() {
  if [ ! -d /backup ];then
  	mkdir -p /backup/
  fi
  return $?
}

echo -e "\E[1;34m18.修改配置文件为/etc/ssh\E[0m"
echo -e "\E[1;34m18.1创建/backup目录\E[0m"
mkbackup_dir
check "创建/backup目录"

echo -e "\E[1;34m18.2备份旧版本ssh文件\E[0m"
mv  /etc/ssh  /backup/
check "备份旧版本ssh文件"

echo -e "\E[1;34m18.3修改新版本ssh配置文件为/etc/ssh\E[0m"
ln -s  /app/tools/openssh/etc/  /etc/ssh
check "修改新版本ssh配置文件为/etc/ssh"

echo -e "\E[1;34m19.拷贝ssh-copy-id命令\E[0m"
cp ~/openssh-9.9p2/contrib/ssh-copy-id  /app/tools/openssh/bin/
check "拷贝ssh-copy-id命令"

echo -e "\E[1;34m20.ssh-copy-id添加执行权限\E[0m"
chmod +x  /app/tools/openssh/bin/ssh-copy-id
check "ssh-copy-id添加执行权限"

echo -e "\E[1;34m=====openssh服务升级成功,当前版本=====\E[0m"
ssh -V

echo -e "\E[1;34m正在清理升级遗留文件\E[0m"
rm -f /server/scripts/openssh-9.9p2*
check "清理升级遗留文件"

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注