OpenSSH 更新

OpenSSH 更新

Centos 7默认源里的OpenSSH版本OpenSSH_7.4p1一直到现在都还没更新过,官方的源码包,已经更新到了OpenSSH_9.5p1了。

OpenSSH低版本一直有安全问题,所以尝试一下OpenSSH升级操作。参考别人制作的编译包,记录如下。

将源码编译为rpm包

编译脚本

OpenSSH官方只提供源码包,其它编译环境下载的rpm包,可能存在依赖问题,所以参考一下github上别人做好的开源脚本进行编译。源码包在这里:

https://github.com/boypt/openssh-rpms

编译脚本支持CentOS 5, CentOS 6,CentOS 7。我们下载编译脚本:

1
2
3
4
wget https://github.com/boypt/openssh-rpms/archive/refs/heads/main.zip
# 解压包
unzip main.zip
cd openssh-rpms-main/

可以看到目录结构如下:

  • compile.sh:编译脚本。
  • el5、el6、el7:对应CentOS5、6、7三个系统,编译相关的参数由SPECS目录下的openssh.spec控制。编译好的rpm包放在RPMS目录下。
  • pullsrc.sh:openssh相关源码下载脚本。
  • version.env:定义了openssh及openssl源码的版本信息。

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ tree
.
├── compile.sh
├── downloads
│   ├── openssh-8.7p1.tar.gz
│   ├── openssl-1.1.1l.tar.gz
│   └── x11-ssh-askpass-1.2.4.1.tar.gz
├── el5
│   ├── BUILD
│   ├── RPMS
│   ├── SOURCES
│   │   └── sshd.pam.el5
│   ├── SPECS
│   │   └── openssh.spec
│   └── SRPMS
├── el6
│   ├── BUILD
│   ├── RPMS
│   ├── SOURCES
│   │   └── sshd.pam.el6
│   ├── SPECS
│   │   └── openssh.spec
│   └── SRPMS
├── el7
│   ├── BUILD
│   ├── RPMS
│   ├── SOURCES
│   │   └── sshd.pam.el7
│   ├── SPECS
│   │   └── openssh.spec
│   └── SRPMS
├── pullsrc.sh
├── README.md
└── version.env

我们再看一下,源码的版本信息:

1
2
3
4
5
6
7
8
9
10
[root@node70 openssh-rpms-main]# more version.env 
OPENSSLSRC=openssl-3.0.11.tar.gz
OPENSSHSRC=openssh-9.5p1.tar.gz
ASKPASSSRC=x11-ssh-askpass-1.2.4.1.tar.gz
PKGREL=1

