SSH密码登录:防止中间人窜改公钥?消灭网络小三的办法!
ssh 密码登陆密码登录认证原理: client客户机向server发送登录请求,server服务器将自己的公钥发送给client(客户机)。 client使用这个公钥,将公钥进行加密,然后再发送给server。 server用私钥解密登录密码,验证合法性。 server返回验证结果为client。 这个流程中存有的一个问题,怎么保证收到的公钥就是目标server的公钥? 密码登录时需要注意:中间人攻击,所以如果一个攻击者中途拦截了client的登录请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息之后,用自己的私钥就可以进行解密了,这就窃取了client的登录信息了。 为了解决这个问题,client端第一次登录的时候,会进行一个登录公钥确认。 接下来讲:怎么防止中间人窜改 公钥
在SSH的密码登录认证过程中,确实存在中间人攻击的风险,即攻击者可能冒充服务器向客户端发送伪造的公钥。为了防止这种攻击,SSH提供了一些机制来验证服务器的公钥。
登录公钥确认通常指的是SSH客户端如何确认接收到的公钥确实是来自目标服务器的公钥。以下是该过程的详细描述:
首次连接时的公钥指纹确认:
当客户端首次尝试连接到服务器时,服务器会将其公钥发送给客户端。
客户端会显示这个公钥的指纹(通常是一个哈希值,如SHA-256指纹)。
客户端的用户(或管理员)需要通过某种方式(如先前从服务器管理员那里获得的指纹)来验证这个指纹是否正确。
如果指纹正确,用户可以选择接受这个公钥,并将其存储在客户端的
known_hosts文件中。这个文件通常位于用户的家目录下(例如,在Linux上是~/.ssh/known_hosts)。在未来的连接中,客户端会使用
known_hosts文件中的公钥来验证服务器的身份。后续连接的公钥验证:
当客户端再次尝试连接到服务器时,它会从
known_hosts文件中获取之前存储的公钥。服务器会再次发送其公钥给客户端。
客户端会将服务器发送的公钥与
known_hosts文件中的公钥进行比较。如果两个公钥匹配,则连接被认为是安全的,并且可以进行下一步的身份验证。
如果公钥不匹配,客户端会发出警告,并询问用户是否要继续连接。这通常是一个强烈的信号,表明可能存在中间人攻击。
防止中间人攻击的额外措施:
使用SSH密钥对(而不是密码)进行身份验证,可以提供更强的安全性,因为私钥在本地客户端上,不会被明文传输。
使用SSH密钥代理(如
ssh-agent)可以进一步保护私钥的安全性。在可能的情况下,使用SSH连接时,始终检查服务器的公钥指纹是否与预期的匹配。
使用SSH的严格主机密钥检查功能(
StrictHostKeyChecking)可以确保在公钥不匹配时自动拒绝连接。考虑使用SSH证书或SSH密钥认证代理(如
ssh-cert-authority)来集中管理服务器的公钥,以提高安全性和可管理性。
