Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

红帽6升级SSH

安全检查报告SSH版本太低存在漏洞需要进行升级,但是红帽没有现成的高版本打包好SSH的rpm。自己动手丰衣足食,没有网上一些朋友遇到那么多的问题,但是也是这纠结过程。

搞一台身边的机器测试安装,如果远程机器搞不好就连不上了!!先手动编译安装一遍,把编译需要的依赖都安装好,然后再rpmbuild就会比较顺利。

运维同事编译安装的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
加载光盘的packages
# mount -o loop disk1.iso /mnt/disk
# vi /etc/yum.repo.d/local.repo

[root@localhost SOURCES]# ll *.tar.gz
-rw-r--r--. 1 root   root   1499808 3月  10 2016 openssh-7.2p2.tar.gz
-rw-r--r--. 1 root   root   5489494 10月 20 16:41 openssl-1.0.2j.tar.gz
-rw-r--r--. 1 root   root     29229 6月  26 2004 x11-ssh-askpass-1.2.4.1.tar.gz

一、升级 Zlib
1、下载最新版本 Zlib
# ./configure --prefix=/usr/local/zlib
本次遇到GCC未安装
yum -y install gcc
./configure --prefix=/usr/local/zlib
# make
# make install
这样,就把 zlib 编译安装在 /usr/local/zilib 中了。
二、升级 OpenSSL
1、下载最新版本 OpenSSL
which openssl    查看到当前是在/usr/bin/openssl
# ./config --prefix=/usr --shared
本次遇到系统时间不对的,修改好系统时间后config正常。
# make
# make test (这一步很重要哦!是进行 SSL 加密协议的完整测试,如果出现错误就要一定先找出哪里的原因,否则一味继续可能导致最终 SSH 不能使用,后果很严重哦!)
# make install
三、升级 OpenSSH
1、下载最新版本 OpenSSH
#  ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/bin/openssl --with-md5-passwords 
(注意,如果 configure 时提示 PAM 有错误,那一般是因为系统中没有安装 pam-devel RPM 包,找到安装光盘,安装 pam-devel 就可以解决啦)如果是sshkeygen提示错误,需要make  clean再重新编译
本次安装过程提示了pam问题,cd /opt/cdrom-mirror/Packages
rpm -ivh pam-devel-1.1.1-10.el6_2.1.x86_64.rpm
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/bin/openssl --with-md5-passwords 
# make
# make install
ssh -V 

编译RPM包

机器太多,不太可能一台台的编译安装。首先用rpmbuild打包,然后用createrepo制作本地私有仓库。主要是openssl打包比较纠结!OpenSSH完全依赖OpenSSL的,所以OpenSSL的版本一定要先编译安装好,然后再编译OpenSSH。相应的包下面都有对应的spec文件。

实际操作过程是先打包OpenSSH的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 cd
 mkdir rpmbuild
 cd rpmbuild/
 mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

 cd SOURCES/
 cd ../SPECS/
 cp ~/updatessh/openssh-7.2p2/contrib/redhat/openssh.spec ./
 cd ..
 cd SOURCES/
 vi /etc/resolv.conf
 wget http://pkgs.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz
 wget http://pkgs.fedoraproject.org/repo/pkgs/openssh/openssh-7.2p2.tar.gz/13009a9156510d8f27e752659075cced/openssh-7.2p2.tar.gz
 cd ..
 yum groupinstall "X Window System" "Desktop" "Desktop Platform" "General Purpose Desktop"
 yum -y install libX11-devel
 yum install imake
 yum provides \*/Intrinsic.h
 yum install libXt-devel
 yum search gtk
 yum install gtk2 gtk2-devel
 vi SPECS/openssh.spec
 rpmbuild -bb SPECS/openssh.spec

然后坑就摆在那里了:重启sshd失败。

1
2
3
4
5
6
7
8
# 在rpmbuild\RPMS\x86_64目录下面创建createrepo私有仓库
# /etc/yum.repo.d/local.repo增加节点

# yum install openssh 

# 重启
[root@localhost ~]# service sshd restart
然后启动了[失败](具体错没记下来)

感觉是OpenSSL的问题了。然后打包好OpenSSL后安装竟然报错:找不到libssl的动态链接库

