CentOS7.x 升级OpenSSH_8.6p1

CentOS7.x操作系统自带的OpenSSH版本默认为7.4p1,使用yum update最高也只能升级到7.4p1的补丁版本,漏扫会发现很多OpenSSH相关的漏洞,根据等保安全测评的要求,需要将OpenSSH升级到更新的版本,本篇文档记录了我本次升级的过程以及遇到的问题,供大家参考。

安装包下载地址

Openssl 下载地址:https://ftp.openssl.org/source/

Openssh 下载地址:https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/

安装基础环境包

注:受perl版本限制,最新版的openssl1.1.1需要perl5.10+版本,

1
yum -y install ntpdate wget gcc gcc-c++ glibc make krb5-libs krb5-devel zlib-devel pam-devel perl

同步服务器时间

1
ntpdate ntp.aliyun.com

升级openssl

1
2
openssl version
ssh -V

01

下载编译安装openssl

1
2
3
4
5
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz --no-check-certificate
tar xf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./config --prefix=/usr/local/openssl
make && make install

备份openssl

1
2
mv /usr/bin/openssl{,.bak}
mv /usr/include/openssl{,.bak}

创建软连接

1
2
3
4
5
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl

01

升级openssh

安装、配置telnet服务

1
yum install xinetd telnet-server -y
1
2
3
4
5
6
7
8
9
10
11
12
cat > /etc/xinetd.d/telnet <<EOF
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no #修改yes为no
}
EOF

允许root远程telnet登录主机

1
2
3
4
5
6
7
vim /etc/securetty
#在最后添加如下内容
pts/0
pts/1
pts/2
pts/3

配置开机自启动

1
2
3
4
systemctl enable telnet.socket
systemctl start telnet.socket
systemctl enable xinetd
systemctl start xinetd

放行防火墙

1
2
firewall-cmd --add-service=telnet --zone=public --permanent
firewall-cmd --reload

以下操作使用telnet远程登录主机进行操作

01

备份openssh配置

1
2
mv /etc/ssh{,.bak}
cp /etc/pam.d/sshd{,.bak}

卸载旧版本openssh

1
rpm -e --nodeps `rpm -qa | grep openssh`

编译安装openssh

1
2
3
4
5
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz
tar xf openssh-8.6p1.tar.gz
cd openssh-8.6p1
./configure --prefix=/usr -sysconfdir=/etc/ssh -with-ssl-dir=/usr/local/openssl -with-zlib -with-pam -with-md5-passwords -with-kerberos5 --without-zlib-version-check
make && make install

修改配置文件

1
2
3
cp contrib/redhat/sshd.init /etc/init.d/sshd
sed -i 's/^#\(PermitRootLogin \).*/\1yes/' /etc/ssh/sshd_config
sed -i '/UseDNS/c\UseDNS no' /etc/ssh/sshd_config

配置开机自启动

升级后不能使用systemctl 方式启动,感觉有点怪……

1
2
/etc/init.d/sshd start
chkconfig --level 35 sshd on

测试通过后,关闭telnet(telnet是明文传输,不安全)

1
2
3
4
systemctl disable xinetd
systemctl stop xinetd
systemctl disable telnet.socket
systemctl stop telnet.socket

您可能遇到的问题?

问题1:make: * [configdata.pm] Error 1

01

解决方案:服务器时间不对,手动调整服务器时间即可

1
ntpdate ntp.aliyun.com

问题2:Failed to listen on Telnet Server Activation Socket.

01

解决方案:由于已经启动了一个xinetd进程,杀掉,重新启动telnet即可

01

问题3:configure: error: PAM headers not found

解决方案: yum -y install pam-devel

问题4:error: Could not get shadow information for root

01

解决方案:由于开启了selinux导致,关闭即可

1
2
3
4
5
6
#临时解决方案:
setenforce 0
#永久解决方案
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
grep SELINUX=disabled /etc/selinux/config
reboot

问题5:sshd.service start operation timed out. Terminating

01

解决方案:sshd不兼容systemd造成的,sshd启动方式修改为sysv即可。

1
2
3
4
5
6
7
mv /usr/lib/systemd/system/sshd.service{,.bak}
systemctl stop ssh.service
rm /lib/systemd/system/ssh.service
systemctl daemon-reload
cd /usr/local/src/openssh-8.6p1/
cp contrib/redhat/sshd.init /etc/init.d
systemctl start ssh.service

问题6:服务器发送了一个意外的数据包。received:3,expected:20

在/etc/ssh/sshd_config最后添加以下内容,重启sshd服务

1
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

问题7:no matching key exchange algorithm found

openssh升级完成后,xshell 4 无法连接服务器,升级xhell版本或者更好其他连接工具。

独学无友,孤陋寡闻;学习记录,欢迎拍砖!