之所以要升级 OpenSSH 是因为安全测评会报 SSH 版本信息泄漏,网上流传直接替换 ssh 文件里的版本号,这种做法是错误的。比较科学的做法是升级 OpenSSH,在源代码里清除相关的版本号。
OpenSSH 的升级需要特别小心,一旦升级失败,很有可能导致无法远程登录。如果可以的话,临时开个 telnet 出来,以免升级失败而导致远程不了。等升级成功后,再将 telnet 远程关闭。
升级前,OpenSSH 的版本信息如下:
[root@ricen softwares]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
我准备了以下三个软件包,都是当前最新版本:
[root@ricen softwares]# ls -l
总用量 8216
-rw-r--r--. 1 root root 1565384 1月 25 12:00 openssh-7.9p1.tar.gz
-rw-r--r--. 1 root root 5345604 1月 25 13:50 openssl-1.0.2q.tar.gz
-rw-r--r--. 1 root root 1492654 1月 25 14:04 openssl-fips-2.0.16.tar.gz
首先,安装 openssl-fips:
[root@ricen softwares]# tar xvf openssl-fips-2.0.16.tar.gz
[root@ricen softwares]# cd openssl-fips-2.0.16
[root@ricen openssl-fips-2.0.16]# vi fips/fips_locl.h
找到以下内容,把 FIPS 版本号去掉:
#define FIPS_MODULE_VERSION_TEXT "FIPS 2.0.16 validated module 24 Apr 2017"
即,修改为:
#define FIPS_MODULE_VERSION_TEXT "FIPS validated module 24 Apr 2017"
接下来的操作中,需要确保 gcc、gcc-c++、perl 这些软件包都有安装上。如果没有安装,可以使用 yum 命令来安装。
配置、编译、安装:
[root@ricen openssl-fips-2.0.16]# ./config && make && make install
[root@ricen openssl-fips-2.0.16]# cd ..
接着,安装 openssl:
[root@ricen softwares]# tar xvf openssl-1.0.2q.tar.gz
[root@ricen softwares]# cd openssl-1.0.2q
[root@ricen openssl-1.0.2q]# vi crypto/opensslv.h
找到以下内容,把 OpenSSL 版本号去掉:
# ifdef OPENSSL_FIPS
# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2q-fips 20 Nov 2018"
# else
# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2q 20 Nov 2018"
# endif
即,修改为:
# ifdef OPENSSL_FIPS
# define OPENSSL_VERSION_TEXT "OpenSSL 20 Nov 2018"
# else
# define OPENSSL_VERSION_TEXT "OpenSSL 20 Nov 2018"
# endif
这里必须使用参数 shared 建立共享库文件,否则在编译 OpenSSH 时会报错:
[root@ricen openssl-1.0.2q]# ./config fips shared
[root@ricen openssl-1.0.2q]# make depend
[root@ricen openssl-1.0.2q]# make && make install
[root@ricen openssl-1.0.2q]# cd ..
[root@ricen softwares]# vi /etc/ld.so.conf
把 /usr/local/ssl/lib 加到第一行:
[root@ricen softwares]# ldconfig
最后,安装 openssh-7.9p1:
[root@ricen softwares]# tar xvf openssh-7.9p1.tar.gz
[root@ricen softwares]# cd openssh-7.9p1
[root@ricen openssh-7.9p1]# vi version.h
找到以下内容,把 OpenSSH 版本号去掉:
#define SSH_VERSION "OpenSSH_7.9"
#define SSH_PORTABLE "p1"
即,修改为:
#define SSH_VERSION "OpenSSH"
#define SSH_PORTABLE ""
这里要确保安装 zlib、zlib-devel、pam-devel,如果没有安装,可以使用 yum 命令安装。
配置:
[root@ricen openssh-7.9p1]# ./configure --prefix=/usr \
> --sysconfdir=/etc/ssh/ --with-md5-passwords --with-pam \
> --with-ssl-dir=/usr/local/ssl/
由于新版本 OpenSSH 添加了 ed25519 做签名验证,之前系统里是没有这个算法的证书,需要生成一下:
[root@ricen openssh-7.9p1]# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
[root@ricen openssh-7.9p1]# chmod -R 600 /etc/ssh/
编译、安装:
[root@ricen openssh-7.9p1]# make && make install
[root@ricen openssh-7.9p1]# cd ..
[root@ricen softwares]# vi /etc/ssh/sshd_config
注释掉下面两行:
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
如果允许 root 用户登录,需要开启下面这行:
PermitRootLogin yes
重启 SSH:
[root@ricen openssh-7.9p1]# service sshd restart
这时候远程应该断了,需要重新连上。
升级完成后,可以看到 SSH 的版本信息已经去掉了:
[root@ricen ~]# ssh -V
OpenSSH, OpenSSL 20 Nov 2018