Linux探索之旅 | 第四部分第二课:SSH连接,安全快捷

《Linux探索之旅》全系列

内容简介


  1. 第四部分第二课:SSH连接,安全快捷
  2. 第四部分第三课预告:文件传输,潇洒同步

SSH连接,安全快捷


上一课是 Linux探索之旅 | 第四部分第一课:压缩文件,解压无压力

这一课的内容将让你大呼过瘾,也许是《Linux探索之旅》到目前为止最有意思的课之一。

我们会聊很多内容,会学习如何连接到远程的一台安装有Linux的机器。在本课程的开头,我们略微提到过:可以配置安装Linux的机器,只要机器开着,就可以远程连接它。我们不仅会学习如何远程连接到Linux,还会学习其原理。

而且也会学习SSH协议,以及数据如何通过SSH加密,以及如何用SSH连接到远程电脑。

因此,我们可以一窥网络和安全(密码学)的奇幻世界。

设想一下:
你家里的电脑安装了Linux系统,处于开机状态,你在工作的时候想起来要用家里的电脑进行某项下载任务或者提取某个文件。
此时,你可以远程连接到家里的Linux系统,打开一个终端,就好像你坐在家里的电脑面前一样。
我们到目前为止所学关于终端的所有操作,你都可以在远程连接到的机器上实现,哪怕这台机器是在世界的另一个角落。

这一课对各位站长特别有用,因为我们可以远程连接到自己网站的服务器。

现在越来越多的人购买了服务器,在服务器上可以架设自己的网站,或提供服务(比如游戏、文件服务器)。

一般来说,对服务器的操作都需要远程连接(因为我们一般都是租用服务器提供商的远端电脑,除非你有钱“任性”,那你可以买几台电脑来做服务器。或者省钱一些的,可以买树莓派之类的来搭建自己的服务器),用终端来进行,而且基本都是用SSH协议来连接。

连接到远程终端


到目前为止,我们本课程中所学的Linux的操作,都是我们本人坐在电脑前去操作自己面前的电脑。可能与我们原先还没学编程,使用Windows电脑玩Dota时没什么区别:端坐在电脑前,按下开机键,电脑开机,然后... gg对战平台,网易对战平台,五人黑呀,好happy呀... (小编你可以了,不要重回大学时代好嘛...)

怎奈我们不甘寂寞(“一生有一种大海的气魄,岁月一页页无情翻过。那乾坤留在我心中的一刻,就已经注定我不甘寂寞... ”),在一个地方待久了,总想去外面闯闯、看看。小编你真的是够了...

Linux的一个强大之处就是可以很方便地操作很远之处的另一台安装有Linux的电脑。这个功能早在Unix时代就已经有了。

当然了,Windows系统也可以远程连接到另一个Windows系统,我们也可以从Linux系统连接到Windows系统、Mac系统,或者从Windows连接到Linux,Mac。等等。只不过使用起来没有Linux下那么顺手。

今天,比如我住在法国巴黎,我可以很方便地远程连接到位于美国纽约的一台电脑。也可以连接到日本东京的一台电脑。我也可以操作美国的那台电脑给日本东京的电脑发送文件。

因为Internet(互联网或英特网)的出现,这样的事情在今天看来已经很平常了。

远程连接技术大大节约了时间和精力。假如没有这个技术,专门负责维护远程服务器的技术人员(通常称为System Administrator,系统管理员)要给东京机房的电脑安装一个软件,那还得买飞机票去东京...

服务器,英语是server。一般是指7天24小时不关机的电脑,这些电脑和你家里的电脑类似,但又不一样(通常更强劲,噪音更大 :P):也有一个处理器,一个或多个硬盘,等等。服务器的主要特色是保持开机,始终连接Internet,提供服务。

我们把连接到服务器的机器称为客户机,英语是client,我们本课之后的图片中也会像下图这样来表述:


 

目前,你家里的电脑应该还不能被称为一台服务器。当然,如果你愿意,你也可以将其“变为”一台服务器,只需要安装一些软件,做一些配置。

还有就是:不关机。

因为一台关机的服务器,就不是《服务》的机器了。作为服务器必须“任劳任怨,随叫随到;宕机重启,永不言弃”。

接下来,我们就有请今天的主角:SSH 上场。

不过我们会先讲很多其他的相关知识点。

前方密集知识点高能预警。准备好了吗?

我们将会以下面的顺序来介绍SSH:

  • 为什么要保护网络通信?

  • SSH又是如何保护网络通信的?

  • SSH的具体使用方法。

  • 从Telnet协议到SSH协议

