zoukankan      html  css  js  c++  java
  • CentOS 6.9 升级OpenSSH版本 关闭ssh服务后门

    最近用低版本的OpenSSH(5.9p1版本) 的漏洞给系统留了个后门 , 可以劫持root密码或者给root开启后门密码 : 利用Openssh后门 劫持root密码

    如果公司还在用CentOS6的系统 , 那肯定存在漏洞隐患 

    建议升级OpenSSH , 升级OpenSSH的操作并不复杂 ,但如果是线上环境 ,那么就需要谨慎操作 

    特别需要注意的是  如果是通过ssh远程连接服务器后进行的版本升级操作 ,万一升级失败了,则ssh就远程登录不上去了 当然 ,如果服务器安装了iDRAC远程管理卡就好说了,如果没有iDRAC远程管理卡,则需要提前开启telnet远程登录(允许root账号登录)或是到机房现场进行升级操作比较妥当

    centos7默认的是OpenSSH_7.4p1版本,可以不用升级,只需升级centos6.9的openssh版本即可

    OpenSSH_6.9 包括6.9在内和6.9之前的版本 , 都存在漏洞 , 登录被影响主机查看OpenSSH版本号,如在影响范围内,则对OpenSSH进行版本升级或更新

    #!/bin/bash
    #关闭iptables防火墙和selinux
    /etc/init.d/iptables stop
    /bin/sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
    /usr/sbin/setenforce 0
    #备份ssh原来配置
    cp -rf /etc/ssh /etc/ssh.bak
    #安装配置telnet,暂时允许root用户远程telnet,以防ssh升级后远程登录不了
    echo "Y"|/usr/bin/yum install telnet-server
    /bin/sed -i 's/= yes/= no/g' /etc/xinetd.d/telnet
    /etc/init.d/xinetd start
    /etc/init.d/xinetd restart
    mv /etc/securetty /etc/securetty.bak
    #安装配置新版本openssh
    echo "Y"|/usr/bin/yum install -y gcc openssl-devel pam-devel rpm-build
    cd /usr/local/src
    /usr/bin/wget https://fastly.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz
    /bin/tar -xf openssh-7.8p1.tar.gz
    cd /usr/local/src/openssh-7.8p1
    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords --with-tcp-wrappers
    make -j 4 && make install
    /bin/sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
    /bin/sed -i 's_#PermitRootLogin yes_PermitRootLogin yes_g' /etc/ssh/sshd_config
    sed -i '/^GSSAPICleanupCredentials/s/GSSAPICleanupCredentials yes/#GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config
    sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication yes/#GSSAPIAuthentication yes/' /etc/ssh/sshd_config
    sed -i '/^GSSAPIAuthentication/s/GSSAPIAuthentication no/#GSSAPIAuthentication no/' /etc/ssh/sshd_config
    service sshd start
    service sshd restart
    /usr/bin/ssh -V
    # 关闭telnet远程登录
    NUM=$(/usr/sbin/lsof -i:23|wc -l)
    if [ $NUM -ne 0 ];then
      mv /etc/securetty.bak /etc/securetty
    fi
    一键安装脚本

    查看版本

    # 查看系统版本 , 最小化安装可能会没有centos-release的软件包 , 可以用下面的命令查看
    [root@DaMoWang ~]# rpm -q centos-release
    centos-release-6-9.el6.12.3.x86_64
    [root@DaMoWang ~]# cat /etc/centos-release 
    CentOS release 6.9 (Final)
    [root@DaMoWang ~]# cat /etc/issue
    CentOS release 6.9 (Final)
    Kernel 
     on an m
    
    # 查看SSH版本 
    [root@DaMoWang ~]# ssh -V
    OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
    [root@DaMoWang ~]# ssh -V
    OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
    [root@DaMoWang ~]# 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:  rdrand dynamic 

    备份ssh目录

    [root@DaMoWang ~]# cp -rf /etc/ssh{,.bak}

    安装telnet , 避免ssh升级出现问题 ,导致无法远程管理

    [root@DaMoWang ~]# yum -y install telnet-server
    [root@DaMoWang ~]# vim /etc/xinetd.d/telnet
    # default: on
    # description: The telnet server serves telnet sessions; it uses 
    #       unencrypted username/password pairs for authentication.
    service telnet
    {
            flags           = REUSE
            socket_type     = stream
            wait            = no
            user            = root
            server          = /usr/sbin/in.telnetd
            log_on_failure  += USERID
            disable         = no    # 将默认的yes改为no , 否则telnet启动后,23端口就会起不来
    }

    重启telnet服务

    [root@DaMoWang ~]# /etc/init.d/xinetd restart
    停止 xinetd:                                              [确定]
    正在启动 xinetd:                                          [确定]
    # 查看服务是否开启
    [root@DaMoWang ~]# netstat -antup|grep 23
    tcp        0      0 :::23                       :::*                        LISTEN      2293/xinetd       

    如果是线上服务器 , 最好是添加防火墙策略 , 尽量不要关闭防火墙

    [root@DaMoWang ~]# iptables -I INPUT -p tcp --dport 23 -j ACCEPT
    [root@DaMoWang ~]# iptables -I INPUT -p udp --dport 23 -j ACCEPT
    # 临时关闭SElinux
    [root@DaMoWang ~]# getenforce 
    Enforcing
    [root@DaMoWang ~]# setenforce 0

    虽然把23端口放行了 , 但是linux默认是不允许root用户以telnet的方式登录linux主机的 , 如果要用root用户登录 , 那么可用以下方法实现

    # 修改securetty文件 增加pts配置 如果登录用户较多,需要更多的pts/*
    [root@DaMoWang ~]# vim /etc/securetty 
    
    # 或者直接删除或修改文件名 , 避开验证规则实现root用户远程登录
    [root@DaMoWang ~]# rm -f /etc/securetty 

    测试远程登录root用户

    [root@test ~]# hostname -I
    192.168.94.11 
    [root@test ~]# telnet 192.168.94.66
    Trying 192.168.94.66...
    Connected to 192.168.94.66.
    Escape character is '^]'.
    CentOS release 6.9 (Final)
    Kernel 2.6.32-696.el6.x86_64 on an x86_64
    DaMoWang.localdomain login: root
    Password: 
    Last login: Mon Jun  4 22:52:19 from 192.168.94.1
    [root@DaMoWang ~]# hostname -I
    192.168.94.66
    一般不建议直接用root用户远程通过telnet登陆系统,因为telnet在数据传输过程采用明文方式,如果,数据包被人截获,将会很容易获取root用户的密码
    还是建议以普通用户通过telnet远程登陆,然后su到root,这样相对比较安全。如果非要用root用户远程连接,建议采用SSH
    如上操作后,就可以使用root账号进行telnet登录服务器了 OpenSSH升级后还需禁止root用户进行telnet登录
     
    安装高版本的OpenSSH的依赖包
    [root@DaMoWang ~]# yum -y install  gcc openssl-devel pam-devel rpm-build tcp_wrappers-devel

    下载高版本的OpenSSH 

    https://www.openssh.com/

    进到官网看到今天刚好更新7.8版本的源码包 , 就用最新版本的来最升级吧

    [root@DaMoWang src]# cd /usr/local/src/
    [root@DaMoWang src]# ll
    总用量 1512
    -rw-r--r--. 1 root root 1548026 8月  25 2018 openssh-7.8p1.tar.gz
    [root@DaMoWang src]# tar xf openssh-7.8p1.tar.gz 
    [root@DaMoWang src]# cd openssh-7.8p1
    [root@DaMoWang openssh-7.8p1]# ./configure --prefix=/usr 
     --sysconfdir=/etc/ssh 
     --with-pam 
     --with-zlib 
     --with-md5-passwords 
     --with-tcp-wrappers 
     && make -j 4 && make install

    有提示 , 看看是否安装成功

    /etc/ssh/ssh_config already exists, install will not overwrite
    /etc/ssh/sshd_config already exists, install will not overwrite
    /etc/ssh/moduli already exists, install will not overwrite
    ssh-keygen: generating new host keys: ECDSA ED25519 
    /usr/sbin/sshd -t -f /etc/ssh/sshd_config
    /etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
    /etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
    [root@DaMoWang openssh-7.8p1]# echo $?
    0

    修改配置文件,允许root登录

    [root@DaMoWang openssh-7.8p1]# sed -i '/^#PermitRootLogin/s/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
    [root@DaMoWang openssh-7.8p1]# grep RootLogin /etc/ssh/sshd_config
    PermitRootLogin yes

    重启SSH服务

    [root@DaMoWang openssh-7.8p1]# service sshd restart
    停止 sshd:                                                [确定]
    正在启动 sshd:/etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
    /etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
                                                               [确定]

    报错解决方 , 只需把提示错误的行注释掉即可

    再重启SSH服务

    [root@DaMoWang openssh-7.8p1]# service sshd restart
    停止 sshd:                                                [确定]
    正在启动 sshd:                                             [确定]
    [root@DaMoWang openssh-7.8p1]# service sshd status
    openssh-daemon (pid  12918) 正在运行...

    查看SSH服务版本

    [root@DaMoWang openssh-7.8p1]# ssh -V
    OpenSSH_7.8p1, OpenSSL 1.0.1e-fips 11 Feb 2013

    在升级SSH时你的SSH是不会因为升级或重启服务而断掉的

    注意 :

    OpenSSH升级后,一定要修改/etc/ssh/sshd_config的 PermitRootLogin no 改为 PermitRootLogin yes ,然后再重启OpenSSH服务
    否则,再另开一个终端窗口,使用root用户ssh登录该机器就会失败了,因为此时ssh已经禁止root用户登录了

    还有禁止DNS反向解析 , 修改端口号等细节需要注意

    SSH可以连接 , 在线升级成功

    [root@test ~]# ssh -p22 192.168.94.66
    The authenticity of host '192.168.94.66 (192.168.94.66)' can't be established.
    ECDSA key fingerprint is SHA256:/r5E0VYms6owRZhRXVckaVAgrT5eytIEUO7+D80rfbU.
    ECDSA key fingerprint is MD5:1a:0e:a2:82:a5:08:bc:ed:23:7b:f7:c3:47:f0:dd:3b.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.94.66' (ECDSA) to the list of known hosts.
    root@192.168.94.66's password: 
    Last login: Sat Aug 25 01:12:57 2018 from 192.168.94.66
    [root@DaMoWang ~]# hostname -I
    192.168.94.66 

    这是源码编译升级 , 如果主机使用update升级更新系统 , 那么OpenSSH的版本会回退默认版本

    顺便说一下 , 之前用CentOS7更换OpenSSH版本 , 有坑 , systemctl restart sshd 启动服务超时 , 服务启动失败 , 但是重启服务那短暂的时间 , 还是可以连接上ssh的 

    原因很多 , 根据自身实际情况来解决 

    升级成功后不能使用systemctl start sshd启动程序 : 

    1、编译安装时未启用某些功能支持导致使用旧配置文件无法启动sshd,如GSSAPIAuthentication、UsePrivilegeSeparation
    2、配置文件权限错误,导致无法启动,如:ssh_host_rsa_key、ssh_host_ecdsa_key、ssh_host_ed25519_key

    升级成功后输入密码无法登录系统 :

    1、未对配置文件进行修改,openssh7.5默认配置不允许使用root登录系统
    2、pam配置文件错误或丢失
    3、配置文件中未启用pam选项:UsePAM

    如果实在运行不了ssh服务 , 那么好 , 就利用那重启服务短暂的空隙 , 只需要让服务无限重启 , 保持ssh的进程即可 , 这个方法并不能解决实际问题 , 不过在没找到问题原因之前 , 可以暂时使用

    [root@test ~]# cat /etc/centos-release
    CentOS Linux release 7.5.1804 (Core) 
    [root@test ~]# vim /opt/restart-ssh.sh
    #/bin/bash
    ps -ef|grep "systemctl restart sshd"|awk '{print $2}'|xargs kill -9
    nohup systemctl restart sshd &
    # 服务启动超时 , 杀掉ssh进程 , 再重启ssh服务
    # 加到计划任务中 10秒执行一次
  • 相关阅读:
    微信登录
    Nginx负载均衡的优缺点
    elk 比较不错的博客
    Filebeat 5.x 日志收集器 安装和配置
    日志管理系统ELK6.2.3
    python3爬虫编码问题
    zabbix监控进程
    linux下查询进程占用的内存方法总结
    Ubuntu 16.04安装Elasticsearch,Logstash和Kibana(ELK)Filebeat
    ELK多种架构及优劣
  • 原文地址:https://www.cnblogs.com/bigdevilking/p/9532664.html
Copyright © 2011-2022 走看看