zoukankan      html  css  js  c++  java
  • CentOS7 OpenSSH编译安装升级

    一、概述

    生产环境经常会被扫到openssh漏洞,一般需要对openssh进行升级。

    二、升级准备

    2.1、安装telnet-server

    为防止openssh升级失败导致无法远程,可通安装telnet-server,登录telnet远程到主机

    #安装telnet-server
    yum install -y telnet-server
    
    #修改/etc/securetty,在最后添加
    vim /etc/securetty
    pts/0
    pts/1
    pts/2
    pts/3
    
    #启动telnet-server服务
    systemctl start telnet.socket
    
    #然后通过telnet尝试登录,登录成功后再进行下一步比较保险
    

    2.2、编译安装openssh

    (1) 如果原主机安装的openssh是通过rpm包安装的,需要先卸载

    systemctl stop sshd
    yum remove -y openssh
    

    (2) 下载openssh源码包

    wget -c https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz
    

    (3) 备份配置文件

    mv /etc/ssh /etc/ssh.bak
    

    (4) 编译安装openssh

    tar -xf openssh-8.1p1.tar.gz
    cd openssh-8.1p1
    
    #编译安装
    ./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh
    make && make install
    
    #说明:
    --prefix 指定安装目录,如果之前主机上的openssh是编译安装的,建议指定一个文件夹安装,如果之前主机上的openssh是rpm包安装的,rpm卸载后,建议将安装目录指定为/usr;不指定的话默认安装目录为/usr/local
    --sysconfdir 指定系统配置文件目录,建议使用/etc/ssh,记得提前备份;这里使用/etc/ssh是因为如果指定了安装目录,其编译后的ssh命令和sshd命令会默认在/etc/ssh目录找ssh_config和sshd_config配置文件,如果不指定这个选项而只指定--prefix选项,如 --prefix=/usr/local/openssh,其编译后的ssh命令和sshd命令运行时,会应用/usr/local/openssh/etc目录下的ssh_config和sshd_config配置文件
    #其它选项,根据需要选择
    --with-ssl-dir=/usr/bin/openssl 指定OpenSSL路径
    --with-pam 启用pam支持
    --with-md5-passwords 启用md5密码支持
    

    (4) 替换命令

    如果之前主机上的openssh是编译安装的(编译安装路径为/usr),则将原来的命令备份一下,然后将编译好的命令复制到相应文件夹

    #备份命令
    mv /usr/bin/ssh /usr/bin/ssh.bak
    mv /usr/sbin/sshd /usr/sbin/sshd.bak
    
    #拷贝命令
    cp /usr/local/openssh/bin/ssh /usr/bin/
    cp /usr/local/openssh/sbin/sshd /usr/sbin/
    

    如果之前主机上的openssh是rpm包安装的,卸载后,只需在第4步编译时指定--prefix=/usr进行编译安装即可,如果指定的为--prefix=/usr/local/openssh,则按以下操作

    cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
    echo 'export PATH=/usr/local/openssh/bin:$PATH' >> /etc/profile
    source /etc/profile
    

    (5) 修改sshd配置文件

    #新生成的sshd_config文件默认大部分配置都是注释的,需要添加以下配置
    vim /etc/ssh/sshd_config
    PermitRootLogin yes
    PasswordAuthentication yes
    PermitEmptyPasswords no
    UseDNS no
    

    (6) 启动sshd服务

    #备份启动脚本(如果有)
    mv /etc/init.d/sshd /etc/init.d/sshd.bak
    
    #准备脚本,源码包解压的目录openssh-8.1p1下
    cp contrib/redhat/sshd.init /etc/init.d/sshd
    
    #添加开机启动
    chkconfig --add sshd
    
    #启动服务
    /etc/init.d/sshd start
    
    #查看ssh配置
    ssh -V
    

    (7) 测试远程连接

    终端先不要关闭,另开一个终端测试远程连接,如果成功了则没什么大问题了,之后把telnet-server卸载

    #修改/etc/securetty,删除之前添加的四行
    vim /etc/securetty
    pts/0
    pts/1
    pts/2
    pts/3
    
    #卸载telnet-server
    systemctl stop telnet.socket
    yum remove -y telnet-server
    

    (8) 升级后,使用ssh客户端连接其它主机时,如果出现以下错误:

    Unable to negotiate with 192.168.80.17 port 22: no matching cipher found. Their offer: aes128-cbc

    则修改/etc/ssh/ssh_config文件

    #   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
    # 找到以上行的位置,在其下添加以下一行内容即可
        Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc
    

    (9) 小技巧

    生产环境有时怕出问题,不敢进行大的操作,可以在本地虚拟机上编译成功后,将ssh和sshd两个命令替换到生产环境,也能达到效果,也可在编译时指定--prefix=/usr,然后将编译后的相关目录命令全部替换到生产环境。

    #将/usr/local/openssh/bin/ssh和/usr/local/openssh/sbin/sshd上传至root家目录
    
    #备份
    mv /usr/sbin/sshd /usr/sbin/sshd.bak 
    mv /usr/bin/ssh /usr/bin/ssh.bak 
    
    #拷贝
    mv ssh /usr/bin/ssh 
    mv sshd /usr/sbin/sshd 
    
    #添加权限
    chmod +x /usr/sbin/sshd /usr/bin/ssh
    
    #重启sshd服务
    systemctl restart sshd
    
    #如果是指定--prefix=/usr,其安装的内容如下:
    /usr
    ├── bin
    │   ├── scp
    │   ├── sftp
    │   ├── ssh
    │   ├── ssh-add
    │   ├── ssh-agent
    │   ├── ssh-keygen
    │   └── ssh-keyscan
    ├── libexec
    │   ├── sftp-server
    │   ├── ssh-keysign
    │   └── ssh-pkcs11-helper
    ├── sbin
    │   └── sshd
    └── share
        └── man
            ├── man1
            │   ├── scp.1
            │   ├── sftp.1
            │   ├── ssh.1
            │   ├── ssh-add.1
            │   ├── ssh-agent.1
            │   ├── ssh-keygen.1
            │   └── ssh-keyscan.1
            ├── man5
            │   ├── moduli.5
            │   ├── ssh_config.5
            │   └── sshd_config.5
            └── man8
                ├── sftp-server.8
                ├── sshd.8
                ├── ssh-keysign.8
                └── ssh-pkcs11-helper.8
    
    #源码包中还有一个ssh-copy-id的命令,记得拷贝至/usr/bin目录
    cp contrib/ssh-copy-id /usr/bin/
    chmod +x /usr/bin/ssh-copy-id
    
  • 相关阅读:
    【LCA】BZOJ1832 & BZOJ1787(AHOI)-集会
    【线段树+离散化】POJ2528-Mayor's posters
    JavaScript Array 整理
    常见的原生javascript DOM操作
    javascript中执行环境和作用域(js高程)
    javascript作用域链
    javascript执行环境及作用域
    [转]深入javascript——原型链和继承
    [转]深入javascript——构造函数和原型对象
    Java接口中的成员变量为什么必须声明为public static final?
  • 原文地址:https://www.cnblogs.com/hovin/p/14777188.html
Copyright © 2011-2022 走看看