协议


两台机器在互联网上通信的时候,需要遵循相同的协议。这不难理解,生活中,两家公司要合作,要协商,也需要拟定一份协议,双方都同意,并且签署,遵守。一旦违反协议,交流合作即会结束。比如我们中国的主席访问外国,和他们签署一系列商业协议;只有双方都遵循此协议,合作交流才能继续。

同样地,对于我们的互联网(Internet),要在其上相互通信,也需要一定的协议。互联网毕竟是人创立的嘛,那肯定引入了人的惯有思维。

或者我们也可以把互联网协议(有时也称为网络协议。)比作一种语言:只有都说英语或都说中文才能相互交流。

互联网协议有很多,就不一一列举了,可以看上面百度百科链接里的列表。因此,两台机器之间可以有不少种方式相互通信(每种协议对应一种通信方式)。

身为读者的您肯定已经见过其中的一种协议了,那就是HTTP协议。只要你上网浏览网页,那么你其实一直在使用这种协议。

这个网站目前没什么东西,因为我停止了阿里云服务器的续费。
正在用Hexo搭建新网站,之后会陆续把文章放上去。

看到最前面的http四个英文字母了吗?这就说明它遵循的是HTTP协议。因此,你的电脑能看到程序员联盟的官方网站,是因为你的电脑和程序员联盟的服务器之间使用了HTTP协议来互相通信。

HTTP是英语Hyper Text Transfer Protocol的缩写,表示《超文本传输协议》。protocol是英语《协议》的意思。HTTP协议是Web(Web可以简单翻译为《网络》)最常用的传输网页的协议。

其他常见的网络协议有FTP,是英语File Transfer Protocol的简称,表示《文件传输协议》。一般站长常用FTP,因为需要把文件(比如网站的源代码)传输到远程的网站服务器上。以前在大学时代,学校也会有公共的FTP站点,供学生们下载需要的学习资料。

还有我们每天使用邮箱所需要遵循的协议,常见的有IMAP和POP3。IMAP是Internet Message Access Protocol(互联网消息访问协议)的缩写,POP3是Post Office Protocol Version 3(邮局协议第三版)的缩写。一般我们使用Office Outlook,Thunderbird,Gmail,163邮箱,QQ邮箱等,都需要遵循相应的邮件协议。

Telnet协议:简单易用危险多


既然我们这课的重点是讲远程连接,那么我们就来谈谈远程连接的协议好了。首先,介绍一个老古董:

Telnet

这个协议简单,易用,在20世纪80年代就被创立了。它的功用就是在机器间传输简单信息。

理论上,我们就可以使用Telnet来与远端机器通信啦,比如与我们的服务器通信。

但是这个协议有什么缺点呢?那就是它太简单太基础了,因此传输的信息并没有经过加密,而是明文传输。

在密码学中,明文(英语是:Plaintext或Cleartext)是指传送方想要接收方获得的可读信息(比如《我爱你》,《Hello World》)。

明文经过加密所产生的信息被称为密文(英语:ciphertext或cyphertext),而密文经过解密还原得来的信息就是明文。

如果在互联网上传输明文,那是很危险的。假设以下场景:

一台军方的客户端电脑请求军方的服务器提供发射导弹的密码(可能是核弹,吓死宝宝了...),服务器用明文将密码传输给客户端。

如下图所示:


 

从上图看来,并没有什么风险不是吗?因为信息只传递给了发出请求的客户机。

但是,很有可能一个不怀好意的黑客,监听了上面两者通信的信息,就可以截取军方服务器发给军方客户机的明文信息了。如下图所示:


 

要阻止这样的黑客行为是很难的。虽说拦截数据这样的操作本身有难度,但是水平高的黑客是可以轻易做到的。

比如, 像Wireshark这样的软件就可以被用于监听网络(尤其是本地网络),可以截获数据。如下图所示:


 

你也许会说:“呃... 等等。我只是想远程连接到我的电脑或服务器以便访问终端控制台。我可不会共享核弹密码!况且我在电脑上只是运行grep之类的命令,被人知道也无妨啊。”

你的意思是你并不介意别人窥探你的电脑咯?好吧,你赢了...

但是当你连接到服务器时,你需要提供你的登录名和密码,假如被人窃取就麻烦了。

���以,必须加密网络间传输的信息,你应该不希望自己的密码被人知道吧。

SSH协议:保护信息的好方法


