球baba的欢乐时光

vuePress-theme-reco 球baba    2020 - 2025
球baba的欢乐时光 球baba的欢乐时光

Choose mode

  • dark
  • auto
  • light
Home
Category
  • 伪技术宅
Tag
TimeLine
Contact
  • reco_luan大大的NPM
  • reco_luan大大的GitHub
author-avatar

球baba

27

文章

58

标签

Home
Category
  • 伪技术宅
Tag
TimeLine
Contact
  • reco_luan大大的NPM
  • reco_luan大大的GitHub
  • sftp服务端fingerprint发生变化后客户端连接时自动更新known_hosts

    • lftp
      • ssh/sftp/scp
        • 修改shell脚本
        • 修改脚本所在用户的ssh连接配置
        • 修改系统ssh连接配置

    sftp服务端fingerprint发生变化后客户端连接时自动更新known_hosts

    vuePress-theme-reco 球baba    2020 - 2025

    sftp服务端fingerprint发生变化后客户端连接时自动更新known_hosts


    球baba 2023-04-22 20:28:00 ssh lftp StrictHostKeyChecking UserKnownHostsFile

    最近在做sftp服务端改造时发现一个情况,从单机改造为通过keepalived实现的双机应用时,客户端通过shell脚本中的lftp命令来连接服务时,如果keepalived的vip发生过漂移就会连接失败。

    排查后发现是因为shell脚本所在用户的 ~/.ssh/known_hosts 中所记录的服务器信息与vip漂移后的主机不一致,导致连接失败。

    解决方法最简单的是把vip漂一下,分别记录下来后,合并到known_hosts中,但万一下次还要做迁移岂不是还要再手工配置一遍?

    那最佳的方案应该是在进行sftp连接时,如果服务端的fingerprint发生变化后,能够自动更新。

    从安全角度来说,不推荐自动更新公网服务端的fingerprint

    看了这两篇文章《ssh StrictHostKeyChecking》 、《Auto accept rsa key fingerprint from command line》 ,再加上测试,有以下发现

    openssh的版本不同,StrictHostKeyChecking=accept-new的作用是不同的(注:从7.6版本开始才有accept-new)

    在7.8p1版本上,当known_hosts中没该机器信息时,accept-new可以接收新的fingerprint,但当fingerprint改造时,就会报错无法连接

    在9.0p1版本上,accept-new对于无fingerprint或fingerprint改变都可以适用

    所以除了StrictHostKeyChecking外还需要配置UserKnownHostsFile

    # lftp

    在lftp全局配置文件中添加ssh连接参数

    echo "set sftp:connect-program 'ssh -a -x -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null'" >> /etc/lftp.conf
    
    1

    # ssh/sftp/scp

    # 修改shell脚本

    手工对脚本中的ssh/sftp/scp命令添加 -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null

    ssh -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null username@ip
    scp -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null source destination
    sftp -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null username@ip
    
    1
    2
    3

    # 修改脚本所在用户的ssh连接配置

    echo "Host *" >> ~/.ssh/config
    echo "  StrictHostKeyChecking no" >> ~/.ssh/config
    echo "  UserKnownHostsFile /dev/null" >> ~/.ssh/config
    
    1
    2
    3

    # 修改系统ssh连接配置

    echo "Host *" >> /etc/ssh/ssh_config
    echo "  StrictHostKeyChecking no" >> /etc/ssh/ssh_config
    echo "  UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
    
    1
    2
    3

    🌻🌻🌻