zoukankan      html  css  js  c++  java
  • SSH 协议的 ssh StrictHostKeyChecking

    项目的SFTP用到了这个参数:

      @Override
            public PooledObject<ChannelSftp> makeObject() throws Exception {
                JSch jsch = new JSch();
                Session session = null;
                ChannelSftp channelSftp = null;
                try {
                    session = jsch.getSession(config.user, config.serverIp, config.serverPort);
                    session.setPassword(config.pwd);
    
                    Properties sessionConfig = new Properties();
                    sessionConfig.put("StrictHostKeyChecking", "no");
                    session.setConfig(sessionConfig);
                    session.connect();
    
                    channelSftp = (ChannelSftp) session.openChannel("sftp");
                    channelSftp.connect();
                    channelSftp.cd(config.getFileDir());
    
                    return new DefaultPooledObject(channelSftp);
                } catch (Exception e) {
                    if (channelSftp != null) {
                        channelSftp.disconnect();
                    }
    
                    if (session != null) {
                        session.disconnect();
                    }
                    LOGGER.error("PoolingSFTPClient.makeObject error.(config:{})", config.toString(), e);
                    throw e;
                }
            }

    前言

    我们在写 shell 脚本的时候通常会需要用 ssh 登录到远程服务器执行一些命令。
    这个时候就懵逼了,我 ssh 直接执行过去了,怎么去应答这个询问啊。 这个时候就需要知道 ssh 有一个非交互方式登录 StrictHostKeyChecking

    主机公钥确认 StrictHostKeyChecking

    1. StrictHostKeyChecking=no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
    2. StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
    3. StrictHostKeyChecking=yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

    解法

    • 简洁方便型
    ssh -o StrictHostKeyChecking=no -i $rsaPath -p ${SERVER_PORT} ${SERVER} "
      cd ${DIR}
      rm -rf $files
      rm -rf ${zipName}"
    
    • 一劳永逸型
    # ~/.ssh/config 中添加如下信息
    Host *
      StrictHostKeyChecking no
    

    SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。

    首先看看什么是 SSH 公钥检查

    SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:

    The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
    RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
    Are you sure you want to continue connecting (yes/no)?
    

    当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 如果因为某种原因(服务器系统重装,服务器间IP地址交换,DHCP,虚拟机重建,中间人劫持),该IP地址的公钥改变了,当使用 SSH 连接的时候,会报错:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that the RSA host key has just been changed.
    The fingerprint for the RSA key sent by the remote host is
    e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
    Please contact your system administrator.
    Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message.
    Offending key in /home/jiangxin/.ssh/known_hosts:81
    RSA host key for 192.168.0.110 has changed and you have requested strict checking.
    Host key verification failed.
    

    上面的警告信息说的是:

    • 服务器公钥已经改变,新的公钥的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
    • 该服务器原来的公钥记录在文件 ~/.ssh/known_hosts 中第 81 行。

    如果确认不是中间人劫持,需要连接到该服务器,怎么办呢?最简单的就是用 vi 打开 ~/.ssh/known_hosts 文件,定位到 81 行,将该行删除。之后就可以使用 ssh 连接了。

    如何让连接新主机时,不进行公钥确认?

    在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于  ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:

    Host *
     StrictHostKeyChecking no
    

    或者在 ssh 命令行中用 -o 参数

    $ ssh  -o StrictHostKeyChecking=no  192.168.0.110

    如何防止远程主机公钥改变导致 SSH 连接失败

    当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,不就不会造成公钥冲突导致的中断了么?

    $ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110
    The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
    RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
    Are you sure you want to continue connecting (yes/no)?
    

    看,提示信息由公钥改变中断警告,变成了首次连接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,则不再有任何警告出现了:

    $ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110
    Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts.
    jiangxin@192.168.0.110's password:
    

    如果设置了无口令 SSH 登录(即通过客户端公钥认证),就可以直接连接到远程主机。这是基于 SSH 协议的自动化任务常用的手段。

    参考:ssh StrictHostKeyChecking

    参考:ssh StrictHostKeyChecking



  • 相关阅读:
    多线程
    ERP概念介绍
    Servlet生命周期
    springmvc工作流程
    spring事务管理的接口
    解决主从备份Slave_SQL_Running:No
    实现Mysql主从备份
    springboot集成mybatis进行开发
    SpringBoot 入门第一章
    Hibernate 关联关系映射
  • 原文地址:https://www.cnblogs.com/aspirant/p/10654041.html
Copyright © 2011-2022 走看看