首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[Gerrit服务器集群搭建(二)] SSH原理及应用初步探索

Posted on 2015-04-05 18:34  winater  阅读(1387)  评论(0编辑  收藏  举报
一、写在前面
 
       本篇其实算是集群搭建前关于SSH的知识梳理,并没有与搭建相关的具体步骤。之所以单独记录,源于某天实验时看到"man-in-the-middle"warning比较振奋,毕竟是和安全相关的,亲切~并且也是这部分,让集群在试运行下载后期都中断了,囧。关于下载由于"man-in-the-middle"warning而中断的问题描述和解决详情都在。。这里仅是由此展开的进一步学习和思考。主要是在认证过程、可能遇到的威胁两个方面。
       SSH传输协议,在我理解,就是通过加密再传输,来保护数据传输过程中的安全性。因为有很多网络通信都是明文传输的,只要数据包被截获,信息就轻易能够获取。
 
 
二、从基本用法看SSH认证过程
 
       SSH协议的两端视为两个角色,客户端会向服务端发起连接请求。如果是需要用作服务端的主机,需要安装如OpenSSH等软件。
       SSH最常用的功能就是远程登陆,下面就先从远程登陆一台主机的流程看起。假设你需要远程登陆用户名为user,地址为host的主机,命令如下,其中-p可以指定端口,未指定则默认为22端口。
 $ ssh -p 7777 user@host
       如果是第一次登陆目标主机,将会出现提示:
 The authenticity of host 'host (10.64.58.17)' can't be established.
 RSA key fingerprint is 77:2e:d7:e0:de:ff:ac:67:28:c2:42:2d:37:16:58:4c.
 Are you sure you want to continue connecting (yes/no)?
       这里RSA key fingerprint是根据目标主机的SSH public key经过MD5计算生成的。如果你确定信任目标主机,输入'yes'后,该IP:Port和这个公钥的对应关系将会存放到你的$HOME/.ssh/known_host中,下次登录时,如果指纹一致,就不会再出现这个警告,否则,会提示"man-in-the-middle",拒绝登陆请求。此时如果你确定信任新的指纹,可以根据提示将known_host中原对应关系删除,再重新进行连接。
       这个机制会在一个地址被不同的主机响应时提示客户,当然我们也有理由重视这个提示,因为很可能我们的请求已经被中间人截获并且由中间人响应。
       不过,如果第一次登陆就被中间人截获了呢?这确实比较郁闷,所以很多网站会贴出自己的fingerprint,我们在确认前可以肉眼验证一下。我还想到一个问题,既然网站fingerprint大家都能看见,那大概也可以伪造吧,不过伪造了攻击者没有私钥也不能解密用户消息,暂时没想到有什么威胁。
       此外,SSH的远程登陆有口令认证和公钥认证两种方式。如果是公钥认证,客户端需要现在本地$HOME/.ssh/下新建一个config文件,指出访问目标主机使用的公钥,然后将公钥传送给服务端,服务端会将接收到的用户公钥集中存放在服务端的$HOME/.ssh/authorized_keys下。
       以上就是登陆过程和涉及到文件的一个简述,更为详细的操作步骤参见SSH原理与运用(一):远程登录 By 阮一峰。此外,在整理资料的时候发现SSH的端口转发功能似乎有许多妙用,mark一下,有了研究再详述。
 
 
三、中间人攻击——可能遇到的威胁与应对
 
1、中间人攻击形式
      记得大学的时候学过中间人攻击,残留的印象就是下面这张图。能够对着Bob冒充Alice,对着Alice冒充Bob,安全界的“小三”也是蛮拼的~     
 
 
2、当基于口令验证遭遇中间人攻击      
       上文提到SSH有口令认证和公钥认证两种认证方式。这里借用对中间人窃听SSH加密通信的个人认识 By 曾裕智中的两张图和一段描述,来了解一下SSH基于口令的正常连接过程以及遭遇攻击后的连接过程。
       需要重点关注的是这段描述:“服务器与客户端相互安全通信是通过对称加密算法(如DES、3DES、Blowfish和RC4)。对称加密算法,密钥只有一个,这便是会话密钥,服务器与客户端都拿此密钥去解密对方传输过来的密文。第三方没有密钥是无法破解通信的。所以会话密钥保密性决定了整个通信的安全。”
 
      
        
       从以上两张图,我们也发现,中间人重点就是要获取会话密钥C。而用口令认证之所以不安全,关键是会话密钥C也经过网络传输了。那么,基于公钥认证是如何避免这个问题的呢?
 
3、用公钥认证避免中间人攻击
        先看公钥认证的过程:
  • 用户事先为自己创建一对密钥对,并把公钥传送到需要访问的服务端;
  • 客户端向服务端发出验证用户请求,并把需要验证的公钥发送给服务端;
  • 服务器收到请求后,在该服务器目录下寻找用户公钥,然后与此时接收的用户公钥进行比较。若两公钥一致,服务器就会用该公钥加密“质询”(challenge)并回复给客户端;
  • 客户端收到“质询”后,用私钥解密后回复给服务器,完成认证。
       这个认证过程倒是和使用手机接收随机密码登陆网站的感觉类似。
       我曾经非常疑惑,这时不也能截获“质询”的内容么?这需要继续往下看了。当服务器客户端都互相承认了对方,接下来自然是传输数据。这个时候的传输是这样的:服务器将A客户的内容用A的公钥加密,传给A,A再用私钥解密……且慢,这里再回顾一下,中间人知道“质询”内容又如何,他能解密获取A公钥加密过的内容吗?没有A的私钥显然不能。再想想口令登陆为什么可以?因为口令登陆在实际传输中用的对称加密算法,只要获得会话密钥,解密双方内容自然不在话下。
       思路总算顺了,再回想一下这个过程,原来在使用公钥验证时,之所以能避免中间人攻击,关键点在于用户的私钥并不像口令登陆时的会话密钥一样,要传输给服务器,最关键的东西始终没有传到网路上,自然就不会有被截获利用这一说。再进一步想,这其实是对称加密和非对称加密的PK呀^^。
 
 
四、附录——公钥加密原理
 
     既然结论涉及了两类加密算法的对比,这里也顺便贴出公钥加密原理,(引用自使用 RSA 密钥对进行 SSH 登录验证)。

   公钥加密 (public-key cryptography),或非对称密钥加密 (asymmetric key cryptography) 是一类广泛使用的加密算法。这类算法使用一对密钥即公钥 (public key) 和私钥(private key)。其中公钥可以随便分发,只用于加密 (encryption),私钥则只由一人持有,只用于解密。任何一个信息用公钥加密之后,用私钥解密即可得到原来的信息,反之则不一定。

   公钥加密的关键点在于,一方面,公钥加密是可逆的,但是不能用公钥推断出私钥。显然数学上,已知一个公钥是能够算出对应私钥的,但是只要设计足够好的加密算法(以及使用足够复杂的密钥对),使得不能在可以接受的时间内破译即可。

   RSA 是一种常见的公钥加密算法。RSA 的工作原理依赖于如下事实:破译 RSA 私钥需要对某些极大的整数进行因数分解,而目前尚未找到快速的对极大整数作因数分解的算法。换言之,如果有人找到了这样的算法,那么全世界的RSA 加密都会失效。

   RSA是由Ron Rivest, Adi Shamir, Leonard Adleman三人在1978年首次提出的。三人并因此项工作荣获了2002年Turing Award。周时,Rivest还是算法导论的作者之一,书中在31章对RSA系统的原理进行了简要说明,系统实现中利用到了数论中的Euler-Fermat theorem

   COMMENT: 但不管怎么,极大整数的因数分解还是可能的。RSA_Laboratories举办过多次悬赏破译 RSA 的活动,更多信息可以看看 RSA_Secret-Key_Challenge。尽管随着密码学的发展,RSA 的安全性已经越来越受到威胁,但是未来能诞生可以在多项式时间内破译 RSA 的可能性还是非常小的。也就是说,除了军方、金融等高危目标之外,RSA 还是适用的。