浅淡ssh登陆远端主机

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

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

基本用法

ssh user@host
等待链接后,输入密码,登陆到远程主机上安全

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

如何保证安全

ssh登陆的过程以下:网络

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

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

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

SSH协议是如何应对的呢?加密

口令登陆

若是你是第一次登陆对方主机,系统会出现下面的提示:code

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主机的真实性,只知道它的公钥指纹,问你还想继续链接吗?server

所谓"公钥指纹",是指公钥长度较长(这里采用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登陆远端主机。

相关文章
相关标签/搜索