既然我们并不能阻止心怀不轨的人试图截取Internet上传输的信息,那么我们就要采取一些措施,使客户机和服务器之间以安全的方式通信。加密技术就是专门替我们做这等差事的:假如黑客获取了加密后的密码,他便不能做什么。

但是怎么加密数据呢?客官莫急,待我把主角SSH请上来~

使用SSH的信息交换是如何加密的


SSH是英语Secure SHell的缩写,直译过来就是“安全的Shell”,shell是英语《壳》的意思。

在计算机科学中,Shell俗称“壳”(用来区别于“核”),是指“提供用户使用界面”的软件(命令解析器)。它类似于DOS下的command(是英语“命令”的意思)和后来的cmd.exe。
它接收用户命令,然后调用相应的应用程序。Linux下有Bash等Shell程序,之后我们有专门的一大部分会讲Shell程序,不要担心。

如果是Windows用户,那很有可能知道cmd(是command的缩写)这个命令吧。我们有时会使用到它。如何运行这个命令呢?

  • 点击:开始->运行

 
  • 输入“cmd”->回车

 
  • 在出现的黑窗口里输入命令,回车运行。

 

不可讳言,SSH协议本身比较复杂,但是如果能对其大致原理有所了解,岂不快哉?

如果知其所以然,那使用的时候也不会那么盲目了。所以我们从以下两条主线来了解SSH:

  1. 有哪些不同的加密方法

  2. SSH又是如何运用加密方法来保护数据的

不同的加密方法


说到加密方法,就要涉及到相应的算法了。什么是算法呢?

百度百科的解释:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

所以下面我们就直接用“加密算法”这个词了。

要说不同的加密算法,那实在是三天三夜讲不完啊,所以小编就不在这给大家“一千零一夜”了。

虽说我们不能了解所有的加密算法(也没那个必要),但是我们需要知道加密算法大致分两类:

  • 对称加密

  • 非对称加密

对称加密


对称加密是比较简单的加密算法,但简单并不意味着不保险(有很安全的对称加密算法)。简单意味着功能比较好理解。

对称加密算法用一个密钥(英文称为Key,是《钥匙》的意思。是在明文转换为密文或将密文转换为明文的算法中输入的参数)来加密信息。

举个例子,假如此密钥叫superkey(super+key,意为“超级密钥”),而需要被加密的信息是message(英语《信息》的意思),那么加密过程如下图所示:


 

