# ssh是什么

# 1. 什么是ssh

简单来说,ssh 是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用 ssh 协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。 需要指出的是,ssh 只有一种协议,存在多种实现,既有商业实现,也有开源实现。

# 2. 基本用法

  • 使用某个用户(例如 user)登录远程主机 host, 命令:ssh user@host

  • 如果本地用户名和远程用户名一致,则登录时可以省略用户名, 命令:ssh host

  • ssh 的默认端口是22,也就是说, 你的登录请求会送进远程主机的22端口。使用 -p 参数,可以修改这个端口, 命令:ssh –p 端口号 user@host,例如:我经常会进入自己服务器 ssh -p 22 root@xx.xx.xx.xx,输入密码可以进入

# 3. 中间人攻击

SSH 之所以能够保证安全,原因在于它采用了公钥加密。整个过程如下:

  • 远程主机收到用户的登录请求,把自己的公钥发给用户。
  • 用户使用这个公钥,将登录密码加密后,发送回来。
  • 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机, 将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像 https 协议,SSH协议的公钥是没有证书 中心(CA)公证的,也就是说,都是自己签发的。可以设想,如果攻击者插在用户与远程主机之 间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主 机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"。

# 4. ssh的安全验证

SSH有自己的一套验证方式,可以阻拦大部分的攻击,当然如果有人想通过撞库来尝试密码的话,就只有设置防火墙或者做其它的安全措施了。

从客户端来看,SSH提供两种级别的安全验证。

  • 第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据 都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

  • 第二种级别(基于密匙的安全验证)

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在 需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向 服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该 服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙 进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它 发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级 别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间 人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过 程可能需要10秒。

# 4.1 ssh免密登录

执行这条命令 ssh-copy-id -i .ssh/id_rsa.pub root@xx.xx.xx.xx 写到服务器上的ssh目录下去,服务端 .ssh 下就多了一个文件可查看 vim authorized_keys

# 5. 应用(github添加ssh免密提交pull)

# 5.1 window 添加 ssh

https://juejin.im/post/5ac0a382f265da238533012d在新窗口打开

输入 ssh-keygen -t rsa,然后连续按回车键三次(如果输入密码,每次登陆都需要密码)

生成 id_rsaid_rsa.pub 两个文件 ,id_rsa.pub为公钥,id_rsa为私钥,它们都是隐藏文件。 这里说明下生成的公钥和私钥所在位置,LinuxMac 系统在 下面,Windows 系统在C盘 Documents and Settings/username/.ssh 下面

输入 cat id_rsa.pub 会出现公钥,紧接着添加 SSH KeyGitHub 上,我的头像下的 setting

# 5.2 linux

一般在根目录有

cd /root 
# 查看是否已经存在SSH-Key【其实就是查看.ssh这个隐藏目录是否存在】
ls -al ~/.ssh
#如果存在直接查看
cat id_rsa.pub
1
2
3
4
5