OPENSSHVER=${OPENSSHSRC%%.tar.gz}
OPENSSHVER=${OPENSSHVER##openssh-}
OPENSSLVER=${OPENSSLSRC%%.tar.gz}
OPENSSLVER=${OPENSSLVER##openssl-}

可以看到OpenVPN版本已经是官方最新版本了。

修改代码

默认openssh源码中是没有ssh-copy-id相关参数的,如果直接编译安装,会发现安装后没有ssh-copy-id命令,因此如果需要用到该命令,需要修改编译参数控制文件openssh.spec。本次要升级的环境为CentOS7,因此我只修改el7目录下的SPECS/openssh.speec文件,在如下位置添加一行。

1
install -m755 contrib/ssh-copy-id $RPM_BUILD_ROOT/usr/bin/ssh-copy-id

添加位置:

1
2
3
4
5
6
install -d $RPM_BUILD_ROOT/etc/pam.d/
install -d $RPM_BUILD_ROOT/etc/rc.d/init.d
install -d $RPM_BUILD_ROOT%{_libexecdir}/openssh
install -m755 contrib/ssh-copy-id $RPM_BUILD_ROOT/usr/bin/ssh-copy-id # <--添加在这里
install -m644 %{SOURCE2} $RPM_BUILD_ROOT/etc/pam.d/sshd
install -m755 contrib/redhat/sshd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/sshd

继续修改另外一个配置:

1
%attr(0755,root,root) %{_bindir}/ssh-copy-id

添加位置:

1
2
3
4
5
6
7
8
9
10
%attr(0755,root,root) %{_bindir}/ssh-keygen
%attr(0755,root,root) %{_bindir}/ssh-copy-id # <--添加在这里
%attr(0644,root,root) %{_mandir}/man1/ssh-keygen.1*
%attr(0755,root,root) %dir %{_libexecdir}/openssh
%attr(4711,root,root) %{_libexecdir}/openssh/ssh-keysign
%attr(0755,root,root) %{_libexecdir}/openssh/ssh-pkcs11-helper
%attr(0755,root,root) %{_libexecdir}/openssh/ssh-sk-helper
%attr(0644,root,root) %{_mandir}/man8/ssh-keysign.8*
%attr(0644,root,root) %{_mandir}/man8/ssh-pkcs11-helper.8*
%attr(0644,root,root) %{_mandir}/man8/ssh-sk-helper.8*

准备编译环境

这个大部分前面的基础环境都会安装。

1
2
yum groupinstall -y "Development Tools"
yum install -y imake rpm-build pam-devel krb5-devel zlib-devel libXt-devel libX11-devel gtk2-devel perl-IPC-Cmd

拉取源码包并编译打包

我们看到官方的文档说明:

1
2
3
4
5
6
7
8
9
10
11
# 1. Install build requirements as listed above.
# 2. Edit version.env file if you want a specific version of openssh/openssl combination (or maybe I havn't updated to the latest).
# 这里,如果需要指定版本的openssh或者是openssl。需要修改version.env版本文件。改成需要的版本就可以。

# 3. Download source packages.
# if any error comes up, just manally download the source tar files into the `downloads` dir.
./pullsrc.sh

# 4. Run the script to build RPMs.
./compile.sh
# For CentOS 5, the default rpmbuild didn't set the variable of `${dist}`, manually run the script with argument `./compile.sh el5`

第二步,拉取会下载如下包:

1
2
3
4
5
6
7
8
[root@node70 downloads]# ls -al 
total 16676
drwxr-xr-x 2 root root 114 Oct 27 21:23 .
drwxr-xr-x 6 root root 146 Oct 27 22:49 ..
-rw-r--r-- 1 root root 0 Oct 17 13:41 .keep
-rw-r--r-- 1 root root 1843001 Oct 4 17:56 openssh-9.5p1.tar.gz
-rw-r--r-- 1 root root 15198318 Sep 19 21:29 openssl-3.0.11.tar.gz
-rw-r--r-- 1 root root 29229 Oct 17 13:41 x11-ssh-askpass-1.2.4.1.tar.gz

当然也可以自己下载了包,上传至download目录下。

第三步,开始编译,没有意外,编译完成会生成openssh的rpm包。检查编译是否完成。

1
2
# echo $?
0 # 返回0即可。

编译完成,生成的rpm包文件在RPMS目录下,我们看一下生成的rpm包。

1
2
3
4
5
6
7
8
9
10
[root@node70 el7]# cd RPMS/
[root@node70 RPMS]# tree
.
└── x86_64
├── openssh-9.5p1-1.el7.x86_64.rpm
├── openssh-clients-9.5p1-1.el7.x86_64.rpm
├── openssh-debuginfo-9.5p1-1.el7.x86_64.rpm
└── openssh-server-9.5p1-1.el7.x86_64.rpm

1 directory, 4 files

接下来,可以升级了。

升级OpenSSH

简单的基本操作

直接安装编译的RPM包,即可。

1
rpm -Uhv ./*rpm

升级完成,可以检查OpenSSH版本:

1
2
3
4
5
6
7
8
[root@node70 x86_64]# ssh -V
OpenSSH_9.5p1, OpenSSL 3.0.11 19 Sep 2023
# 查看安装的编译包
[root@node70 RPMS]# rpm -qa | grep openssh
openssh-debuginfo-9.5p1-1.el7.x86_64
openssh-9.5p1-1.el7.x86_64
openssh-server-9.5p1-1.el7.x86_64
openssh-clients-9.5p1-1.el7.x86_64

可以看到已经升级成功。

重启OpenSSH服务

1
systemctl restart sshd

当然,我们做到这一步,会发现重启ssh服务失败。查看日志,可以发现etc目录下的文件权限有问题。

1
2
3
4
5
6
7
8
9
10
11
12
journalctl -xe

# 可以看到如下报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for ‘/etc/ssh/ssh_host_rsa_key’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Unable to load host key “/etc/ssh/ssh_host_rsa_key”: bad permissions
Unable to load host key: /etc/ssh/ssh_host_rsa_key
--------- more ......

好了。看到这里,我们知道是文件权限的问题了。

1
2
cd /etc/ssh/
chmod 0600 ./ssh_host_*

再次重启sshd服务。好了。正常了。

再给一个升级的脚本

放在编译包的上级目录即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

#work_path
work_path=$(cd "$(dirname $0)";pwd)

echo $work_path
#backup sshd
cp /etc/pam.d/sshd $work_path

#修改ssh配置文件权限
chmod 0600 /etc/ssh/*
#升级ssh
rpm -Uvh $work_path/rpms/openssh-*
#还原pam.d配置文件
mv /etc/pam.d/sshd /etc/pam.d/sshd.back
cp $work_path/sshd /etc/pam.d/
#修改ssh配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup


egrep "^PermitRootLogin yes" /etc/ssh/sshd_config >>/dev/null 2>&1
if [ $? -ne 0 ];then
sed -i '$aPermitRootLogin yes' /etc/ssh/sshd_config
fi
egrep "^KexAlgorithms.*" /etc/ssh/sshd_config >>/dev/null 2>&1
if [ $? -ne 0 ];then
sed -i '$aKexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1' /etc/ssh/sshd_config
fi
egrep "^PubkeyAcceptedAlgorithms.*+ssh-rsa" /etc/ssh/sshd_config >>/dev/null 2>&1
if [ $? -ne 0 ];then
sed -i '$aPubkeyAcceptedAlgorithms +ssh-rsa' /etc/ssh/sshd_config
fi




#重启ssh服务
systemctl restart sshd

OpenSSH 更新
https://ywmy.xyz/2023/10/27/OpenSSH-更新/
作者
ian
发布于
2023年10月27日
许可协议