经常会用到使用ssh远程登录其他系统。ssh安装,使用,启动等相关操作以及使用过程中出现的问题及解决方法记录。

介绍

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。

SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文主要介绍OpenSSH免费开源实现在Ubuntu中的应用,如果要在Windows中使用SSH,需要使用另一个软件PuTTY或SecureCRT。

ssh的安全机制

SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据。

传统的网络服务程序,如FTP、Pop和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。

但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:

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

第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。

ssh安装

SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑上是否安装了客户端和服务器。

1
dpkg -l | grep ssh

如果只是想远程登陆别的机器只需要安装客户端(Ubuntu默认安装了客户端),如果要开放本机的SSH服务就需要安装服务器。

1
2
sudo apt-get install openssh-client 
sudo apt-get install openssh-server

启动服务器的SSH服务

首先确认ssh-server是否已经启动了,

1
ps -e | grep ssh

sshd 表示ssh-server已经启动了。如果没有启动,可以使用如下命令启动:

1
sudo /etc/init.d/ssh start 

停止和重启ssh服务的命令如下:

1
2
sudo /etc/init.d/ssh stop  #server停止ssh服务 
sudo /etc/init.d/ssh restart #server重启ssh服务

SSH两种级别的远程登录

在Linux机器A上登录到Linux机器B(IP: 172.168.1.1)系统中。

口令登录

口令登录非常简单,只需要一条命令,命令格式为:ssh 客户端用户名@服务器ip地址:

1
ssh B@172.168.1.1

如果需要调用图形界面程序可以使用 -X 选项:

1
ssh -X B@172.168.1.1

如果客户机的用户名和服务器的用户名相同,登录时可以省略用户名。

1
ssh 172.168.1.1

另外,SSH服务的默认端口是22,也就是说,如果你不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号,比如连接到服务器的1234端口:

1
ssh -p 12345 B@172.168.1.1

后续根据提示输入密码即可。

可以通过 Ctrl+D 或者 exit 命令退出远程登录。

公钥登录

每次登录远程主机都需要输入密码是很不方便的,如果想要省去这一步骤,可以利用密钥对进行连接,还可以提高安全性。

  1. 在本机生成密钥对
    使用ssh-keygen命令生成密钥对:
    1
    ssh-keygen -t rsa 

然后根据提示一步步的按enter键即可(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,这里看心情吧,如果不放心私钥的安全可以设置一下),执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。

  1. 将公钥复制到远程主机中
    使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的 ~/.ssh/authorized_key文件中:
    1
    ssh-copy-id B@172.168.1.1

经过以上两个步骤,以后再登录这个远程主机就不用再输入密码了

使用过程中的问题

issue1

B的系统内核变化,但是B的IP不变,出现以下问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:Kal6266yHO/7HP8cHkn5/tq79PSw9dMxRTTh/65pbzA.
Please contact your system administrator.
Add correct host key in /home/../.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/../.ssh/known_hosts:16
remove with:
ssh-keygen -f "/home/../.ssh/known_hosts" -R "172.168.1.1"
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.

出现该问题的原因是由于对应IP上的ssh key发生变化,电脑端的记录更新。

  • 方案一

    删除A机器中的/home/username/.ssh/know_hosts文件,担心有问题的,也可以先将该文件备份在删除。

    1
    rm /home/username/.ssh/know_hosts
  • 方案二
    更新电脑上的ssh key:

    1
    2
    ssh-keygen -R 目标IP
    ssh username@目标IP

issue2

之前使用正常,偶尔git pull过程中出现permssion deny的错误。

Solution:

重新加载私钥。

1
2
3
ssh-agent bash
ssh-add ~/.ssh/id_rsa
git pull