CentOS 7.0升级OpenSSH到最新版本7.6.p1

1、升级缘由

7.4如下openssh版本存在严重漏洞:linux

  1. OpenSSH 远程权限提高漏洞(CVE-2016-10010)
  2. OpenSSH J-PAKE受权问题漏洞(CVE-2010-4478)
  3. Openssh MaxAuthTries限制绕过漏洞(CVE-2015-5600)
    OpenSSL>=1.0.1能够不用升级OpenSSL

2、安装telnet服务

一、安装软件web

yum -y install xinetd telnet-server* telnet

二、启用telnet服务服务器

# cat > /etc/xinetd.d/telnet << END
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}

END

将其中disable字段的yes改成no以启用telnet服务app

# mv /etc/securetty /etc/securetty.old  #容许root用户经过telnet登陆 
# systemctl start xinetd                #启动telnet服务 
# systemctl enable xinetd               #使telnet服务开机启动,避免升级过程当中服务器意外重启后没法远程登陆系统

三、修改pam文件
telnet 默认是不容许 root 直接登录,需修改 /etc/pam.d/login 文件,将一下内容注释掉ssh

auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

在这里插入图片描述

将 /etc/pam.d/remote 文件中的 下面内容注释socket

auth       required     pam_securetty.so

在这里插入图片描述
四、添加登录终端tcp

echo "pts/0" >> /etc/securetty
echo "pts/1" >> /etc/securetty
echo "pts/2" >> /etc/securetty
echo "pts/3" >> /etc/securetty
echo "pts/4" >> /etc/securetty

五、测试telnet可否正常登入系统svg

telnet ip [23]

在这里插入图片描述

3、准备工做

一、关闭selinux和防火墙以及NetworkManager测试

setenforce 0
sed -i '/SELINUX=/s/enforcing/disabled/g' /etc/sysconfig/selinux

systemctl stop firewalld
systemctl disable firewalld

systemctl stop NetworkManager
systemctl disable NetworkManager

二、安装软件ui

yum -y install pam-devel gcc zlib-devel tcp_wrappers-devel

三、备份旧的ssh配置文件,中止sshd服务

tar -czf /usr/local/src/ssh_old.tar.gz /etc/ssh

systemctl stop sshd
systemctl disable sshd

3、安装 OpenSSL

一、下载地址
下载的软件包有

openssl-fips-2.0.16.tar.gz
openssl-1.0.2q.tar.gz

在这里插入图片描述
二、编译 openssl-fips

export FIPSDIR=/data/fips-2.0.16
cd /usr/local/src/
tar -xf openssl-fips-2.0.16.tar.gz
cd openssl-fips-2.0.16
./config
make && make install

三、编译openssl

cd /usr/local/src/
tar xf openssl-1.0.2q.tar.gz
cd openssl-1.0.2q
./config --prefix=/data/openssl1.0.2q --openssldir=/data/openssl1.0.2q/openssl fips --with-fipsdir=/data/fips-2.0.16 zlib-dynamic shared -fPIC
make depend
make
make test
make install

备注:

#参数说明:
--prefix:指定openssl的安装目录。
--openssldir:指定openssl文件的安装目录。
fips:集成FIPS模块。
--with-fipsdir:指向FIPS模块的安装目录位置。
zlib-dynamic:编译支持zlib压缩/解压缩,让openssl加载zlib动态库。该选项只在支持加载动态库的操做系统上才支持。这是默认选项。
shared:除了静态库之外,让openssl(在支持的平台上)也编译生成openssl动态库。
-fPIC:将openssl动态库编译成位置无关(position-independent)的代码。

四、添加到动态连接库

echo '/data/openssl1.0.2q/lib' >> /etc/ld.so.conf
ldconfig

4、安装 OpenSSH

一、下载地址
下载的软件包有

openssh-7.6p1.tar.gz

二、编译

cd /usr/local/src/
tar xf openssh-7.6p1.tar.gz
cd openssh-7.6p1
./configure --prefix=/data/openssh7.6p1 --with-ssl-dir=/data/openssl1.0.2q --with-pam --with-tcp-wrappers --with-md5-passwords --without-hardening --sysconfdir=/etc/ssh
make

rm -rf /etc/ssh   #删除原来的配置文件
make install

三、修改 sshd 配置文件

cat >> /etc/ssh/sshd_config << END
PermitRootLogin yes   #这个很关键
Protocol 2
SyslogFacility AUTHPRIV
PermitRootLogin yes
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no

#编译的时候启用了PAM支持,就必须启用
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes

END

四、配置环境变量

cat > /etc/profile.d/path.sh << END
export PATH=/data/openssh7.6p1/bin:/data/openssh7.6p1/sbin:$PATH
END
source /etc/profile.d/path.sh

五、备份并替换旧的命令

cp /usr/bin/ssh /usr/bin/ssh.old
\cp /data/openssh7.6p1/bin/ssh /usr/bin/ssh

cp /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old
\cp /data/openssh7.6p1/bin/ssh-keygen /usr/bin/ssh-keygen

mv /usr/sbin/sshd /usr/sbin/sshd.old
ln -s /data/openssh7.6p1/sbin/sshd /usr/sbin/sshd

chmod -R 744 /var/empty/sshd

六、配置 ssh 启动

cp /usr/local/src/openssh-7.6p1/contrib/redhat/sshd.init /etc/init.d/sshd
chmod 755 /etc/init.d/sshd

#mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak
在 '$SSHD $OPTIONS && success || failure'这一行上面加上一行 'OPTIONS="-f /etc/ssh/sshd_config"'

chkconfig --add sshd
chkconfig --level 345 sshd on
systemctl start sshd

在这里插入图片描述
备注:
①有时会遇到 ssh 升级完后,sshd服务反复重启现象,这个是 sshd不兼容systemd形成的,须要

mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak

②若是升级操做一直是在ssh远程会话中进行的,上述sshd服务重启命令可能致使会话断开并没有法使用ssh再行登入(即ssh未能成功重启),此时须要经过telnet登入再执行sshd服务重启命令。

七、测试
在这里插入图片描述
重启系统验证没问题后关闭telnet服务

mv /etc/securetty.old /etc/securetty 
systemctl stop xinetd
systemctl disable xinetd

#如需还原以前的ssh配置信息,可直接删除升级后的配置信息,恢复备份。 
rm -rf /etc/ssh 
tar xf /usr/local/src/ssh_old.tar.gz -C /