浅淡ssh登录远端主机

ssh是一种网络协议,用于计算机之间的加密登录,被广泛应用于本地远程登录服务器包括互相传送文件等。

ssh是一种安全的互联网协议。

基本用法

ssh user@host
等待连接后,输入密码,登录到远程主机上

ssh user@host -p 端口号 默认端口为22

如何保证安全

ssh登录的过程如下:

  1. 用户发起登录请求
  2. server端收到登录请求后把自己的公钥发送给用户
  3. 用户使用公钥对密码加密后发送给server
  4. server用自己的私钥解密登录密码并验证登录密码是否正确

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

口令登录

如果你是第一次登录对方主机,系统会出现下面的提示:

ssh user@host

  The authenticity of host 'host (12.18.429.21)' can't be established.
  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
  Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

如何配置公钥登录?

  1. 先在本地生成一对密钥,执行如下命令后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

    ssh-keygen -t rsa
  2. 将公钥上传到远程服务器,执行如下命令后,本地公钥会追加写入远端host的user对应home目录下 .ssh/authorized_keys文件中

    ssh-copy-id user@host

ok,执行上面的步骤后,你就可以使用ssh user@host 免密登录了。如果不行的话,可能需要注意下远程ssh目录的权限问题。

设置别名远程登录
当我们完成了公钥登录的配置后,每次登录依然是 ssh user@host!这样输入起来依然是不太方便,你要记ip地址,当你本地要登录的远端机器比较多的时候就更加头大了。

那,有一个更好的方法就是用ssh config在本地配置别名来简化登录命令。如 ssh xxx。

在~/.ssh/ 下创建 config文件,并以如下格式编辑配置文件:

Host Test
    HostName 111.222.331.2
    User user
    IdentityFile ~/.ssh/id_rsa
  1. Host:是我们在输入命令的时候的名字 比如我这里是lab 那么我使用ssh命令的时候需要使用:ssh Test
  2. HostName: 是远端host,通常是远端主机的IP
  3. User: 是登录的用户名
  4. IdentifyFile:指定的私钥地址

配置完成后,保存就可以愉快的使用ssh Test登录远端主机。

相关推荐