ssh 登录服务器的指纹如何获取、验证,以及除了中间人攻击外什么操作会改变服务器指纹?

事情由来:

登录自己的vps时提示REMOTE HOST IDENTIFICATION HAS CHANGED!
显示如下

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.
Please contact your system administrator.
Add correct host key in /Users/xx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/xx/.ssh/known_hosts:40
ECDSA host key for [xx.com] has changed and you have requested strict checking.
Host key verification failed.

提示有被中间人攻击的风险,那么除了被中间人攻击的情况下,还有那些变动会造成这样的变动?(ssh连接的加密方式变化了,比如我发现 known_hosts 文件中有的主机信息是 ssh-rsa 有的是 ecdsa-sha2-nistp256,那么软件升级会改变连接加密方式吗?我自己没有动过)

还有其中提到了指纹信息

The fingerprint for the ECDSA key sent by the remote host is
SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.

这种指纹信息在第一次ssh登录服务器的时候也会提示

The authenticity of host [xx.com] can't be established.
ECDSA key fingerprint is SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.
Are you sure you want to continue connecting (yes/no)?

那么这个指纹信息是要验证的,怎么验证?
(我猜有很大比例的人应该都会像安装软件下一步一样,并不清楚怎么对比,就直接信任了)

append:查找了一些资料,How to get ssh server fingerprint information,都提到了类似的内容,但是和上面显示的 fingerprint 不一样呀。

> ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 0d:df:2b:e4:ee:79:f2:98:ab:38:93:f3:44:1d:c5:4d  root@doceanm-xxx.localdomain (ECDSA)

那么他们之间的关系是什么?

还有生成私匙公钥的过程中也会提到一个指纹

> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xavier/.ssh/id_rsa): testxxx
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in testxxx.
Your public key has been saved in testxxx.pub.
The key fingerprint is:
SHA256:Bw1NuIXaa7h6tzCWDDOq0/esnqQiNJruFeNThfYffHY xavier@local
The key's randomart image is:
+---[RSA 2048]----+
|        .=.      |
|      . ooo      |
|     o +.o.      |
|    . + +.       |
|   o+. oS+.o E   |
| o..+=..+.+ .    |
|ooo+. *o .       |
|*.ooo+oo.        |
|==.o==o...       |
+----[SHA256]-----+
阅读 6.7k
评论
    4 个回答
    • 6.9k

    如何通过其他方式进入服务器,验证指纹,或者提前就获取指纹信息,进行比对?

    我就当你问的是两个问题。

    如何提前获取指纹信息进行比对?
    答:SSH客户端已经帮你做了,就是你贴出来的那些,比对不成功,默认拒绝让你继续登陆下去,防止你的密码(如果用的是密码)被伪造的服务端窃取。

    如何获取服务端真实的指纹?
    答:服务端的指纹默认存储在/etc/ssh/。
    从你给的信息来看,你的SSH客户端采用的是ECDSA密钥,就是/etc/ssh/ssh_host_ecdsa_key.pub的内容。
    但是你比对这个并没有什么用。

    clipboard.png

    原因很简单,中间人可以搞得到服务端的公钥,
    那么他也能把这个指纹存储在默认的位置,至于私钥,一般情况下你不会去验证一下他的私钥和公钥能不能配对,所以他随便伪造一个就行了。

    但是中间人没办法弄到私钥,他也就没办法解密你和服务端之间传输的数据。

    这里涉及到公约加密私钥解密公钥解密私钥加密这种非对称加密措施,具体不讲。

    换句话说,他搞到服务端的公钥,(即便能通过公钥)伪造了一个服务端,(虽然没有私钥也不能启动一个服务端,特殊情况另说),
    但是你发给服务端的数据需要服务端的私钥解密,也就是说,他没办法解密,没用。

    也就是说:

    只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。
    只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。
    只要第一次登陆成功,并且确认你登录的机器是自己的机器,那么后续遵循ssh客户端默认的安全策略,是绝对没有任何安全问题的。

    确认是自己的机器很简单,看看自己的文件是不是在就行了。

    评论区有人质疑整个机器被做了proxy,那么我还能提供一个方案:

    理论上第一次是绝对不安全的,但是没有绝对。
    看到私钥公钥总是提密码学、然后提到密钥加密就不好了。

    密钥加密本身就不安全,但是密钥本身也是一种妥协,密钥本身就是使用足够长的密钥进行加密,使得你破解成为一件很耗时间的事情(消耗数以年记的时间)。

    那么妥协一下就很简单了,

    很简单,即便他能劫持你cat ssh公钥的内容,能劫持vim打开,但是很难劫持你编辑这个文件,例如在文件开头加一个回车,例如在公钥中间加一个回车。

    也根本不能劫持你自己写脚本

    wget http://www.abidu.com/cat_key.sh
    bash cat_key.sh

    其中cat_key.sh的内容是 cat ssh_key.pub,或者cat_key.sh根本就是个二进制文件。

    评论区又提出公钥私钥直接被proxy替换。

    也很简单就能破解,安装机器必然通过安装脚本,安装脚本如何操作是个问题。

    1. bash不会实时记录操作,但是可以通过logger实时记录每一次操作。

    2. 定制系统日志,登陆后进行审计。

    能黑进路由器的黑客不是很多,有直接替换的能力的,是黑产/白帽行业的顶尖,国家机器、专业黑客团队和NSA,还能偷偷抹平操作记录的,就只剩NSA了。

    说这么多,还是比较麻烦,非得神经兮兮的怀疑的话,
    那就只能机器提供方提供公钥或者指纹了。

    一般情况下,
    服务端弱口令、密码爆破才是王道。
    那些黑客最喜欢用各种工具扫描弱密码了。
    安装一个denyhosts并启动,
    会默认屏蔽掉大部分的恶意ssh请求。

      • 4.4k

      服务器管理员将其告知使用者

        是的,无法保证。
        ssh协议如果要安全,需要你自己保证你第一次得到的指纹是真实的。

        需要使用另外的保证安全的方式获取。例如你购买了一个vps,那么商家应该在他的https网页上除了给出SSH连接方式,还要给出服务器的SSH指纹。这样就可以防止网络污染了。

        这是密码学基础。你无法在协商秘钥之前保证通信不被篡改。

          Checking ssh public key fingerprints

          在服务端显示fingerprint,用肉眼对比。

          cd /etc/ssh
          for file in *sa_key.pub
          do   ssh-keygen -lf $file
          done

          登陆显示信息

          ssh -o VisualHostKey=yes example.com

          https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Public_Key_Authentication#Downloading_keys

          ssh-keygen -l -f file 根据钥匙生成指纹信息
          ssh-keygen -l -E md5 -f file 指定 hash 的方式
          ssh-keyscan example.com 获取主机公钥信息 (就是保存在本地的~/.ssh/know_hosts文件中的内容)


          Retrieve the key:

          • download the key withssh-keyscan example.org > key.pub
          • or: find the keys on the server in/etc/ssh

          Generate the hash:

          • make sure you have only one line/type, so either delete all others inkey.pubor runssh-keyscan -t rsa example.org > key.pub
          • ssh-keygen -l -f key.pub(default hash, depending on OpenSSH version)
          • ssh-keygen -l -f key.pub -E md5(md5 on current OpenSSH)
          • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64(sha256 on old OpenSSH)
          • (You might need to start the line withawk '{print $3}'for newer versions of ssh-keyscan because the format changed)

          from:https://superuser.com/questions/929566/sha256-ssh-fingerprint-given-by-the-client-but-only-md5-fingerprint-known-for-se/929567#929567

            撰写回答

            登录后参与交流、获取后续更新提醒

            相似问题
            推荐文章