作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师
一 环境描述
1.1 环境描述
OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组所维护的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。sshd是其中的一个独立守护进程。
OpenSSH 7.2p2及之前版本的sshd中的session.c文件中的‘do_setup_env’函数存在安全漏洞。当程序启用UseLogin功能并且PAM被配置成读取用户主目录中的.pam_environment文件时,本地攻击者可借助/bin/login程序的特制的环境变量利用该漏洞获取权限。
1.2 硬件以及软件环境
操作系统版本:Centos5.3
Openssh源版本:OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5
Openssh目标版本:OpenSSH_7.9p1, OpenSSL 1.0.2h
二、Openssh升级步骤
2.1 升级步骤
| 步骤 | 内容 |
|---|---|
| Step 1 | 配置Telnet |
| Step 2 | Openssh依赖包检测 |
| Step 3 | Openssl升级至1.0.2h |
| Step 4 | Openssh升级至7.9p1 |
| Step 5 | 将旧版本Openssl 0.9.8e卸载 |
2.2 Telnet配置
为了防止由于SSH服务在升级过程中出现问题,导致无法远程SSH连接,所以需要配置telnet服务。
2.2.1 检查是否存在Telnet
检查服务器上是否存在telnet服务
[root@service2 ~]# rpm -qa | grep telnet
若未安装,则安装telnet,否则忽略此步骤
[root@service2 ~]# yum -y install telnet telnet-server
[root@service2 ~]# rpm -qa | grep telnet
telnet-0.17-49.el6_10.x86_64
telnet-server-0.17-49.el6_10.x86_64
由于telnet 是由 xinetd控制的,所以同时查看是否安装了xinetd服务
[root@service2 ~]# rpm -qa | grep xinetd
xinetd-2.3.14-40.el6.x86_64
如果没有则安装:
[root@service1 ssh]# yum -y install xinetd
2.2.2 配置Telnet
1.修改xinetd下的telnet配置文件:
[root@service2 ~]# vim /etc/xinetd.d/telnet
将”disable= yes”改成” disable=no”
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
2.设置开机自启动
[root@service2 ~]# chkconfig --list | grep telnet
telnet: off
//如果状态为on,则已经打开,如果状态为off,则参考下面步骤:
[root@service2 ~]# chkconfig telnet on
[root@service2 ~]# chkconfig --list | grep telnet
telnet: on
将xinetd服务设置为开机自启动:
[root@localhost ~]# chkconfig xinetd on
查看telnet端口状态:
[root@localhost ~]#netstat -tnl |grep 23
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
3.连接登录测试:
[root@service2 ~]# telnet 192.168.199.148
Trying 192.168.199.148...
Connected to 192.168.199.148.
Escape character is '^]'.
CentOS release 6.8 (Final)
Kernel 2.6.32-642.el6.x86_64 on an x86_64
login: root
Password:
//因为telnet不是很安全,所以默认的情况之下就是不允许root以telnet登入Linux主机的。但这个问题也可以解决:
[root@service2 ~]# mv /etc/securetty /etc/securetty.bak
2.3 Openssl升级
2.3.1 环境确认
1.查看Openssl版本:
[root@service2 ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
2. 查看升级依赖的包zlib zlib-devel gcc是否存在:
[root@service2 ~]# rpm -qa | grep gcc
gcc-4.4.7-23.el6.x86_64
libgcc-4.4.7-23.el6.x86_64
gcc-c++-4.4.7-23.el6.x86_64
//如果gcc不存在
[root@service2 ~]#yum -y install gcc*
[root@service2 ~]# rpm -qa | grep zlib*
zlib-static-1.2.3-29.el6.x86_64
zlib-1.2.3-29.el6.x86_64
zlib-devel-1.2.3-29.el6.x86_64
//如果zlib zlib-devel不存在
[root@service2 ~]#yum -y install zlib*
2.3.2 源码包编译安装openssl
1.下载想要升级的ssl版本openssl-1.0.2h:
[root@service2~]#wget -c http://artfiles.org/openssl.org/source/old/1.0.2/openssl-1.0.2h.tar.gz
//如果无法联网,则将软件包从windows传输到linux。
2.解压openssl软件包
[root@service2 ~]# tar xf openssl-1.0.2h.tar.gz
3. 编译安装openssl-1.0.2h
[root@service2 ~]# cd openssl-1.0.2h
[root@service2 openssl-1.0.2h]# ./config --prefix=/usr/local/ssl --openssldir=/etc/ssl --libdir=lib shared zlib-dynamic enable-camellia
//
Configured for linux-x86_64.
*** Because of configuration changes, you MUST do the following before
*** building:
make depend
//如果没有报错则执行make depend
[root@service2 openssl-1.0.2h]# make depend
//如果没有报错则执行make && make install
[root@service2 openssl-1.0.2h]# make && make install
4.Man手册以及doc帮助配置:
[root@service2 openssl-1.0.2h]#make MANDIR=/usr/share/man MANSUFFIX=ssl install
[root@service2 openssl-1.0.2h]#install -dv -m755 /usr/share/doc/openssl-1.0.2h
[root@service2 openssl-1.0.2h]#cp -vfr doc/* /usr/share/doc/openssl-1.0.2h
5.其他额外必须配置(为openssh升级做准备)
//将旧的openssl二进制命令文件移走:
[root@service2 ~]#mv /usr/bin/openssl /usr/bin/openssl.bak
//链接新的openssl二进制命令文件
[root@service2 ~]#ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
[root@service2 ~]#ln -s /usr/local/ssl/include/openssl /usr/include/openssl
//重新加载库:
[root@service2 ~]#echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
[root@service2 ~]#ldconfig -v
6.openssl升级成功
[root@service2 ~]#openssl version
OpenSSL 1.0.2h 3 May 2016
2.4 Openssh升级
2.4.1 将原openssh配置文件备份
将原openssh打包备份:
[root@service1 ssh]# tar zcvf /root/ssh.tar.gz /etc/ssh/
2.4.2 编译安装Openssh7.9
[root@service1 ~]# tar xf openssh-7.9p1.tar.gz
[root@service1 ~]# cd openssh-7.9p1
[root@service1 ~]#./configure --prefix=/usr --sysconfdir=/etc/ssh --with-zlib --with-md5-passwords --with-ssl-dir=/usr/local/ssl
如果编译成功:
[root@service1 ~]#make && make install
2.4.3其他配置
//将旧版本的sshd二进制命令文件移走
[root@service1 ~]mv /usr/sbin/sshd /usr/sbin/sshd.old
//将新版本的sshd二进制命令文件链接到原位置
[root@service1 ~]ln -s /root/openssh-7.9p1/sshd /usr/sbin/sshd
//查看升级后的版本:
[root@service2 openssh-7.9p1]# ssh -V
OpenSSH_7.9p1, OpenSSL 1.0.2h 3 May 2016
2.5 卸载旧版本openssl
为了防止旧版本openssl依然存在漏洞扫描风险,将旧版本openssl卸载。
将原版本ssl卸载:
[root@service2 openssh-7.9p1]# rpm -qa | grep openssl
openssl-1.0.1e-48.el6.x86_64
[root@service2 ~]# rpm -e openssl-1.0.1e-48.el6.x86_64
禁止卸载,显示依赖关系。
//输出内容部分显示
error: Failed dependencies:
libcrypto.so.10()(64bit) is needed by (installed) qt-1:4.6.2-28.el6_5.x86_64
libcrypto.so.10()(64bit) is needed by (installed) libarchive-2.8.3-4.el6_2.x86_64
libcrypto.so.10()(64bit) is needed by (installed) libssh2-1.4.2-2.el6_7.1.x86_64
libcrypto.so.10()(64bit) is needed by (installed) wget-1.12-8.el6.x86_64
libcrypto.so.10()(64bit) is needed by (installed) bind-libs-32:9.8.2-0.47.rc1.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) libssh2-1.4.2-2.el6_7.1.x86_64
libssl.so.10()(64bit) is needed by (installed) wget-1.12-8.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) mysql-libs-5.1.73-7.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) httpd-tools-2.2.15-53.el6.centos.x86_64
libssl.so.10()(64bit) is needed by (installed) ptlib-2.6.5-5.el6.x86_64
libssl.so.10()(64bit) is needed by (installed) opal-3.6.6-4.el6.x86_64
记录这两个库文件并将其备份。
libcrypto.so.10
libssl.so.10
[root@service2 openssh-7.9p1]#mkdir /root/backup
[root@service2 openssh-7.9p1]# cp /lib64/libcrypto.so.10 /root/backup/
[root@service2 openssh-7.9p1]# cp /lib64/libssl.so.10 /root/backup/
强制卸载:
[root@service2 ~]#rpm -e --nodeps openssl-1.0.1e-48.el6.x86_64
将新版本编译产生的库文件链接到指定位置
[root@service2 ~]#ln -s /root/openssl-1.0.2h/libssl.so.1.0.0 /lib64/libssl.so.10
[root@service2 ~]# ln -s /root/openssl-1.0.2h/libcrypto.so.1.0.0 /lib64/libcrypto.so.10
libssl.so.10
libcrypto.so.10
需要与原版本库文件名字一致。
2.6 重启校验ssh服务
2.6.1 重启sshd服务
[root@service2 ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
/etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
/etc/ssh/sshd_config line 97: Unsupported option UsePAM
[root@service2 ~]# vim /etc/ssh/sshd_config
注释掉 81,83,97 三行就不会提示如上信息。
2.6.2 sshd配置文件修改
//允许root直连
[root@service2 ~]#echo “PermitRootLogin yes” >> /etc/ssh/sshd_config
//启用X11Forwarding
[root@service2 ~]#echo ‘X11Forwarding yes’ >> /etc/ssh/sshd_config
//开启口令验证
[root@service2 ~]#echo “PasswordAuthentication yes” >> /etc/ssh/sshd_config
[root@service2 ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
[root@service2 ~]# sshd -version
OpenSSH_7.9p1, OpenSSL 1.0.2h 3 May 2016
升级成功。
2.7卸载telnet以及xinted
[root@service2 ~]# rpm -qa | grep telnet
telnet-0.17-49.el6_10.x86_64
telnet-server-0.17-49.el6_10.x86_64
[root@service2 ~]# rpm -e telnet-0.17-49.el6_10.x86_64
[root@service2 ~]# rpm -e telnet-server-0.17-49.el6_10.x86_64
warning: /etc/xinetd.d/telnet saved as /etc/xinetd.d/telnet.rpmsave
//不要忘记将/etc/securetty移动回原位置
[root@service2 ~]# mv /etc/securetty.bak /etc/securetty





