zoukankan      html  css  js  c++  java
  • CentOS 升级 openSSH+ sh脚本自动运维

     升级前后对比

      openSSH作为linux远程连接工具,容易受到攻击,必须更新版本来解决,低版本有如下等漏洞:

     

               OpenSSH 远程代码执行漏洞(CVE-2016-10009)

                    OpenSSH auth_password函数拒绝服务漏洞(CVE-2016-6515)

                    OpenSSH 远程代码执行漏洞(CVE-2016-10009)

    升级前漏洞扫描和openSHH版本:

     

     

    升级后漏洞扫描和openSHH版本:

     

     

     

    主机系统centos7.3.1161升级openssh到当前最新版7.7p1以后使用root用户无法登陆,一直提示用户名密码错误(实际上用户名密码是对的)。下面对这个坑进行说明。

    step 1 、升级前提说明:

    1、升级OpenSSH后,原有公钥失效,信任关系需要重新配置;
    2、升级过程需要停止sshd服务,会导致sshsftp无法使用;
    3、升级OpenSSH影响的业务有:QDG同步、Mediation及现场自己写的同步脚本等;
    4、升级需要关闭防火墙服务;
    5、升级需要关闭selinux服务;
    6、升级前需要开启telnet,防止升级失败,系统无法登录,对应的防火墙需要开启23端口,安装需要telnet相关包(推荐通过系统ISO安装)
    7、升级过程中需要刷新lib库:ldconfig -v
    8、升级顺序:顺序是zlib-> openssl -> openssh

    9、升级需要gccmakeperlzlibzlib-develpampam-devel

    step 2 、版本升级说明

    zlib-1.2.3 > zlib-1.2.11
    OpenSSL 1.0.1e > OpenSSL 1.0.2o

    OpenSSH 5.3p1 > OpenSSH 7.7p1

    step 3开启telnet(或者安装vnc

    一、开启telnet

    临时开启telnet服务,用于升级ssh,同时方总升级ssh过程中主机无法登录。

    1、挂载操作系统镜像

    2、安装ftp所需系统包

    yum -y install xinetd telnet telnet-server

    3、允许root用户通过telnet登陆:

    编辑/etc/pam.d/login,注释掉下面这行

    vi /etc/pam.d/login

    #auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so

    4、配置/etc/securetty

      先备份/etc/securetty文件:

    cp /etc/securetty /etc/securetty.bak

           

      再配置

    vi /etc/securetty

      添加超级用户登陆设备。

      添加超级用户登陆设备至/etc/securetty文件:

    echo "pts/1" >> /etc/securetty
    echo "pts/2" >> /etc/securetty
    echo "pts/3" >> /etc/securetty
    echo "pts/4" >> /etc/securetty
    echo "pts/5" >> /etc/securetty
    echo "pts/6" >> /etc/securetty

    echo "pts/7" >> /etc/securetty

    echo "pts/8" >> /etc/securetty

    echo "pts/9" >> /etc/securetty
    echo "pts/10" >> /etc/securetty

    echo "pts/11" >> /etc/securetty

     

    5、开启root用户远程登陆

      编辑/etc/pam.d/remote,注释下列这行

    vi /etc/pam.d/remote

    #auth required pam_securetty.so

    6、重启telnetxinetd服务【telnet服务依赖于xinetd服务】

     

    systemctl start telnet.socket

    systemctl start xinetd

    PS:如果开启了防火墙,需要将23端口(系统默认23telnet端口)添加到防火墙允许的端口的列表中。

    7、开启telnetxinetd开机自动启动

    systemctl enable xinetd.service

    systemctl enable telnet.socket

    8、验证开机启动

    systemctl list-unit-files |grep telnet

    systemctl list-unit-files |grep xinetd

    9、验证

    telnet xxx.xxx.xx.xx

     

     

    二、安装vnc

    参考https://www.cnblogs.com/kevingrace/p/5821450.html,根据自己的需要进行选择性操作,如果做了防火墙,会拦截vnc服务或端口,我这里是直接安装,在检验的时候,才去设置防火墙:

     

    1)安装vnc:


       yum update
       yum groupinstall "GNOME Desktop" "X Window System" "Desktop" 
       yum install tigervnc-server tigervnc vnc vnc-server

     

    2)配置vnc连接

    配置服务:


      cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service


    修改服务:

      vi /etc/systemd/system/vncserver@:1.service 


    找到这一行
      ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
      PIDFile=/home/<USER>/.vnc/%H%i.pid

     

    这里直接用root 用户登录为例,(其他用户同理)

      进入编辑模式:

      i

      修改为:
        ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
        PIDFile=/root/.vnc/%H%i.pid

      退出保存:

        Esc+:+wq

     

    VNC设密码(比如密码设置为123456
      vncpasswd

      123456

      123456

     

    重加载 systemd


      systemctl daemon-reload

     

    启动vnc


      systemctl enable vncserver@:1.service

      systemctl start vncserver@:1.service

     

    3)检查vnc连接

     

    1】通过端口检查

    lsof -i:5901

     

    2】进程检查

    ps -ef | grep Xvnc

     

    3】服务检查

    systemctl status vncserver@:1.service

     

     

    4】桌面VNC_Viewer连接测试:在两个互通的主机之间测试

     

    前面三个检查都正常,但是在VNC_Viewer连接不上:很可能是防火墙的问题,现在就需要去设置防火墙(iptables或firewalld)了:

     

    1)iptables设置端口白名单:

    vi /etc/sysconfig/iptables

    -A INPUT -p tcp -m tcp --dport 5901 -j ACCEPT

    service iptables restart

     

     

    2)关闭firewalld:

    systemctl status firewalld

    systemctl stop firewalld

     

     

     

     

    配置之后即可进行登录

     

     

     

    登录之后,打开终端,即可进行操作(与CRT 、Xshell类似):

     

     

     

     

     

     

    step 4、安装包准备

    1、软件包下载地址:

    zlib-1.2.11.tar.gz

     

    http://www.zlib.net/

     

    openssl-1.0.2o.tar.gz

    https://www.openssl.org/source/

     

    openssh-7.7p1.tar.gz

    https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/

     

    2、创建上传目录

    mkdir -p /soft/zlib

    mkdir -p /soft/openssl

    mkdir -p /soft/openssh

    3、上传下载的安装包

    step 5、关闭防火墙和selinux

    systemctl status firewalld.service

    检查防火墙状态,如果在运行停掉。

    systemctl stop firewalld.service

    关闭开机自启动

    systemctl disable firewalld

    step 6、验证selinux是否关闭

    检查是否关闭:

    getenforce

    如果未关闭,关闭之

    setenforce 0

    getenforce

     

    上面只是临时关闭了,重启后不生效。下面改配置文件,使永久生效。

      vi /etc/selinux/config

    修改:

      SELINUX=disabled

    保存退出。

     

     

    step 7、安装openssh升级依赖包

    检查相关依赖包是否安装

    rpm -qa | egrep "gcc|make|perl|zlib|zlib-devel|pam|pam-devel"

     

    我们这里看到是有的,如果没有则安装

    yum -y install gcc make perl zlib zlib-devel pam pam-devel

    step 8、正式开始升级openssh

    PStelnet登录操作,升级顺序:zlib-> openssl -> openssh

    1停止sshd服务

    检查

    systemctl is-active sshd

    停止

    systemctl stop sshd

    检查

    systemctl is-active sshd

     

    停止之后,无法用ssh维护了,可以通过vnc或者telnet维护

     

     

    2卸载系统里原有Openssh

    查看系统原有openssh

    rpm -qa | grep openssh

    根据上面查询出的结果,卸载系统里原有Openssh

    rpm -e --nodeps 'rpm -qa | grep openssh'

     

    验证

    rpm -qa | grep openssh

     

    3、编译安装zlib

    解压安装zlib

    cd /soft/zlib

    tar -xzvf zlib-1.2.11.tar.gz

    cd zlib-1.2.11

    ./configure --prefix=/usr/local/zlib

    make

    make test

    make install

    验证zlib安装是否成功

    ll /usr/local/zlib

    要包含includelibshare上个目录。

     

    新建并编辑配置文件

    vi /etc/ld.so.conf.d/zlib.conf

    加入如下内容后保存退出

    /usr/local/zlib/lib

    刷新库文件,加载刚才编译安装的zlib生成的库文件

    ldconfig -v

    4升级OpenSSL

    进入安装包路径

    cd /soft/openssl

    解压安装openssl

    tar -xzvf openssl-1.0.2o.tar.gz

    编译openssl

    cd openssl-1.0.2o

    ./config shared zlib

    make

    make test

    make install

    重命名现有文件目录

    mv /usr/bin/openssl /usr/bin/openssl.bak

    创建ssl相关软连接

    ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

    ln -s /usr/local/ssl/include/openssl /usr/include/openssl

    编辑配置文件

    vi /etc/ld.so.conf.d/ssl.conf

    加入如下内容后保存退出

    /usr/local/ssl/lib

    刷新库文件,加载刚才编译安装的ssl生成的库文件

    ldconfig -v

    查看openssl版本

    openssl version -a

     

    5、升级OpenSSH

    重命名原有配置文件

    mv /etc/ssh /etc/ssh.bak

    安装openssh

    cd /soft/openssh

    tar -xzvf openssh-7.7p1.tar.gz

    cd openssh-7.7p1

    ./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl --mandir=/usr/share/man --with-zlib=/usr/local/zlib

    make

    make install

     

    6验证openssh版本

    (没启动)升级后

    /usr/local/openssh/bin/ssh -V

     

     

    7设置sshd服务开机自动启动

    拷贝配置文件

    cp /soft/openssh/openssh-7.7p1/contrib/redhat/sshd.init /etc/init.d/sshd

     

    给sshd的配置文件执行权限

    chmod u+x /etc/init.d/sshd

    添加sshd服务

    chkconfig --add sshd

    验证开机启动

    chkconfig --list|grep sshd

     

     

    8、设置 ssh -V验证码版本

    替换配置文件

    cp /soft/openssh/openssh-7.7p1/sshd_config /etc/ssh/sshd_config

    配置sshd_config文件

    subsystem sftp路径变更为实际路径/usr/local/openssh/libexec/sftp-server

    vi /etc/ssh/sshd_config

    #Subsystem      sftp    /usr/libexec/sftp-server

    注释掉,换为如下一句:

    Subsystem      sftp   /usr/local/openssh/libexec/sftp-server

     

     

    拷贝命令

    cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd

    sshd命令至/usr/bin/

    cp /usr/local/openssh/bin/ssh /usr/bin/

    检查版ssh

    ssh -V

     

    9、密码认证和允许root用户远程直接登录

    拷贝ssh-keygen

    cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen

    修改配置文件/etc/ssh/sshd_config

    vi /etc/ssh/sshd_config

    #PasswordAuthentication yes 行取消注释

    PasswordAuthentication yes

    并下面添加

    PermitRootLogin yes

     

     

     

    PS:如果不允许root用户远程直接登录,这里配置为PermitRootLogin no

    10重启sshd服务

    启动

    service sshd restart

     

    11、验证sshd是否有效

    1)验证服务

    systemctl is-active sshd

    启动后

     

    启动前

     

    2查看22端口监听

    netstat -an |grep LISTEN|grep :22

    启动前

     

    启动后

     

    3)直接CRT登录

    启动前

     

    启动后

     

     

    4)互通之前跳转

    启动前,无法用ssh维护了,可以通过vnc或者telnet维护

     

    启动后

     

    5本地登录测试

    ssh root@localhost

     

     

     

     

    1】Root用户

    [root@localhost openssh-7.7p1]# ssh root@localhost

    The authenticity of host '192.***.43.211 (192.**8.**.211)' can't be established.

    ECDSA key fingerprint is SHA256:ri3JqvmpBItq8Ezz03Tzsom4oHs40pdsPLb+X9KyvMY.

    Are you sure you want to continue connecting (yes/no)? yes

    Warning: Permanently added '192.**8.**.211' (ECDSA) to the list of known hosts.

    root@192.168.43.211's password:

    Last login: Sat Aug  4 05:19:42 2018 from ::ffff:192.**8.**.212

     

    使用root用户登录,正常,则成功报错(一次性通过,未遇到报错,报错的请自己验证),

    【2】普通用户

    root@ocsdb1[/data/openssh]#ssh wufan@ocsdb1
    wufan@ocsdb1's password: 
    Last login: Sat May 19 12:24:33 2018 from 192.**8.**.211

    wufan@ocsdb1[/home/wufan]$

    是可以的。

    下面修改:

    vi /etc/init.d/sshd

    $SSHD $OPTIONS && success || failure这句话前面加一句:

    OPTIONS="-f /etc/ssh/sshd_config"

    配置如下:

    1. echo -n $"Starting $prog:"
    2. OPTIONS="-f /etc/ssh/sshd_config"
    3. $SSHD $OPTIONS && success || failure
    4. RETVAL=$?

    保存退出。

    重启sshd服务:

    systemctl restart sshd

    再次登录就可以了。

    写sh脚本,自动升级

    新建脚本update_openssh.sh,加上以下内容,后面直接执行此脚本,即可。

    注意:脚本里面指定了版本,你可以更改一下想要升级的版本,还有就是可能你的系统目录不一样,自己可以相应改一下,建议先在本地测试一下,线上系统不要轻易尝试,升级前需要开启telnet,防止升级失败,系统无法登录,对应的防火墙需要开启telnet的端口

    #!/bin/bash
    ##2019 03 12 15:45:55
    ###判断是否需要安装wget###
    WGET=`rpm -qa | grep wget`
    if [$WGET -z ];then
        yum install -y wget
    fi
    ###准备参数###
    file=/soft
    zlib=http://www.zlib.net/zlib-1.2.11.tar.gz
    openssl=https://www.openssl.org/source/openssl-1.0.2s.tar.gz
    openssh=https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz
    ###创建目录###
    mkdir -p $file/zlib
    mkdir -p $file/openssl
    mkdir -p $file/openssh
    ###下载安装包###
    cd $file
    wget $zlib
    wget $openssl
    wget $openssh
    ###安装相关依赖包###
    yum install -y gcc make perl zlib zlib-devel pam pam-devel
    ###解压并进入到相关目录###
    tar -xzf zlib*.tar.gz -C $file/zlib
    tar -xzf openssl*.tar.gz -C $file/openssl
    tar -xzf openssh*.tar.gz -C $file/openssh
    ###停止ssh服务,并卸载原有的openssh###
    systemctl stop sshd
    systemctl is-active sshd
    rpm -e --nodeps `rpm -qa | grep openssh`
    ###安装zlib###
    cd $file/zlib/zlib*
    ./configure --prefix=/usr/local/zlib
    make 
    make test 
    make install 
    echo '/usr/local/zlib/lib' >> /etc/ld.so.conf.d/zlib.conf
    ldconfig -v
    ###安装opensshl###
    cd $file/openssl/openssl*
    ./config shared zlib
    make
    make test
    make install
    mv /usr/bin/openssl /usr/bin/openssl.bak
    ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
    ln -s /usr/local/ssl/include/openssl /usr/include/openssl
    echo '/usr/local/ssl/lib' >> /etc/ld.so.conf.d/ssl.conf
    ldconfig -v
    openssl version -a
    ###升级openssh###
    mv /etc/ssh /etc/ssh.bak
    cd $file/openssh/openssh*
    ./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl --mandir=/usr/share/man --with-zlib=/usr/local/zlib
    make
    make install
    /usr/local/openssh/bin/ssh -V
    cp /soft/openssh/openssh*/contrib/redhat/sshd.init /etc/init.d/sshd
    chmod u+x /etc/init.d/sshd
    chkconfig --add sshd
    chkconfig --list|grep sshd
    cp /soft/openssh/openssh*/sshd_config /etc/ssh/sshd_config
    sed -i 's/Subsystem/#Subsystem/g' /etc/ssh/sshd_config
    echo 'Subsystem sftp /usr/local/openssh/libexec/sftp-server'>> /etc/ssh/sshd_config
    cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
    cp /usr/local/openssh/bin/ssh /usr/bin/
    ssh -V
    cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/g' /etc/ssh/sshd_config
    echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
    service sshd restart
    systemctl is-active sshd
  • 相关阅读:
    第10组 Beta冲刺 (3/5)
    第10组 Beta冲刺 (2/5)
    第10组 Beta冲刺 (1/5)
    第10组 Alpha冲刺 (3/6)
    第10组 Alpha冲刺 (2/6)
    第10组 Alpha冲刺 (1/6)
    第一次作业
    第二次作业
    机器学习_第一次个人作业
    软工实践个人总结
  • 原文地址:https://www.cnblogs.com/yybrhr/p/9682129.html
Copyright © 2011-2022 走看看