1
2
3
4
5
6
7
8
9
10
11
12
Error: Package: wget-1.12-1.4.el6.x86_64 (@anaconda-RedHatEnterpriseLinux-201206132210.x86_64/6.3)
           Requires: libcrypto.so.10()(64bit)
           Removing: openssl-1.0.0-20.el6_2.5.x86_64 (@cdrom)
               libcrypto.so.10()(64bit)
           Updated By: openssl-1.0.2j-1.x86_64 (upgrade)
               Not found
Error: Package: 1:wpa_supplicant-0.7.3-3.el6.x86_64 (@cdrom)
           Requires: libssl.so.10()(64bit)
           Removing: openssl-1.0.0-20.el6_2.5.x86_64 (@cdrom)
               libssl.so.10()(64bit)
           Updated By: openssl-1.0.2j-1.x86_64 (upgrade)
               Not found

官方的出的spec打包的rpm安装后竟然会少东西。百思不得其解,通过查看cdrom openssl-1.0.0-20.el6_2.5.x86_64.rpm与rpmbuild openssl-1.0.2j-1.x86_64.rpm的确还不同:

1
2
3
4
5
6
7
8
[root@localhost ~]# rpm -qlp /opt/cdrom/Packages/openssl-1.0.0-20.el6_2.5.x86_64.rpm | grep libssl
...
/usr/lib64/libssl.so.1.0.0
/usr/lib64/libssl.so.10

[root@localhost ~]# rpm -qlp /opt/cdrom/Packages/openssl-1.0.0-20.el6_2.5.x86_64.rpm | grep libssl
...
/usr/lib64/libssl.so.1.0.0

在spec里面增加libssl.so.10软链接也没用。rpm并没有提供libssl.so.10的 provide 服务(可以通过rpm -qip –provides RPM查看)。

实在想不出办法了,只能先看下官网怎么打包的。最后通过查看 openssl-1.0.0-20.el6_2.5.src.rpm 的打包spec是进行定制了的,把原来编译生成的动态链接库so.$(SHLIB_MAJOR).$(SHLIB_MINOR)文件名改成so.$(SHLIB_SONAMEVER)。主要的两个patch为:

  • openssl-1.0.0-beta3-soversion.patch
  • openssl-1.0.0-beta4-redhat.patch

参考修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
修改Makefile
diff -u openssl-1.0.2j/Makefile.org rpmbuild/SOURCES/openssl-1.0.2j/Makefile.org
--- openssl-1.0.2j/Makefile.org 2016-09-26 17:49:07.000000000 +0800
+++ rpmbuild/SOURCES/openssl-1.0.2j/Makefile.org        2016-10-20 15:28:32.000000000 +0800
@@ -10,6 +10,7 @@
 SHLIB_MAJOR=
 SHLIB_MINOR=
 SHLIB_EXT=
+SHLIB_SONAMEVER=10
 PLATFORM=dist
 OPTIONS=
 CONFIGURE_ARGS=
@@ -342,10 +343,9 @@
 link-shared:
        @ set -e; for i in $(SHLIBDIRS); do \
                $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \
-                       LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \
+                       LIBNAME=$$i LIBVERSION=$(SHLIB_SONAMEVER) \
                        LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \
                        symlink.$(SHLIB_TARGET); \
-               libs="$$libs -l$$i"; \
        done
 
 build-shared: do_$(SHLIB_TARGET) link-shared
@@ -356,7 +356,7 @@
                        libs="$(LIBKRB5) $$libs"; \
                fi; \
                $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \
-                       LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \
+                       LIBNAME=$$i LIBVERSION=$(SHLIB_SONAMEVER) \
                        LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \
                        LIBDEPS="$$libs $(EX_LIBS)" \
                        link_a.$(SHLIB_TARGET); \

修改Configure1
diff -u openssl-1.0.2j/Configure rpmbuild/SOURCES/openssl-1.0.2j/Configure
--- openssl-1.0.2j/Configure    2016-09-26 17:49:07.000000000 +0800
+++ rpmbuild/SOURCES/openssl-1.0.2j/Configure   2016-10-20 16:40:33.000000000 +0800
@@ -1781,7 +1781,7 @@
        elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
                {
                my $sotmp = $1;
-               s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
+               s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_SONAMEVER) .s$sotmp/;
                }
        elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
                {

修改Configure2
rpmbuild/SOURCES/openssl-1.0.2j/Configure 文件中 so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR) 替换成 so.\$(SHLIB_SONAMEVER)