上图是对称加密的加密过程的简单演示。传输方用superkey这个密钥将message这个明文信息进行加密,成为P7&(jk2%这样的密文。

之后,接收方用同样的密钥superkey,对P7&(jk2%这个密文进行解密,就重新得到了明文message。解密的过程如下图所示:


 

上图就是对称加密中用同样的密钥superkey进行解密的过程。

因此,不难理解,对称加密中“对称”的意思就是指加密和解密使用的是同一个密钥。因此加密方和解密方都须要知道这个密钥。

这样,假如黑客截获了P7&(jk2%这个传输的密文,他没有解密的密钥superkey,他就不知道究竟是什么明文信息了。如下图所示:


 

你会说:“这样很不错啊”。

但是,客户机和服务器都须要知道这个密钥。因此客户机首先要把这个密钥传给服务器,为了让服务器可以解密那些加密过的信息。

实际上,为了达到上图的目的,客户机和服务器必须事先传递那个密钥superkey。

但是他们怎么传递呢?假如他们传递密钥用的是明文,那么黑客照样可以截获密钥,接下来就可以解密任何传递的加密信息了,不是吗?如下图所示:


 

因此,对称加密虽然强大,但是有一个致命的缺陷:必须谨慎地传递密钥。但这几乎是不可能的:因为首先得把密钥传递过去。

你也许会问:为什么我们不干脆把传递的密钥也加密呢?

好问题,你的想法也是对的。Bravo !

为了加密用于对称加密的密钥(是不是很绕?),我们将用另一种方法:

非对称加密

只要用了这个方法,我们就不用担心密钥被黑客获取了。

非对称加密


  • 对称加密方法中,我们只用一个密钥来进行加密和解密。

  • 非对称加密方法中,我们用一个密钥来进行加密,用另一个密钥来解密。

因此,非对称加密有两个密钥:

  • 一个是"公钥"(Public Key),用于加密。

  • 一个是"私钥"(Private Key),用于解密。

公钥只用来加密。因此,用非对称加密的算法,我们就只能用私钥来解密咯。

我们请求电脑为我们生成这一对密钥:一个私钥和一个公钥。它们总是成对出现。

但是您不要问我生成这一对密钥的原理,也不要问我为什么它们总是成对出现。因为“我不想说,我很亲切;我不想说,我很纯洁。可是我不能拒绝心中的感觉...”。 不好意思,跑题了(想起了杨钰莹的经典歌曲《我不想说》)。

其实是因为原理很复杂,我们只要知道怎么用就好了。

假设我们有如下一对密钥:

  • 公钥:37ab47pK

  • 私钥:1Tv314C

为了加密,我们要用到公钥,如下图所示:


 

而解密呢,公钥就派不上用场了。必须用私钥才行。“公私分明,方为大德”嘛。如下图所示:


 

这就是为什么我们称这种方法为非对称的原因:需要两个不同的密钥。其中一个用于加密,另一个用于解密。

公钥可以在网络上以明文传输,毕竟是公开的密钥嘛(Public是英语"公开的,公共的"的意思)。即使公钥被不怀好意的黑客截获也无所谓。

但是,私钥(private是英语"私人的,私有的"的意思),用于解密的,却不能被公开传输,需要保管好。

当然了,非对称算法绝不止一种。在这个大家族中,最有名的要数RSA算法了。

1977年,三位数学家Rivest、Shamir 和Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字的首字母命名,叫做RSA算法。

用SSH创建一个安全的通信管道


SSH结合使用非对称加密和对称加密两种方法


SSH以如下顺序使用两种加密方法:非对称加密和对称加密。

  1. 首先,使用非对称加密,安全地传输对称加密的密钥。

  2. 之后,就一直使用对称加密的密钥来作为加密和解密的手段。

聪明如你一定会好奇:那为什么不只用非对称加密呢?

当然可以只用非对称加密,但是也有一个缺陷:非对称加密太消耗电脑资源了。非对称加密比对称加密要慢大概100~1000倍。

因此,两台电脑之间首先交换对称加密的密钥(用非对称加密的方式),之后就可以用对称加密来通信了,会更快捷。

非对称加密只是在通信之初用于交换对称加密的密钥。

让我们用图解的方式来解释一下SSH是如何创建一个安全的通信管道的:

首先,我们要交换一个对称加密的密钥,但是我们又不能以明文方式传输这个密钥,不然黑客截获之后就可以用其来解密了。因此,我们要用非对称加密的方式来加密用于对称加密的密钥(希望您还没晕)。

服务器将非对称加密的公钥以明文方式传输给客户机,使客户机可以用公钥来加密。如下图:


 

客户机收到服务器传给它的公钥之后,就会用公钥来加密自己的对称加密的密钥,假设是superkey。如下图所示:


 

然后,客户机将用公钥加密后的对称加密密钥传给服务器。黑客可以截获这个加密后的密钥,但是他没办法解密,因为他没有用于解密的私钥,这个私钥只有服务器知道。如下图所示:


 

服务器接收到客户机传来的密钥,使用自己的私钥来解密,就得到了对称加密的密钥。如下图所示:


 

现在,客户机和服务器都知道了对称加密的密钥是superkey,而他们从没在网络间以明文传递过这个密钥。

因此,从现在开始他们可以用对称加密的方式互相发送加密的信息(用superkey来加密和解密),不用再担心被黑客获取信息了。如下图所示:


 

以上就是SSH的工作原理了。是不是很巧妙地创建了一条安全通信的管道呢,设计这些的IT前辈们真的非常机智,智商高达250呢~

现在既然客户机和服务器已经有了安全的通信方式,客户机就可以放心地将自己的登录名和密码传输给服务器以连接服务器了。如下图:


 

那么,须要知道以上这些原理才能使用SSH吗?

当然不是啦。以上这些都是自动完成的。为了连接远程电脑,你要做的只是输入登录名和密码就好了。

现在全球都在使用SSH,几乎没有人再用Telnet了。

用SSH进行连接


好了,理论谈得够多了,该实战了。你会发现SSH使用起来很简单,因为电脑替我们做了大部分工作。

接下来我们分为两种情况:

  • 你已经租用了一台服务器,那这台服务器因为已经配置好了作为SSH服务器,所以你什么也不需要做。估计站长大多是这种情况吧。

  • 你没有租用一台服务器(大多数人的情况),我们就来看看怎么把你自己的电脑配置成SSH服务器。

将你的电脑配置成SSH服务器


假如你要将自己的电脑配置成SSH服务器,以便自己或别人以后可以远程用SSH登录你的电脑,你可以这么做:

首先,安装openssh

OpenSSH 是 SSH协议的免费开源实现。

sudo apt-get install openssh-server

安装完成后,它会自动开启sshd这个精灵进程(Daemon Process,或称为守护进程。是一种运行在后台的特殊进程)。

你也可以手动开启sshd:

# Ubuntu系统
sudo service ssh start
# Debian系统
sudo /etc/init.d/ssh start

要停止的话:

# Ubuntu系统
sudo service ssh stop
# Debian系统
sudo /etc/init.d/ssh stop

如果你要对SSH的配置做修改,可以修改/etc/ssh/ssh_config,然后运行

sudo /etc/init.d/ssh reload

sudo service ssh reload

来使修改生效。

从一台Linux电脑上通过SSH连接


假定你要以用户名user,用SSH协议登录远程服务器host,只要一条简单命令就可以了:

ssh user@host

如果本地用户名与远程用户名一致,登录时可以省略用户名:

ssh host

SSH的默认端口是22。也就是说,你的登录请求会被送进远程服务器的22端口。

使用p参数,可以修改这个端口(p是port的缩写,表示“端口”):

ssh -p 250 user@host

上面这条命令表示:SSH直接连接远程服务器的250端口。

如果你是第一次登录远程服务器,系统会出现类似下面的提示:

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 这一串十六进制数),再进行比较,就容易多了。

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

假定经过风险衡量以后,用户决定接受这个远程服务器的公钥(输入yes,回车):

Are you sure you want to continue connecting (yes/no)? yes

系统会出现一句提示,表示host主机(也就是我们在操作的电脑)已经得到认可:

Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.

然后,会要求输入密码:

Password: (enter password)

如果密码正确,就可以登录了。

当远程服务器的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中(HOME是环境变量,通常保存了用户家目录的绝对路径,比如我的HOME就是/home/oscar)。下次再连接这台服务器时,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件。此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程服务器的公钥。

从一台Windows电脑上通过SSH连接


从Windows电脑要连接到远程的SSH服务器,有不少软件可以帮助我们。不过一般常用的是PuTTY这个软件。

PuTTY这个软件可以从它的官网(www.putty.org,尽量不要去第三方软件网站下载,以防有内置恶意程序)下载可直接运行的可执行程序putty.exe,也可以下载安装程序(例如 putty-0.66-installer.exe):

下载或安装完毕后双击软件图标打开软件。


 

打开PuTTY后,可以看到如下窗口


 

在上图的红色方框处填入要连接的服务器的IP地址,然后点击Open按钮,如果是首次连接,会弹出以下窗口,点击“是”即可:


 

在弹出的命令行窗口中依次输入用户名和密码。注意Linux系统下输入的所有密码都是不可见的(也不会用星号表示),所以你不要以为是键盘坏了或者输入不起作用,其实已经输入了:


 

用密钥实现自动身份验证


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

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程服务器上。登录的时候,发送一个经过公钥加密的随机数据给客户机,这个数据只能通过私钥解密,客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道,直接允许登录shell,不再要求密码。


 

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen命令生成一个:

ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。一般都不设置。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程服务器host上面:

ssh-copy-id user@host

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程服务器的/etc/ssh/sshd_config这个文件,检查下面几行前面的"#"注释是否取掉。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程服务器的ssh服务:

# Ubuntu系统
sudo service ssh restart
# Debian系统
sudo /etc/init.d/ssh restart

总结


  1. 我们可以远程连接到Linux系统,进入它的终端。我们一般都是这样操作远程服务器的。

  2. 我们一般把连接到远程Linux服务器的电脑称为client,就是客户。我们可以从多种操作系统远程连接到Linux的终端,比如从Windows,Linux,Mac,Unix系统。

  3. 在Windows下,为了远程连接到Linux系统,一般我们会用PuTTY这个软件。

  4. 在Linux和Mac下,为了远程连接到Linux系统,我们可以用ssh命令,为它指定在远程Linux机器上的登录名(login)和远程Linux机器的IP地址。例如:

    ssh oscar@79.27.172.59
  5. 通过SSH协议, 两台机器之间传递的信息会被加密,这样就保证了传输信息的安全性。

  6. 为了免去每次用SSH协议连接远程机器都要输入用户密码的麻烦,我们可以创建一个用于验证身份的密钥对(公钥和私钥)。公钥需要传输并储存到远程机器上,私钥则存在我们自己的电脑里。之后,我们的SSH连接就不需要输入密码了。

第四部分第三课预告


今天的课就到这里,一起加油吧!

下一课我们学习:Linux探索之旅 | 第四部分第三课:文件传输,潇洒同步

猜你喜欢

转载自www.linuxidc.com/Linux/2017-06/144724.htm