SSH详解以及免密登录配置
Secure Shell
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,目的是在不安全的网络中为网络服务提供安全的传输环境。
SSH通过在网络中创立安全隧道来实现SSH用户端与服务器之间的连接。尽管任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统。
传统的网络服务
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,由于它们在网络上用明文传送口令和数据,别有用心的人非常容易即可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,而后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样”中间人”这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的”通道” 。
SSH用途
SSH以非对称加密实现身份验证。身份验证有多种途径,例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样即可以在不输入密码的情况下登录。任何人都可以自行生成密钥。公钥需要放在待访问的电脑之中,而对应的私钥需要由客户自行保管。认证过程基于生成出来的私钥,但整个认证过程私钥本身中不会传输到网络中。
在类Unix系统中,已许可登录的公钥通常保存在客户 /home 目录的 ~/.ssh/authorized_keys 文件中[9],该文件只由SSH使用。当远程机器持有公钥,而本地持有对应私钥时,登录过程不再需要手动输入密码。另外为了额外的安全性,私钥本身也能用密码保护。
私钥会保存在固定位置,也可以通过命令行参数指定(例如ssh命令的“-i”选项)。ssh-keygen是生成密钥的工具之一。
SSH也支持基于密码的身份验证,此时密钥是自动生成的。若用户端和服务端从未进行过身份验证,SSH未记录服务器端所使用的密钥,那么攻击者可以模仿服务器端请求并获取密码,即中间人攻击。但是密码认证可以禁用,而且SSH用户端在发现新密钥或者未知服务器时会向客户发出警告。
SSH的经典用途是登录到远程电脑中执行命令。除此之外,SSH也支持隧道协议、端口映射和X11连接。借助SFTP或者SCP协议还可以传输文件。
SSH使用用户端-服务器模型。
服务器端需要开启SSH守护进程以便接受远端的连接,而客户需要使用SSH用户端与其创立连接。标准端口中的22端口分配给了SSH服务[10]。
大多数现代操作系统(包括macOS、大部分Linux、OpenBSD、FreeBSD、Solaris等系统)都提供了SSH,但Windows系统未自带SSH程序。Windows客户可以使用Cygwin来创立SSH服务。SSH用户端种类很多,包括专有软件、免费软件和开源软件,例如PuTTY和传输文件专用的WinSCP等。
从云计算的角度上讲,SSH能够阻止少量因直接暴露在互联网而产生的安全问题,在处理连接问题上发挥了重要作用。SSH隧道可以在互联网、防火墙和虚拟机之间提供一个安全的通道[11]。
SSH基本架构
SSH协议框架中最主要的部分是三个协议:
传输层协议(The Transport Layer Protocol):传输层协议提供服务器认证,数据机密性,信息完整性等的支持。
客户认证协议(The User Authentication Protocol):客户认证协议为服务器提供用户端的身份鉴别。
连接协议(The Connection Protocol):连接协议将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用。
同时还有为许多高层的网络安全应用协议提供扩展的支持。
各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
安全验证
在用户端来看,SSH提供两种级别的安全验证。
第一种级别(基于密码的安全验证),知道帐号和密码,即可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。
第二种级别(基于密钥的安全验证),需要依靠密钥,也就是你必需为自己创立一对密钥,并把公有密钥放在需要访问的服务器上。用户端软件会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在你在该服务器的客户根目录下寻觅你的公有密钥,而后把它和你发送过来的公有密钥进行比较。假如两个密钥一致,服务器就用公有密钥加密“质询”(challenge)并把它发送给用户端软件。从而避免被“中间人”攻击。
在服务器端,SSH也提供安全验证。 在第一种方案中,主机将自己的公用密钥分发给相关的用户端,用户端在访问主机时则使用该主机的公开密钥来加密数据,主机则使用自己的私有密钥来解密数据,从而实现主机密钥认证,确保数据的保密性。 在第二种方案中,存在一个密钥认证中心,所有提供服务的主机都将自己的公开密钥提交给认证中心,而任何作为用户端的主机则只需保存一份认证中心的公开密钥即可以了。在这种模式下,用户端必需访问认证中心而后才能访问服务器主机。
如何新建密钥对呢?
1.查能否已存在密钥对,打开终端(Terminal):
输入:ls -al ~/.ssh
查看能否输出密钥对,假如有的话,会输出如下文件信息:id_rsa 和 id_rsa.pub
-rw——- 1 taoshilei staff 1679 Jun 25 22:34 id_rsa
-rw-r–r– 1 taoshilei staff 403 Jun 25 22:34 id_rsa.pub
2、假如没有,则需要我们手动创立
输入:ssh-keygen -t rsa -b 4096 -C "your_email"
ssh-keygen 是生成秘钥的工具之一。
SSH supports several public key algorithms(公开秘钥算法) for authentication keys.
1.rsa – A key size of at least 2048 bits is recommended for RSA; 4096 bits is better.
2.dsa – DSA in its original form is no longer recommended.(不推荐使用)
3.ecdsa – Only three key sizes are supported: 256, 384, and 521 (sic!) bits.(大多数ssh用户端支持)
4.ed25519 – Support for it in clients is not yet universal. (还没有普及)
The algorithm is selected using the -t option and key size using the -b option.
-t 参数指定加密算法,-b 参数指定加密的
用法如下:
ssh-keygen -t rsa -b 4096
将公钥发送到服务器
使用 ssh-copy-id 工具。
用法:
ssh-copy-id -i 公钥位置 user@host
之后会提醒输入密码进行认证。
在这之后,公钥就会被增加到 服务器上的 ~/.ssh/authorized_keys 文件了里面。
一旦在服务器上配置了公钥,服务器会允许任何具备私钥的用户端进行连接客户登录,在登录的过程中,用户端会通过数字签名交换来证实拥有私钥。
免密登录图解
创立密钥并增加到服务器上。
image.png
登录认证流程
值得注意的是:服务端的 .ssh目录权限必需是700(rwx——),authorized_keys文件的权限是600(rw——-)
image1.png
部分参考
https://www.ssh.com/ssh/keygen/#sec-What-Is-ssh-keygen
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » SSH详解以及免密登录配置