CentOS7 OpenSSH编译安装升级

一、概述

生产环境经常会被扫到openssh漏洞,一般需要对openssh进行升级。

二、升级准备

2.1、安装telnet-server

为防止openssh升级失败导致无法远程,可通安装telnet-server,登录telnet远程到主机

#安装telnet-server
yum install -y telnet-server

#修改/etc/securetty,在最后添加
vim /etc/securetty
pts/0
pts/1
pts/2
pts/3

#启动telnet-server服务
systemctl start telnet.socket

#然后通过telnet尝试登录,登录成功后再进行下一步比较保险

2.2、编译安装openssh

(1) 如果原主机安装的openssh是通过rpm包安装的,需要先卸载

systemctl stop sshd
yum remove -y openssh

(2) 下载openssh源码包

wget -c https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz

(3) 备份配置文件

mv /etc/ssh /etc/ssh.bak

(4) 编译安装openssh

tar -xf openssh-8.1p1.tar.gz
cd openssh-8.1p1

#编译安装
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh
make && make install

#说明:
--prefix 指定安装目录,如果之前主机上的openssh是编译安装的,建议指定一个文件夹安装,如果之前主机上的openssh是rpm包安装的,rpm卸载后,建议将安装目录指定为/usr;不指定的话默认安装目录为/usr/local
--sysconfdir 指定系统配置文件目录,建议使用/etc/ssh,记得提前备份;这里使用/etc/ssh是因为如果指定了安装目录,其编译后的ssh命令和sshd命令会默认在/etc/ssh目录找ssh_config和sshd_config配置文件,如果不指定这个选项而只指定--prefix选项,如 --prefix=/usr/local/openssh,其编译后的ssh命令和sshd命令运行时,会应用/usr/local/openssh/etc目录下的ssh_config和sshd_config配置文件
#其它选项,根据需要选择
--with-ssl-dir=/usr/bin/openssl 指定OpenSSL路径
--with-pam 启用pam支持
--with-md5-passwords 启用md5密码支持

(4) 替换命令

如果之前主机上的openssh是编译安装的(编译安装路径为/usr),则将原来的命令备份一下,然后将编译好的命令复制到相应文件夹

#备份命令
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/sbin/sshd /usr/sbin/sshd.bak

#拷贝命令
cp /usr/local/openssh/bin/ssh /usr/bin/
cp /usr/local/openssh/sbin/sshd /usr/sbin/

如果之前主机上的openssh是rpm包安装的,卸载后,只需在第4步编译时指定--prefix=/usr进行编译安装即可,如果指定的为--prefix=/usr/local/openssh,则按以下操作

cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
echo 'export PATH=/usr/local/openssh/bin:$PATH' >> /etc/profile
source /etc/profile

(5) 修改sshd配置文件

#新生成的sshd_config文件默认大部分配置都是注释的,需要添加以下配置
vim /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
PermitEmptyPasswords no
UseDNS no

(6) 启动sshd服务

#备份启动脚本(如果有)
mv /etc/init.d/sshd /etc/init.d/sshd.bak

#准备脚本,源码包解压的目录openssh-8.1p1下
cp contrib/redhat/sshd.init /etc/init.d/sshd

#添加开机启动
chkconfig --add sshd

#启动服务
/etc/init.d/sshd start

#查看ssh配置
ssh -V

(7) 测试远程连接

终端先不要关闭,另开一个终端测试远程连接,如果成功了则没什么大问题了,之后把telnet-server卸载

#修改/etc/securetty,删除之前添加的四行
vim /etc/securetty
pts/0
pts/1
pts/2
pts/3

#卸载telnet-server
systemctl stop telnet.socket
yum remove -y telnet-server

(8) 升级后,使用ssh客户端连接其它主机时,如果出现以下错误:

Unable to negotiate with 192.168.80.17 port 22: no matching cipher found. Their offer: aes128-cbc

则修改/etc/ssh/ssh_config文件

#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# 找到以上行的位置,在其下添加以下一行内容即可
    Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc

(9) 小技巧

生产环境有时怕出问题,不敢进行大的操作,可以在本地虚拟机上编译成功后,将ssh和sshd两个命令替换到生产环境,也能达到效果,也可在编译时指定--prefix=/usr,然后将编译后的相关目录命令全部替换到生产环境。

#将/usr/local/openssh/bin/ssh和/usr/local/openssh/sbin/sshd上传至root家目录

#备份
mv /usr/sbin/sshd /usr/sbin/sshd.bak 
mv /usr/bin/ssh /usr/bin/ssh.bak 

#拷贝
mv ssh /usr/bin/ssh 
mv sshd /usr/sbin/sshd 

#添加权限
chmod +x /usr/sbin/sshd /usr/bin/ssh

#重启sshd服务
systemctl restart sshd
#如果是指定--prefix=/usr,其安装的内容如下:
/usr
├── bin
│   ├── scp
│   ├── sftp
│   ├── ssh
│   ├── ssh-add
│   ├── ssh-agent
│   ├── ssh-keygen
│   └── ssh-keyscan
├── libexec
│   ├── sftp-server
│   ├── ssh-keysign
│   └── ssh-pkcs11-helper
├── sbin
│   └── sshd
└── share
    └── man
        ├── man1
        │   ├── scp.1
        │   ├── sftp.1
        │   ├── ssh.1
        │   ├── ssh-add.1
        │   ├── ssh-agent.1
        │   ├── ssh-keygen.1
        │   └── ssh-keyscan.1
        ├── man5
        │   ├── moduli.5
        │   ├── ssh_config.5
        │   └── sshd_config.5
        └── man8
            ├── sftp-server.8
            ├── sshd.8
            ├── ssh-keysign.8
            └── ssh-pkcs11-helper.8

#源码包中还有一个ssh-copy-id的命令,记得拷贝至/usr/bin目录
cp contrib/ssh-copy-id /usr/bin/
chmod +x /usr/bin/ssh-copy-id
原文地址:https://www.cnblogs.com/hovin/p/14777188.html