ssh是一套网络协议,目的在于保证安全的网络服务以及加密远程登录信息。linux的ssh命令是实现了ssh协议的一个操作,并且以sshd服务的形式在linux上运行。对ssh协议管理的开源软件是主流的openssh的工具
为什么要ssh
如果一个用户,从自己的笔记本,使用ssh协议登录另一台机器,我们就认为这个登录的方式是安全的,因为你的登录信息在传输晌梁的时候,是被加密了的,即使被黑客抓取到了信息,也无法破解你的密码,保证服务器的安全。
以前的运维人员都是用FTP协议telent工具进行服务器的远程登录,但是这睁游两种协议登录都是基于明文的传输,你的账号密码是以明文的形式,暴露在互联网中,很容易被黑客截取到数据,对服务器造成安全隐患。
因此,为了保证数据传输时的安全性、加密性,出现了两种主流的加密方式
(1)对称加密(使用同一个钥匙进行对数据加密,解密的时候,也得使用这个钥匙)
(2)非对称加密(有2把钥匙,一个是公钥,相宴早运当于锁,一个是私钥,相当于开锁的钥匙)
‘贰’ ssh原理及应用
简单说,SSH是一种网络协议,用于计算机之间的远程加密登录。
SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定,SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH安装容易、使用简单,而且比较常见,一般的Unix系统、Linux系统、FreeBSD系统都附带有支持SSH的应用程序包。Windows如果需要使用SSH,可以安装PuTTY或者Cygwin。
SSH 服务基于非对称加密(public-key cryptography,也称公开密钥加密)技术实现数据加密传输。该技术会生成一对数学相关的密钥, 其中一个用于对数据进行加密,而且只能用于加密,而另一个只能用于解密 。使用加密密钥加密后的数据,只能用对应的解密密钥才能解密。而且,只知道其中一个密钥,无法计算出另一个。因此,如果公开了一对密钥中的一个,并不会危害到另一个的秘密性质。通常把公开的密钥称为公钥(public key),而不公开的密钥称为私钥(private key)。
一般来说,非对称加密的应用场景有两个:
与对称密钥加密相比,非对称加密的优点在于不存在共享的通用密钥。由于解密用的私钥无需发送给任何用户,所以可以避免密钥被劫持或篡改。而加密用的公钥即便被劫持或篡改,如果没有与其匹配的私钥,也无法解密数据。所以,截获的公钥是没有任何用处的。
当前,SSH主要采用 RSA 算法(协议 V2 默认算法)和 DSA 算法(协议 V1 仅支持该算法)来实现非对称加密技术。
SSH连接时,整个交互过程如上图。,主要可以分为三个阶段
服务端在每次启动 SSH 服务时,都会自动检查 /etc/ssh/ 目录下相关密钥文件的有效性。如果相关文件检查发现异常,则会导致服务启动失败,并抛出相应错误信息。 如果文件相关不存在,则会自动重新创建。
默认创建的相关文件及用途说明如下:
当服务器SSH服务启动,客户端也安装了SSH后,就可以进行连接了。
后续登录校验及正常的数据传输,都会通过双向加密方式进行。相关交互说明如下:
从这个连接过程中,可以看出,主要使用到两个文件夹下的内容:
在连接中的两个过程:
之所以有多组密钥,是因为使用了不同的加密算法。
客户端接收到之后,会存储在 ~/.ssh/known_hosts 文件里,查看这个文件,可以看到有一行与服务器 ssh_host_ecdsa_key.pub 内容一致。
所以, ~/.ssh/authorized_keys 里表示本机可以被哪些机器访问
~/.ssh/known_hosts 里表示本机访问过哪些机器
SSH配置文件有两个,一个是 ssh_config ,一个是 sshd_config 。前者是客户端配置,后者是服务器配置。也就是说,如果本机是作为客户端,那么就修改第一个配置,如果本机是作为服务器,那么就修改第二个配置,
一般来说,和密钥登录的配置有关的有以下几个,如果密钥配置好后无法登录,尝试配置以下三项。
其他
传统的网络服务程序,如FTP、Pop和Telnet在传输机制和实现原理上是没有考虑安全机制的,其本质上都是不安全的。因为它们在网络上用明文传送数据、用户帐号和用户口令,别有用心的人通过窃听等网络攻击手段非常容易地就可以截获这些数据、用户帐号和用户口令。而且,这些网络服务程序的简单安全验证方式也有其弱点,那就是很容易受到"中间人"(man-in-the-middle)这种攻击方式的攻击。
所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被"中间人"一转手做了手脚之后,就会出现很严重的问题。中间人能够攻击,主要原因在于他能认识截取的信息,也能发出让接受者认识的信息。
使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。
最初的SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件包,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。
‘叁’ 非对称加密、SSH加密算法、数字签名简介
非对称加密算法的核心源于数学问题,它存在公钥和私钥的概念,要完成加解密操作,需要两个密钥同时参与。我们常说的“公钥加密,私钥加密”或“私钥加密, 公钥解密”都属于非对称加密的范畴。公钥加密的数据必须使用私钥才可以解密,同样,私钥加密的数据也 只能通过公钥进行解密。
相比对称加密,非对称加密的安全性得到了提升,但是也存在明显的缺点,非对称加解密的效率要远远小于对称加解密。所以非对称加密往往被用在一些安全性要求比较高的应用或领域中。
RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学者:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
它的原理较为简单,我们假设有消息发送方A和消息接收方B,通过下面的几个步骤,我们就可以完成消息的加密传递:
(1)消息发送方A在本地构建密钥对,公钥和私钥;
(2)消息发送方A将产生的公钥发送给消息接收方B;
(3)B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;
(4)反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。
由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。
如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。
当然,这种方式可能存在数据传递被模拟的隐患,我们可以通过数字签名等技术进行安全性的进一步提升。由于存在多次的非对称加解密,这种方式带来的效率问题也更加严重。可以详读这两篇文章:RSA 算法原理 (一) (二)
在SSH安全协议的原理中, 是一种非对称加密与对称加密算法的结合,先看下图:
这里进行一下说明:
(1)首先服务端会通过非对称加密,产生一个 公钥 和 私钥
(2)在客户端发起请求时,服务端将 公钥 暴露给客户端,这个 公钥 可以被任意暴露;
(3)客户端在获取 公钥 后,会先产生一个由256位随机数字组成的会话密钥,这里称为口令;
(4)客户端通过 公钥 将这个口令加密,发送给服务器端;
(5)服务器端通过 私钥 进行解密,获取到通讯口令;
之后,客户端和服务端的信息传递,都通过这个口令进行对称的加密。
这样的设计在一定程度上提高了加解密的效率,不过,与客户端服务端各构建一套密钥对的加解密方式相比,在安全性上可能有所下降。在上面所述的通过口令进行加密的过程中,数据也是可以被窃听的,不过由于密钥是256个随机数字,有10的256次方中组合方式,所以破解难度也很大。相对还是比较安全的。服务端和客户端都提前知道了密钥,SSH的这种方式,服务端是通过解密获取到了密钥。
现在知道了有非对称加密这东西,那数字签名是怎么回事呢?
数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
有了上述非对称加密算法,就可以实现这个需求:
‘肆’ SSH的工作原理
传统的网络服务程序,比如 FTP , POP , Telnet ,本质上都是不安全的,因为它们在网络上用明文传送数据、用户账号和用户口令,很容易受到 中间人 攻击方式的攻击,攻击者会冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
为了满足安全性的需求, IETF 的网络工作小组制定了 Secure Shell (缩写为 SSH ),这是一项创建在 应用层 和 传输层 基础上的安全协议,为计算机上的 Shell 提供安全的传输和使用环境。
SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄漏问题。通过 SSH 可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
本文将会重点讨论 SSH 中用到的加密算法和建立安全连接的过程。
为了保证信息传输的安全性, SSH 使用了对称加密、非对称加密和散列等技术。
对称密钥加密又称为对称加密、私钥加密、共享密钥加密,是密码学中一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。
SSH 使用对称密钥加密整个连接过程中传输的信息。值得注意的是,用户自己创建的public/private密钥对仅仅用于验证,不会用在加密连接上。对称加密允许对密码进行身份验证,以防止第三方窥探。
共享密钥通过密钥交换算法生成,它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。客户端和服务端都参与了这个过程,过程的细节将在后面阐述。
生成的密钥将用来加密这次会话过程中客户端和服务端传输的数据。这个过程会在验证客户身份之前完成。
SSH 支持多种对称密钥算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客户端和服务端可以配置采用算法的列表。客户端列表中第一个能被服务端支持的算法将被采用。
比如在Ubuntu 14.04上,客户端和服务端默认的配置如下: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256 , arcfour128 , [email protected] , [email protected] , [email protected] , aes128-cbc , blowfish-cbc , cast128-cbc , aes192-cbc , aes256-cbc , arcfour 。
也就是说,如果两台Ubuntu 14.04采用默认配置,它们总是会采用 aes128-ctr 算法来加密连接。
在非对称加密方法中,需要一对密钥,一个是私钥,一个是公钥。这两个密钥数学相关。用公钥加密后所得的信息,只能用私钥才能解密。如果知道了其中一个,并不能计算另外一个。因此,如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。
SSH 在一些地方使用了非对称加密。
在密钥交换过程中使用到了非对称加密。在这个阶段,客户端和服务端生成临时密钥对,并且交换公钥来生成共享密钥。
在身份验证的过程中也使用了非对称加密。 SSH 密钥对用来向服务端验证客户端身份。客户端创建一对密钥,然后将公钥上传到远程服务器上,写入文件 ~/.ssh/authorized_keys 。
在创建共享密钥后,客户端必须向服务端证明身份。服务端会使用文件中的公钥加密一段信息,并将加密后的信息发送给客户端。如果客户端可以能够破解这段信息,那么就能够证明自己拥有相关的私钥。之后服务端会为客户端设置shell环境。
散列是电脑科学中一种对资料的处理方法,它通过某种特定的算法将要检索的项与涌来检索的索引关联起来,生成一种便于搜索的数据结构(散列表)。它也常用做一种资讯安全的方法,由一串资料中经过散列算法计算出来的资料指纹,来识别档案和资料是否有被篡改。
SSH 主要使用了散列消息认证码(Keyed-hash message authentication code,缩写为HMAC),来确认消息没有被篡改。
上面提到的对称加密协商过程中,会使用消息认证码(MAC)算法。这个算法会从客户端支持的算法中选出。
在密钥协商完成后,所有的消息都必须携带MAC,用于通信双方验证消息的一致性。MAC值由共享密钥,消息的分组序列和实际消息内容计算得到。
在对称加密区域之外,MAC本身作为分组的最后部分被发送。研究者通常建议先机密数据,然后计算MAC
SSH 协议采用客户端-服务端模型对两方进行身份验证,并对它们之间的数据进行加密。
服务端在指定端口监听连接请求。它负责协商安全连接,认证连接方,并为客户端生成正确的shell环境。
客户端负责协商安全连接,验证服务器的身份是否与以前记录的信息相匹配,并提供凭证进行身份验证。
SSH会话分为两个阶段。第一个是同意和建立加密来保护未来的沟通。第二个阶段是对用户进行身份验证,并发现是否应该授予对服务器的访问权限。
当客户端发起请求后,服务端返回支持的协议版本。如果客户端可以匹配其中一个协议版本,则连接继续。服务端会提供它的公共主机密钥,客户端可以用这个密钥来验证服务端是否合法。
此时,通信双方采用迪菲-赫尔曼算法来协商会话密钥。
该算法的大致过程如下:
用于其余连接的共享密钥加密被称为二进制数据包协议。上述过程允许双方平等地参与生成共享密钥。
生成的密钥是对称密钥,这意味着用于加密消息的密钥也可以用于解密。其目的是将后面的通信包装在不能被外部人员解密的加密隧道中。
在生成会话密钥后,就开始进行用户身份验证。
根据服务器接受的方式,有几种不同的方法可用于身份验证。
最简单的方法是密码验证,其中服务器要求客户端输入尝试登陆账号的密码。密码是通过协商加密发送的。
虽然密码被加密,但由于密码的复杂性受到限制,因此通常不建议使用此方法。与其他身份验证的方法相比,自动脚本相对容易攻破正常长度的密码。
最为推荐的选择是使用SSH密钥对。SSH密钥对是非对称密钥。
公钥用于加密只能用私钥解密的数据。公钥可以自由共享,因为没有从公钥中导出私钥的方法。
验证流程如下:
可以看到,密钥的不对称性允许服务端使用公钥加密消息给客户端。然后,客户端可以通过正确解密消息来证明它拥有私钥。
笔者本科专业是信息安全,不过毕业后并没有从事安全行业,工作4年课堂上学习的知识基本忘的差不多了。
而SSH算是工作中最常用到的东西之一,其工作原理涉及不少密码学的东西。
写这篇博文,一是希望能帮助读者了解SSH,二也是希望自己能捡起一些专业知识。在互联网/软件相关行业里,不论是否从事安全工作,了解这些东西都是很有必要的。
‘伍’ ssh使用详解
简单来说,ssh是一种 网络协议 ,用于计算机之间的加密登录。如果一个用户从本地计算机,使用ssh协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
SSH 之所以安全是采用了公钥加密的方式,通过客户自己签发公钥加密用户密码,再通过主机持有的私钥解密;不像 HTTPS 协议存在证书管理中心CA用于验证公钥的合法性,因此,存在被中间人劫持的风险,即劫持登录请求发送篡改的公钥来截获用户登录密码,俗称”中间人攻击“;
不过 SSH 存在一套自有的验证方式:口令验证及密钥验证,可有效避免大部分的攻击;
使用上述命令测试连接性及验证流程;
通过 ssh-keygen 工具生成本地公钥文件,常用命令如下:
在 $HOME/.ssh/ 目录下,会新生成两个文件: id_rsa.pub 和 id_rsa 。 id_rsa.pub 是公钥, id_rsa 是私钥,其中 id_rsa 为默认文件名称,若如上图指定了文件路径及名称,则按照指定路径及文件名生成;
说明:若 ssh 登录使用密钥验证方式登录,则需要输入私钥的密码(生成密钥时指定的密码),若使用 ssh-agent 代理,则在同一个 session 会话下,只需要输入一次私钥密码即可,由 ssh-agent 帮我们代理,避免每次登录都需要输入私密码;
若登录时未开启,可手动开启 ssh-agent ,可通过如下命令:
添加生成的 SSH key 到 ssh-agent :
查看添加的 SSH key :
若需要免密登录,则需要将用户的 public key 文件内存追加复制到登录主机的 authorized_keys 配置文件中(默认路径为 ~/.ssh/authorized_keys ),或者直接通过 ssh--id 工具完成,具体如下:
使用上述命令后即可实现 免密登录 ;
ssh 配置包括系统级别的(针对客户端的默认为 /etc/ssh/ssh_config ,针对服务端的``/etc/ssh/sshd_config )及用户级别的配置文件(默认为 ~/.ssh/config`);且配置文件存在优先级,低优先级的配置项可视作默认值;而高优先级的配置项则会覆盖默认值。按优先级,有如下排序:
/etc/ssh/config 配置文件选项如下:
/etc/ssh/sshd_config 配置文件选项如下:
常用的选项如下:
ssh -T [email protected] 验证连接性,成功如下:
ssh配置文件详解
git-ssh 配置和使用
ssh-keygen - Generate a New SSH Key
最佳搭档:利用 SSH 及其配置文件节省你的生命
‘陆’ ssh和telnet区别
telnet是明文传输,而ssh是加密传输,相对来说比较安全。
1.ssh机制第一种是路由器公钥加密,私钥解密。ssh路由器会产生一个公钥public,一个明圆穗私钥pri.当客户端通过ssh登录到设备的时候,路由器会将自己的公钥发送给客户端,客户端接受并保存这个公钥,接下来的过程就是加密,客户端输入用户名和密码的过程是通过路由器的公钥来加密的,客户端输入完成将这个在发送给路由器,路由器通过自腔巧己的私钥来解密这个公钥。再将这个用户名和密码发送到本地进行认证。认证成功,整个登录即ok。激卜
2.ssh机制第二种是路由器产生一个公钥秘钥,客户端也产生一个公钥秘钥。当客户端试图登录路由器,客户端输入正确的用户名admin后,路由器发现admin用户被绑定到名称为AR1的rsa秘钥。所以路由器会将此公钥发送给客户端进行验证,因为客户端有对应的私钥可以解密公钥,故认证成功。难点:客户端的公钥如何产生,客户端的公钥如何导入路由器。路由器的公钥如何产生,路由器的公钥如何导入客户端。