Ssh自学笔记
Ssh简介
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道"。
SSH的安全验证方式
从客户端来看,SSH提供两种级别的安全验证。
l 第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
l 第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。
第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。
两种方式的机制
用户名、密码验证方式
说明:
- 当客户端发起ssh请求,服务器会把自己的公钥发送给用户;
- 用户会根据服务器发来的公钥对密码进行加密;
- 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。
公钥认证方式
说明:
- 首先在客户端生成一对密钥(ssh-keygen);
- 并将客户端的公钥ssh-copy-id 拷贝到服务端;
- 当客户端再次发送一个连接请求,包括ip、用户名;
- 服务端得到客户端的请求后,会到authorized_keys中查找,如果有相应的IP和用户,就会随机生成一个字符串,例如:qwer;
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
个人对这两种方法的理解
仔细对比两种方式可以发现,第一种用户名和密码的验证方式,实际上只进行了服务器对客户端的验证,而没有客户端对服务器的验证,这就存在中间人假扮服务器的可能性。而第二种方式,公钥认证方式,由于在服务器中放置了客户端的公钥,而第5、6步实际上就是客户端对服务器的验证。所以公钥认证方式是双向认证的,应该更加安全。
非对称加密
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密的工作过程
l 乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。
l 得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。
l 乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。
在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。
非对称加密的优缺点
非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥(同步秘钥,也就意味着要再网络上传送秘钥,而这很可能会被恶意监听)。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
公钥加密与公钥认证
加密与认证
首先我们需要区分加密和认证这两个基本概念。
加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击。其重点在于数据的安全性。身份认证是用来判断某个身份的真实性,确认身份后,系统才可以依不同的身份给予不同的权限。其重点在于用户的真实性。两者的侧重点是不同的。
个人理解:加密是为了保证内容的安全性,认证则只需要验证私钥正确即可。
公钥加密过程:
比如有两个用户Alice和Bob,Alice想把一段明文通过双钥加密的技术发送给Bob,Bob有一对公钥和私钥,那么加密解密的过程如下:
l Bob将他的公开密钥传送给Alice。
l Alice用Bob的公开密钥加密她的消息,然后传送给Bob。
l Bob用他的私人密钥解密Alice的消息。
注意,加密时使用的秘钥是对方的公钥,不能使用自己的私钥,因为自己的公钥是公开的,任何人都可以获取自己的公钥,如果用自己的私钥加密,那么任何人都可以进行解密了。
公钥认证过程:
身份认证和加密就不同了,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。
还是Alice和Bob这两个用户,Alice想让Bob知道自己是真实的Alice,而不是假冒的,因此Alice只要使用私钥密码,对文件签名,发送给Bob,Bob使用Alice的公钥对文件进行解密,如果可以解密成功,则证明Alice的私钥是正确的,因而就完成了对Alice的身份鉴别。整个身份认证的过程如下:
l Alice用她的私人密钥对文件加密,从而对文件签名。
l Alice将签名的文件传送给Bob。
l Bob用Alice的公钥解密文件,从而验证签名。
个人理解:公钥人认证过程是用自己的私钥对文件进行加密,在这里叫对文件签名更合理一些,因为虽然这里我们对文件进行了加密,但是我们的目的并不在于对文件的内容进行保护,我们的目的在于用公钥验证私钥的正确性。用自己的私钥对文件进行加密意味着,任何人都可以对该文件进行解密,因为自己的公钥是公开的。但是这并没有影响,因为我们并不是再为文件加密,并不是在保护文件的内容,而是在让对方验证自己私钥的正确性,以便对方确认自己的身份。
另外在网上看到了一个很精辟的总结:
总结:公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。
SSH秘钥生成和免密码登录
使用ssh-keygen命令。该命令的manpage说明是
authentication key generation, management and conversion
认证秘钥的生成、管理和转换
常用参数
-t type 指定密钥类型,有两种可供选择:RSA和DSA,默认为RSA
实际中使用ssh-keygen命令(不带任何参数),然后按三下回车,就会在家目录下生成.ssh文件,.ssh文件中有两个文件:id_rsa和id_rsa.pub,分别对应私钥和公钥。然后将公钥的内容拷贝到服务端的~/.ssh/authorized_keys文件中即可。但是要注意本地的.shh目录和服务端的.ssh目录的权限都是700,服务端authorized_keys的权限为600才可以。拷贝公钥的内容到服务端,可以使用scp命令复制id_rsa.pub到服务端,然后将内容添加在authorized_keys的后面即可。也可以使用ssh-copy-id命令。ssh-copy-id 的-i选项可以指定要拷贝的公钥文件,默认就是使用家目录下.shh中的id_rsa.pub。然后跟上ssh的地址,如,ssh-copy-id root@172.16.47.1就会把公钥拷贝到服务端的家目录下.ssh的authorized_key中。
上面的这种方法针对的是两台Linux电脑。如果要用Linux电脑ssh到Openwrt的无线路由器中这样是无效的,因为在OpenWrt中使用的是dropbear作为ssh协议的实现,而不是open ssh。这个时候,我们应该讲authorized_key放到/etc/dropbear/目录中,而不是家目录下的.shh目录中,这一点要注意。