修改spec
[root@localhost ~]# diff openssl-1.0.2j/openssl.spec rpmbuild/SPECS/openssl.spec
110a111,121
> version=%{version}
> soversion=10
> rename so.${soversion} so.${version} $RPM_BUILD_ROOT%{_libdir}/*.so.${soversion}
> for lib in $RPM_BUILD_ROOT/usr/lib64/*.so.${version} ; do
>         chmod 755 ${lib}
>         ln -s -f `basename ${lib}` $RPM_BUILD_ROOT/usr/lib64/`basename ${lib} .${version}`
>         ln -s -f `basename ${lib}` $RPM_BUILD_ROOT/usr/lib64/`basename ${lib} .${version}`.${soversion}
> 
> done
> 

然后打包OpenSSL,用Yum更新OpenSSL;再打包OpenSSH,最后再用Yum安装OpenSSH。

配置

打包好完成后完成大半的任务了,但是重启过程出现了一些问题:

  1. error while loading shared libraries: libcrypto.so.10: cannot enable executable stack as shared object requires: Permission denied

运行: execstack -c libcrypto.so.10 解决。 http://www.linuxquestions.org/questions/linux-kernel-70/longterm-and-grsec-on-slackware-13-0-a-903612/

  1. 重启后远程密码登录上不,但是机器重启是可以登录的,而且su通过密码也是可以切换的。

由于su切换没问题,应该不是加解密的问题。最后经常是selinux的问题: setenforce 0 ; vi /etc/selinux/config 完成配置。

到此纠结的SSH升级告一段落。后面上百台机器通过puppet就可以搞定了。

最后分享一个牛逼到不能再牛逼升级配置的文章: http://www.tsingfun.com/html/2016/env_0330/1332.html 包括了升级过程中你遇到和没遇到的所有问题了。

再记

在测试机上面搞的都是默认的配置啊,安全级别本来就不高。但是到生产就不同了,本来加了防护的。需要特别注意!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#centos6.8
#直接用openssl-1.0.1e-48.el6
[root@localhost yum.repos.d]# mount -o loop CentOS-6.8-x86_64-bin-DVD1.iso /opt/cdrom
[root@localhost yum.repos.d]# vi local.repo

[root@localhost rpmbuild]#  yum groupinstall "X Window System" "Desktop" "Desktop Platform" "General Purpose Desktop"

[root@localhost yum.repos.d]# yum install -y libX11-devel imake libXt-devel gtk2 gtk2-devel 

[root@localhost rpmbuild]# yum install -y rpm-build
[root@localhost rpmbuild]# yum install -y openssl-devel   krb5-devel pam-devel 

[root@localhost rpmbuild]# yum install gcc

[root@localhost rpmbuild]# rpmbuild -bb SPEC/openssh.spec

自己做的repo:

[root@hadoop-master1 ssh]# ll
total 6192
-rw-r--r-- 1 root root  439708 Oct 21 17:53 openssh-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root   41752 Oct 21 17:53 openssh-askpass-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root   22684 Oct 21 17:53 openssh-askpass-gnome-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root  581836 Oct 21 17:53 openssh-clients-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root   16948 Oct 21 17:53 openssh-debuginfo-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root  391544 Oct 21 17:53 openssh-server-7.2p2-1.x86_64.rpm
-rw-r--r-- 1 root root 3226970 Oct 21 17:23 openssl-1.0.1e-48.el6.src.rpm
-rw-r--r-- 1 root root 1595916 May 12 18:49 openssl-1.0.1e-48.el6.x86_64.rpm
drwxr-xr-x 2 root root    4096 Oct 21 18:47 repodata

注意点:

1 selinux关掉

2 开个telnet以防万一

yum install telnet-server
chkconfig telnet on
service xinetd restart

3 PAM
vi /etc/ssh/sshd_config
UsePAM no(反正要确认pam,或者看看/etc/pam.d/sshd是否满足要求)

–END

Comments