ssh自学笔记
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目录中,这一点要注意。
ssh自学笔记的更多相关文章
- 《Linux就该这么学》自学笔记_ch21_使用Git分布式版本控制系统
		<Linux就该这么学>自学笔记_ch21_使用Git分布式版本控制系统 文章主要内容: 分布式版本控制系统 使用Git服务程序 提交数据 移除数据 移动数据 历史记录 还原数据 管理标签 ... 
- 《Linux就该这么学》自学笔记_ch22_使用openstack部署云计算服务环境
		<Linux就该这么学>自学笔记_ch22_使用openstackb部署云计算服务环境 文章主要内容: 了解云计算 Openstack项目 服务模块组件详解 安装Openstack软件 使 ... 
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
		<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ... 
- 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳
		<Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ... 
- 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳
		<Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ... 
- python自学笔记
		python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ... 
- JavaScript高级程序设计之自学笔记(一)————Array类型
		以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ... 
- vue 自学笔记记录
		vue 自学笔记(一): 知识内容: 安装vue ,创建vue实例,安装第一个组件,单项数据流 https://www.cnblogs.com/baili-luoyun/p/10763163.htm ... 
- JS自学笔记05
		JS自学笔记05 1.例题 产生随机的16进制颜色 function getColor(){ var str="#"; var arr=["0","1 ... 
随机推荐
- linux 升级yum对应的python
			这里记录一下linux 系统升级python对yum带来影响的解决办法 很多人在使用linux系统执行python任务的时候需要升级linux系统自带的python到高级版本.具体如何升级python ... 
- Python对数据库的增删改查
			#!/usr/bin/env python import MySQLdb DATABASE_NAME = 'hero' class HeroDB: # init class and ... 
- MySQL的四种事务隔离级别
			本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ... 
- eclipse从SVN检出项目之后,项目出错
			今天公司把我分配到另一个项目组工作,然后下午使用SVN检出项目,出了问题 1.从SVN检出项目之后,要导入jar包.结果右键项目找不到Build Path,问了大牛才知道是这里的问题,一共四个步骤解决 ... 
- Spring MVC 项目搭建 -3- 快速 添加 spring security
			Spring MVC 项目搭建 -3- 快速 添加 spring security 1.添加 spring-sample-security.xml <!-- 简单的安全检验实现 --> & ... 
- Web开发资料
			慢慢更新 1. Quackit 墙裂推荐!提供了一系列教程,bootstrap的模板也很好用. 2. Bootstrap 4 Cheat Sheet 好用,比官网更加一目了染.  3.Chart. ... 
- Azure PowerShell (14) 批量导出Azure ASM ACL和ARM NSG配置信息
			<Windows Azure Platform 系列文章目录> 最近有一个客户需求,需要批量导出Azure Classic VM的ACL (Access Control List), 还有 ... 
- javascript面向对象个人理解
			1. javascript面向对象特性:抽象性,封装性,继承性: 2. js中的对象:键值对的集合:比如说{key:value} 3.抽象性:用一个对象描述一个数据,需要抽取这个对象的核心数据:两个必 ... 
- CSS 选择器优先级问题
			<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ... 
- visual studio问题集合
			1.当前断点不会命中,还没有为该文档加载任何符号 打开visual 2010 工具->选项->调试->符号: 一.手动加载 点击 加载所有符号 即可.二.自动加载 点击"指 ... 
