一、升级原因
7.4以下openssh版本存在严重漏洞:
- OpenSSH 远程权限提升漏洞(CVE-2016-10010)
- OpenSSH J-PAKE授权问题漏洞(CVE-2010-4478)
- Openssh MaxAuthTries限制绕过漏洞(CVE-2015-5600)
OpenSSL>=1.0.1可以不用升级OpenSSL
二、安装telnet服务
1、安装软件
yum -y install xinetd telnet-server* telnet
2、启用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服务
# mv /etc/securetty /etc/securetty.old #允许root用户通过telnet登录
# systemctl start xinetd #启动telnet服务
# systemctl enable xinetd #使telnet服务开机启动,避免升级过程中服务器意外重启后无法远程登录系统
3、修改pam文件
telnet 默认是不允许 root 直接登陆,需修改 /etc/pam.d/login 文件,将一下内容注释掉
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
将 /etc/pam.d/remote 文件中的 下面内容注释
auth required pam_securetty.so
4、添加登陆终端
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
5、测试telnet能否正常登入系统
telnet ip [23]
三、准备工作
1、关闭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
2、安装软件
yum -y install pam-devel gcc zlib-devel tcp_wrappers-devel
3、备份旧的ssh配置文件,停止sshd服务
tar -czf /usr/local/src/ssh_old.tar.gz /etc/ssh
systemctl stop sshd
systemctl disable sshd
三、安装 OpenSSL
1、下载地址
下载的软件包有
openssl-fips-2.0.16.tar.gz
openssl-1.0.2q.tar.gz
2、编译 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
3、编译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)的代码。
4、添加到动态链接库
echo '/data/openssl1.0.2q/lib' >> /etc/ld.so.conf
ldconfig
四、安装 OpenSSH
1、下载地址
下载的软件包有
openssh-7.6p1.tar.gz
2、编译
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
3、修改 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
4、配置环境变量
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
5、备份并替换旧的命令
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
6、配置 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服务重启命令。
7、测试
重启系统验证没问题后关闭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 /