SSH之所以能够保证安全,原因在于它采用了公钥加密。
ssh整个登录过程 :
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。
因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
可以设想,如果攻击者插在用户与远程主机之间(
比如在公共的wifi区域
),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的”中间人攻击”(Man-in-the-middle attack)。
如何避免中间人攻击?
建议使用公钥登录,不要使用明文登录,首次明文登录之后可以禁止root用户的明文登录。
一、免密登录的原理
Linux免密登录,本质上是使用了”公钥登录”。原理很简单,就是用户将自己的
公钥
储存在远程主机上。登录的时候,远程主机会向用户发送一段
随机字符串
,用户用自己的
私钥
加密后,再发回来。
远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的
,直接允许登录shell,不再要求密码。常见如Git的ssh方式也是通过公钥进行认证的。SSH公钥登录比密码登录更安全,密码登录可能存在中间人攻击。
客户端使用
私钥
,服务端使用
公钥
。
二、操作步骤
生成公钥私钥对(既可以在服务端生成密钥对,也可以在客户端生成密钥对,还可以在其他地方生成的密钥对),默认存储在 ~/.ssh 目录下。
将公钥 id_rsa.pub 追加到
服务端
~/.ssh/authorized_keys 文件中,
将私钥 id_rsa 放到
客户端
~/.ssh/目录下
#生成密钥对
ssh-keygen -t rsa
#(连续三次回车,即在本地生成了公钥和私钥,不设置密码,默认存储在 ~/.ssh目录下)
#将公钥 id_rsa.pub 追加到服务端 ~/.ssh/authorized_keys 文件中
#这里默认已经将公钥上传到了服务端
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
#将私钥 id_rsa 放到客户端 ~/.ssh/目录下
#这里默认已经将私钥上传到了客户端
mv id_rsa ~/.ssh/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
客户端免密登录服务端命令:ssh remot_user@ip
当然客户端也可能是本地一款ssh连接工具,一样可以免密登录,我这里使用 MobaXterm 测试: