升级openssh至7.5p1

1. 写在前面

在工作中经常会碰到系统安全检测之类的事情,由于常用的发行版如CentOS自带的openssh版本都比较低,所以安全检测的结果常会出现大堆跟它相关的中高危漏洞,以及openssl的高危漏洞。
为了加固系统安全性,所以索性将openssh升级到已修复各项漏洞的高版本。
系统环境:CentOS6.9-2.6.32-696.10.1.el6

2. 升级思路

  • 查阅官方网站openssh,了解其最新的版本信息及其对系统内核和其它依赖组件的要求。
  • 然后备份系统中现有的openssh信息,以备升级失败后进行回退。再根据说明优先完成其依赖组件的升级。
  • 最后升级openssh,并进行验证。
    openssh最新的版本是2017年3月20日释出的OpenSSH 7.5。

3. 升级步骤

3.1 升级openssl

根据openssh7.5p1的文档说明,这一版本建议使用openssl 1.1.0f,所以优先将系统中的openssl升级至1.1.0f。于是访问openssl官网下载其最新的稳定版本,正好也是1.1.0f。然后将源码包解压后查阅其中的README,然后发现结合系统环境(CentOS6.9)还需要阅读NOTE.PERL。待全部读过之后,再开始openssl的升级工作。
升级前查看系统现有openssl版本:

[root@server1 ~]# openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Wed Mar 22 21:43:28 UTC 2017
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  dynamic
[root@server1 ~]# rpm -qa | grep openssl
openssl-devel-1.0.1e-57.el6.x86_64
openssl-1.0.1e-57.el6.x86_64    

openssl升级步骤:

rpm -qa | grep perl                #openssl的安装依赖于perl运行环境,并且还需要perl-core包
rpm -qa | grep perl-core  
yum install perl-core -y         #如果系统中没有安装则yum安装之  

