前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux登陆方式之SSH

Linux登陆方式之SSH

作者头像
AsiaYe
发布2019-11-06 15:30:18
1.7K0
发布2019-11-06 15:30:18
举报
文章被收录于专栏:DBA随笔DBA随笔

SSH简析

1什么是SSH?

公司的服务器登陆操作都是使用堡垒机+SSH的方式进行登陆的,今天准备配置一台机器的SSH访问,所以看了看SSH相关的东西,这里简单总结下。

SSH是一种用于计算机之间加密登陆的网络协议,我们可以认为它是安全的,因为即使它的信息在中途被截获,密码也不会泄露出去。现今使用最广泛的是OpenSSH,它是SSH的一种商业实现。

2工作原理

基本用法:ssh user@host

其中,user代表用户名,远程主机是host,如果本地用户名与远程主机一致的话,可以直接省略user,而直接使用"ssh host"的方法来登陆远程主机。

SSH的默认端口是22,如果想要更改端口,可以使用-p命令,比如我们采用的是20022端口,所以一般就可以写为:

ssh -p 20022 user@host

SSH如何实现数据安全???

这是SSH最核心的部分,这里我们详细展开,SSH采用了对数据加密的方法来保证数据安全,通常的加密方式有两种。一种是对称加密,一种是非对称加密,这里简单说明下:

对称加密类似上图中的描述,客户端发起一个请求,然后通过密钥加密,服务器端接收到相关的密文,然后通过密钥解密,最终得到用户输入的登陆信息。这中加密方法的加密强度很高,只要用户没有泄露client端的密钥,它就很难被破解。但是上面的加密方法也很明显,一旦用户泄露了client端的密钥,因为加密的方法是对称的,那么整个系统的安全性就受到了威胁。为了解决这个问题,非对称密钥应运而生。

非对称密钥的方法可以简单的表示如下图所示:

登陆流程如下:

  1. 远程Server收到Client端用户yeyz的登录请求,Server把自己的公钥发给用户。
  2. Client使用这个公钥,将密码进行加密。
  3. Client将加密的密码发送给Server端。
  4. 远程Server用自己的私钥,解密登录密码,然后验证其合法性
  5. 若验证结果,给Client相应的响应。

上面加密方法的最大好处就是:私钥是Server端独有的,公钥加密后的密文,只能通过其对应的私钥进行解密。通过公钥推理出私钥的可能性微乎其微。这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。

然而黑客们的方法总是很多,针对这种加密方式,黑客们研究了另外一套攻击方法,这里简单演示一下:

通过拦截客户端发来的登陆请求,然后反推送一个公钥,然后让客户端误以为连接到了服务器,然后对数据进行加密,最后再通过黑客自己的私钥解密,这样就得到了用户的登录信息,从而发送攻击指令。这种攻击方法,也称之为"中间人攻击"。

发生这种问题的根源在于,客户端不知道服务器的公钥是什么!

要解决这个问题,要解决这个问题,有两个方法,分别介绍一下:

01

口令登录

第一个很自然的方法就是告诉客户端远程服务器的公钥,现有的解决方案是:远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对,或者自己甄别host地址是否正确。

因此,ssh在第一次连接的时候,通常会出现下面的提示信息:

代码语言:javascript
复制
$ ssh user@host
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is :e:d7:e0:de:f:ac:::c2::d::::d.
Are you sure you want to continue connecting (yes/no)?

上面的信息说的是:无法确认主机host(12.18.429.21)的真实性,不过知道它的公钥指纹,询问你是否继续连接?这里提到了“公钥指纹”的概念,所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。 之所以用fingerprint代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。

而一旦这个连接建立,意味着远程主机的公钥被接收,当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。文件如下,这几个文件稍后会进行相关解释:

代码语言:javascript
复制
[dba_mysql ~/.ssh]$ll
total 128
-rw------- 1 dba_mysql dba_mysql    411 Aug 16  2017 authorized_keys
-rw------- 1 dba_mysql dba_mysql     11 Jun 28 11:18 config
-rw------- 1 dba_mysql dba_mysql   1671 Aug  9  2017 id_rsa
-rw-r----- 1 dba_mysql dba_mysql    411 Aug  9  2017 id_rsa.pub
-rw-r--r-- 1 dba_mysql dba_mysql 106790 Dec  3 15:49 known_hosts

02

公钥登陆

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH提供了另外一种可以免去输入密码过程的登录方式:公钥登录。

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

如下:

公钥认证流程: 1. Client端用户yeyz将自己的公钥存放在Server上,追加在文件authorized_keys中。 2. Server收到登录请求后,随机生成一个字符串str1,并发送给Client 3. Client用自己的私钥对字符串str1进行加密。 4. 将加密后字符串发送给Server。 5. Server用之前存储的公钥进行解密,比较解密后的str2和str1。 6. 根据比较结果,返回客户端登陆结果。

这里再次给出上文提到的几个文件:

代码语言:javascript
复制
[dba_mysql ~/.ssh]$ll
total 128
-rw------- 1 dba_mysql dba_mysql    411 Aug 16  2017 authorized_keys
-rw------- 1 dba_mysql dba_mysql     11 Jun 28 11:18 config
-rw------- 1 dba_mysql dba_mysql   1671 Aug  9  2017 id_rsa
-rw-r----- 1 dba_mysql dba_mysql    411 Aug  9  2017 id_rsa.pub
-rw-r--r-- 1 dba_mysql dba_mysql 106790 Dec  3 15:49 known_hosts

最后来解释解释这几个文件的意思:

authorized_keys

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。

id_rsa.pub 公钥

id_rsa私钥

konw_host:

存储 已经确保正常、可以安全连接的所有服务器(hosts)的公钥

config:

端口配置文件

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
堡垒机
腾讯云堡垒机(Bastion Host,BH)可为您的 IT 资产提供代理访问以及智能操作审计服务,为客户构建一套完善的事前预防、事中监控、事后审计安全管理体系,助力企业顺利通过等保测评。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档