perl -MCPAN -e shell            #进入perl的shell命令行模式
shell>install YAML   #perl shell中执行install YAML,shell>是提示符,perl安装其它模块时需要用到YAML,一路回车完成YAML的安装
quit        #退出perl shell模式
cpan -f -i Text::Template    #bash中输入此命令,安装perl的Text::Template模块
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz  #下载openssl1.1.0f的源码包
./config --prefix=/usr/local/openssl-1.1.0f   #编译openssl,此处我只指定了新的openssl将要安装的位置
make
make install  #安装编译好的openssl到指定的位置  
mv /usr/bin/openssl /usr/bin/openssl.old        #备份系统原有openssl程序
mv /usr/include/openssl /usr/include/openssl.old    #备份系统原有openssl头文件,安装了openssl-devel后才会有
ln -s /usr/local/openssl-1.1.0f/bin/openssl /usr/bin/openssl  #将新版本的openssl执行文件链接至原openssl程序位置  
ln -s /usr/local/openssl-1.1.0f/include/openssl /usr/include/openssl #替换掉原来的openssl头文件
echo "/usr/local/openssl-1.1.0f/lib/" >> /etc/ld.so.conf    #将新的openssl库文件位置添加到库文件搜索配置文件中  
ldconfig -v    #手动更新系统的动态链接库,不更新的话,新安装的openssl库文件会找不到,进而无法使用新版本的openssl指令  
cd /usr/local/openssl-1.1.0f/share/man
cp man1/* /usr/share/man/man1/
cp man3/* /usr/share/man/man3/
cp man5/* /usr/share/man/man5/
cp man7/* /usr/share/man/man7/   #将新版本openssl的全部man手册放置到系统默认位置,这样使用man指令就可查看  

openssl版本验证

[root@server1 openssl-1.1.0f]# openssl version -a
OpenSSL 1.1.0f  25 May 2017     #版本显示正确,openssl升级完成
built on: reproducible build, date unspecified
platform: linux-x86_64
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/local/openssl-1.1.0f/ssl\"" -DENGINESDIR="\"/usr/local/openssl-1.1.0f/lib/engines-1.1\""  -Wa,--noexecstack
OPENSSLDIR: "/usr/local/openssl-1.1.0f/ssl"
ENGINESDIR: "/usr/local/openssl-1.1.0f/lib/engines-1.1"

注意
升级完openssl后,系统中的应用软件如nginx,mysql,curl,wget,cobbler,yum等,如果要使用新版本的openssl都需要关联新的openssl库文件进行重新编译。不然只是继续使用旧版本的openssl库文件。

3.2 升级openssh

  • 查看现有openssh及其调用的openssl版本:
[root@server1 ~]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
  • 启用telnet-server
    启用telnet-server一是为了借助telnet通道完成openssh的升级,二是防止ssh升级失败或者配置不当导致无法ssh连接服务器。
yum install telnet telnet-server -y
sed -i 's/yes/no/g' /etc/xinetd.d/telnet
service xinetd start 
 #如果启用了iptables记得允许从外部连接telnet端口 
iptables -t filter -I INPUT 1 -p tcp -m state --state NEW --dport 23 -j ACCEPT 
  • 使用非root用户telnet登录上服务器
  • 卸载系统自带的openssh软件包组
rpm -qa | grep openssh | xargs -i{} rpm -e --nodeps {}
  • 下载openssh源码及openssl补丁文件
wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.5p1.tar.gz
wget http://www.linuxfromscratch.org/patches/blfs/svn/openssh-7.5p1-openssl-1.1.0-1.patch
  • 删除原系统中的sshd账户及组并设定组ID为50 (GID实际操作中按需调整)
userdel -r sshd
grep 50 /etc/group  #系统中gid 50为ftp所占用,如果不使用ftp组可以将其删除  
userdel -r ftp  #ftp组因默认只有ftp一个用户,group ftp会一并删除
  • 创建新的sshd用户及组
install  -v -m700 -d /var/lib/sshd &&
chown    -v root:sys /var/lib/sshd &&
groupadd -g 50 sshd        &&
useradd  -c 'sshd PrivSep' \
         -d /var/lib/sshd  \
         -g sshd           \
         -s /bin/false     \
         -u 50 sshd
  • 解压openssh源码包
tar zxf openssh-7.5p1.tar.gz
cd openssh-7.5p1
  • 给openssh源码包打上openssl-1.1.0的补丁包
patch -Np1 -i ../openssh-7.5p1-openssl-1.1.0-1.patch  #注意此时工作目 
 录是在openssh的解压后的源码包下,patch是放在它的上一层目录中, 
 所以其路径用了“.."表示上一层目录
[root@server1 openssh-7.5p1]# patch -Np1 -i ../openssh-7.5p1-openssl-1.1.0-1.patch
patching file auth-pam.c
patching file cipher-3des1.c
patching file cipher-bf1.c
patching file cipher.c
patching file cipher.h
patching file dh.c
patching file dh.h
patching file digest-openssl.c
patching file kexdhc.c
patching file kexdhs.c
patching file kexgexc.c
patching file kexgexs.c
patching file monitor.c
patching file openbsd-compat/openssl-compat.c
patching file regress/unittests/sshkey/test_file.c
patching file regress/unittests/sshkey/test_sshkey.c
patching file rsa.c
patching file ssh-dss.c
patching file ssh-ecdsa.c
patching file ssh-keygen.c
patching file ssh-pkcs11-client.c
patching file ssh-pkcs11.c
patching file ssh-rsa.c
patching file sshkey.c  
#执行patch指令后显示如上内容即表示补丁添加正常
  • 编译openssh
    可以指定ssh执行文件、配置文件、sftp-server、文档文件(包含man文件)安装的位置,以及指定要使用的openssl库文件的位置。参数如下:
./configure --prefix=/usr/local/openssh-7.5p1 --exec-prefix=/usr \
--libexecdir=/usr/libexec/openssh-7.5p1 --datarootdir=/usr/share \
--sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-selinux \
 --with-privsep-path=/var/lib/sshd --with-ssl-dir=/usr/local/openssl-1.1.0f

openssh7.5默认不再继续支持ssh1,如果要使用ssh1,需要在上面的添加--with-ssh1参数。上面的参数我还启用了pam和selinux,以及md5-password支持。同时ssh的指令放置位置和配置文件放置位置都和系统原openssh路径保持一致。
configure完成以后的汇总和提示信息:

OpenSSH has been configured with the following options:
                     User binaries: /usr/bin
                   System binaries: /usr/sbin
               Configuration files: /etc/ssh
                   Askpass program: /usr/libexec/openssh-7.5p1/ssh-askpass
                      Manual pages: /usr/share/man/manX
                          PID file: /var/run
  Privilege separation chroot path: /var/lib/sshd
            sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin
                    Manpage format: doc
                       PAM support: yes
                   OSF SIA support: no
                 KerberosV support: no
                   SELinux support: yes
                 Smartcard support: 
                     S/KEY support: no
              MD5 password support: yes
                   libedit support: no
                   libldns support: no
  Solaris process contract support: no
           Solaris project support: no
         Solaris privilege support: no
       IP address in $DISPLAY hack: no
           Translate v4 in v6 hack: yes
                  BSD Auth support: no
              Random number source: OpenSSL internal ONLY
             Privsep sandbox style: rlimit

              Host: x86_64-pc-linux-gnu
          Compiler: gcc
    Compiler flags: -g -O2 -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wno-pointer-sign -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-all -fPIE 
Preprocessor flags: -I/usr/local/openssl-1.1.0f/include  -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE
      Linker flags: -L/usr/local/openssl-1.1.0f/lib  -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-all -pie
         Libraries: -lcrypto -lrt -ldl -lutil -lz  -lcrypt -lresolv
         +for sshd:  -lpam -lselinux
          +for ssh:  -lselinux

PAM is enabled. You may need to install a PAM control file 
for sshd, otherwise password authentication may fail. 
Example PAM control files can be found in the contrib/ 
subdirectory
  • 安装openssh及相关程序和文档
make install &&
install -v -m755    contrib/ssh-copy-id /usr/bin     && 
install -v -m644    contrib/ssh-copy-id.1 \
                    /usr/share/man/man1              &&
install -v -m755 -d /usr/share/doc/openssh-7.5p1     &&
install -v -m644    INSTALL LICENCE OVERVIEW README* \
                    /usr/share/doc/openssh-7.5p1

默认make install不会安装ssh-copy-id及其man手册文件,所以在这通过install指令特别安装。

  • 验证openssh版本
[root@server1 redhat]# ssh -V
OpenSSH_7.5p1, OpenSSL 1.1.0f  25 May 2017

查看openssh版本是否为7.5p1同时调用的是openssl 1.1.0f。

  • 安装sshd服务并设置开机自启
    在编译openssh源码包时就会根据提供的参数生成符合实际情况的service启动脚本(主要是程序路径与系统安装路径一致)。
cd contrib/redhat/
cp sshd.init /etc/init.d/sshd
chkconfig --add sshd
chkconfig --list sshd
  • 修改sshd配置文件并启动sshd服务
    7.5中默认禁止root以密码方式登录但可以密钥登录,默认设置UseDNS no。根据实际需要修改sshd配置文件(/etc/ssh/sshd_config)。确认sshd配置无误后启动sshd服务。
service sshd start
  • 连接ssh服务端
    通过ssh登录服务器,确认sshd服务使用正常后,卸载telnet-server,关闭23端口,停用xinetd服务。

4. 写在最后

至此openssh的升级完成,对于openssh的漏洞防范不止于软件版本的升级,其sshd_config配置也非常重要,可以结合man sshd_config学习它的使用,并结合iptables设置严格的openssh使用策略,并做好相应的监控工作(登录用户,登录日志)才行。

注意

在编译的过程中,我启用了SElinux和PAM支持,如果没有配置针对SSH的PAM和SElinux策略,建议关闭SELinux,否则即使保持配置文件sshd_config中默认的UsePAM为no,启用PasswordAuthentication yes,也无法使用密码通过ssh登录。始终提示Permission denied, please try again.但密码其实输入的是正确的。
参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容