本文目录:
- 1、ssh密钥对登录安全吗?原理篇
- 2、ssh使用秘钥登录服务器
- 3、ssh密钥对登录安全吗?实践篇
- 4、渗透测试-SSH秘钥登录
- 5、ssh登录的认证方式
- 6、SSH详解-3.密钥登陆
ssh密钥对登录安全吗?原理篇
在 《使用wireshark分析ssh口令登录细节》 和 《ssh工具,开发者必须有所了解》 这两篇文章中,我们知道了SSH登录有两种登录验证方式,其中口令登录方式使用简单,但会遇到安全问题,比如遇到中间人攻击,就会泄漏服务器的root口令。所以从安全的角度来看,建议使用另外一种登录验证方式,这就是密钥对登录方式。
密钥对验证方式对于初学者来说并不是很友好,所以我分两篇文章把这个事情说清楚,本文主要从原理的角度讲解,让你了解这种方式运作的流程,下一篇从实战的角度手把手教你登录ssh服务器。
对于开发者来说,也请务必学会使用密钥对方式登录服务器,因为现在很多应用和服务推荐这种方式,比如Github就可以使用密钥对方式连接,AWS默认就禁止口令登录。
网上有很多文章介绍ssh口令登录,但客观的说,很多文章讲错了。
很多人大概是这样理解的,客户端生成一个公开密码学算法的密钥对(注意不是ssh服务器端的密钥对),然后将公钥放到ssh服务器上的 authorized_keys 文件中(潜台词就是你有ssh权限才能操作)。
然后ssh如何登录呢?在连接过程中,会将客户端密钥对的公钥发送给ssh服务器,服务器在 authorized_keys 文件中匹配到这个公钥,就认为登录成功了,其实这个理解是有问题的。
核心的两个问题:
知道了这个结论后,我们看看详细的登录验证过程,在 《使用wireshark分析ssh口令登录细节》 中说过,ssh登录分为两个阶段,不管是哪一种登录验证,第一阶段的过程都是相同的,区别在于第二阶段。
有的同学说,这次你为啥不用wireshark分析了?因为第二阶段的消息传递都是加密保护的,并不能解密出具体的消息格式,这一点和TLS协议非常不同,TLS协议有多种方式可以解密出明文,而SSH协议是不支持的,所以wireshark只能显示密文。
基于这一点,本文就不用wireshark分析了,简单谈一谈ssh密钥对登录的流程,要经过多个消息交互。
第二阶段具体的流程如下:
1:ssh客户端生成一个 key ID(这个ID是基于密钥对的公钥算出来的,具体格式未知),再一次说明,这个密钥对不是服务器的,使用会话密钥加密后发送给服务器端。
2:服务器端从 authorized_keys 文件中匹配 key ID,如果匹配,此时还不能证明这个ssh客户端是真正的客户端密钥对的主人。
3:服务器端生成一个随机数,然后用客户端的公钥加密后发送给客户端。
4:客户端使用自己的私钥解密出服务器端的随机数,注意,如果某个攻击者仅仅有客户端的公钥,它是无法解密出的,因为攻击者没有对应的私钥。
5:为了向服务器端证明它能解密出这个随机数,客户端将解密出的随机数用会话密钥加密,将得到的值进行MD5运算。然后将这个值发送给服务器,以便响应(4)阶段的消息。
6:服务器端对原始随机数也使用会话密钥加密,再进行MD5计算,如果得出的值和(5)阶段客户端发送的一致,代表双方的登录校验通过。
服务器端使用服务器密钥对公钥指纹像客户端证明它就是真正的服务器端;而客户端使用它自己的密钥对向服务器证明它就是真实的客户端。
由于在验证过程中,客户端密钥对的公钥不会传输,所以即使遇到中间人攻击,攻击者也不会获取到公钥(不考虑客户端机器本身遇到攻击了)。
如果客户端的公钥曾经泄漏过,攻击者也不能成功登录ssh服务器,原因是攻击者没有私钥,无法解密出随机数,从而不能完成验证。
当然如果客户端密钥对公钥和私钥全部泄漏了,那就当我什么也没说,所以定期更换密钥对还是有好处的。
基于以上两点,我认为ssh密钥对登录是安全的,也是推荐的。
ssh使用秘钥登录服务器
ssh有两种登录服务器的方式:
他负责管理ssh的口令登录。想要只通过密钥登陆的话,可以取消注释,并将yes改为no。
使用密钥登陆前需要理清楚2个概念:公钥(id_rsa.pub)和私钥(id_rsa)。
公钥负责加密,私钥负责解密。对称密钥加密,又称私钥加密,即信息的发送方和接收方用一个密钥去加密和解密数据。它的最大优势是加/解密速度快,适合于对大数据量进行加密,但密钥管理困难。
非对称密钥加密系统,又称公钥密钥加密。它需要使用一对密钥来分别完成加密和解密操作,一个公开发布,即公开密钥,另一个由用户自己秘密保存,即私用密钥。信息发送者用公开密钥去加密,而信息接收者则用私用密钥去解密。公钥机制灵活,但加密和解密速度却比对称密钥加密慢得多。
1.生成密钥对:
你学废了吗~
ssh密钥对登录安全吗?实践篇
在上一篇文章 《ssh密钥对登录安全吗?原理篇》 了解了ssh密钥对登录原理后,接下去就是实践的问题了,这是大部分人更关心的知识,其中也有一些隐藏的陷阱。
首先 要生成一对密钥对,ssh-keygen 是 ssh 工具集中的一个工具,用于生成密钥对:
-b 是密钥对的长度,越长越安全,但运算速度就会相应变慢,在这个例子中生成的是一个 RSA 密钥对,其中 id_rsa 是公钥(也可以自定义名字),公钥也叫做 identity 文件,需要放到 ssh 服务器 ~/.ssh/authorized_keys 文件中(其中 ~ 符号表示想要以那个属主用户的身份(比如 root 用户)登录ssh服务器),用于证明这个密钥对拥有访问 ssh 服务器的权限。
在 ssh 登录的时候,ssh 客户端需要读取公钥文件,但不会传输。
那么 passphrase 是什么呢?是一个口令,用于保护密钥对,有了口令,即使密钥对文件泄漏了,由于攻击者没有口令解密,那么密钥对仍然是安全的。
如果图省事,口令可以为空,如果不为空,则ssh登录的时候需要输入口令。
运行完成后,生成的密钥对默认会保存到客户端属主目录 ~/.ssh 下,为什么生成在这个目录呢?因为登录验证的时候 ssh 客户端会读取属主目录下的公钥文件。
接下去查看生成的密钥对文件,运行如下命令:
id_rsa.pub 文件就是公钥,id_rsa 是私钥,需要注意的就是这二个文件的权限问题,私钥权限必须是 600,严格限制权限,而 id_rsa 权限可以适当放大,对于客户端,~/.ssh 的目录权限不会影响 ssh 登录,但从安全的角度看,请保持 700 权限。
公钥文件上传到ssh服务器后,其实就可以删除了,因为私钥包含公钥。
接下去 就是要将公钥放到 ssh 服务器上,一般有三种方法:
1:ssh-copy-id
ssh-copy-id 工具专门用于将公钥上传到ssh服务器的authorized_keys文件中,这个工具通过口令登录的方式上传公钥,运行很简单:
ssh-copy-id 默认会上传 ~/.ssh/ 目录下公钥文件(即 identity 文件 ),ssh服务器上可能有多个用户,那上传到那个用户的.ssh目录下呢?这根据 username 而定,比如 /home/username 目录。
如果 identity 文件不在 ~/.ssh 目录下或者名称不是默认的 id_rsa ,也可以通过 -i 参数指定文件,比如:
如果ssh服务器上的 ssh 打开 StrictModes 严格模式,这个工具会更改ssh服务上的 ~/.ssh目录, ~/.ssh/authorized_keys 文件的权限。
重点要注意的是,ssh服务器用户的.ssh目录必须是700 权限,authorized_keys 文件也必须是 700 权限,否则 ssh 登录验证会失败,下面会重点描述这个问题。
2:手动上传公钥
如果ssh服务器关闭了口令登录方式,就必须使用这种方式了,重点要注意权限问题。
首先拷贝 ~/.ssh/id_rsa.pub 内容,然后登录到ssh服务器上,再将剪贴板的内容粘帖到 ~/.ssh/uthorized_keys 文件中(如果不存在就创建对应的目录和文件)
最后运行下列命令:
尽量保证目录和文件只有对应的ssh用户才能访问,否则ssh登录会失败,原因就是为了保障安全,你总不希望自己的公钥被ssh服务器上的其他用户看到把?
3:使用ssh口令登录方式手动上传公钥
如果机器上没有 ssh-copy-id 工具(Windows 10 原生 ssh 客户端就没有),可采用这种方式,其实也很简单,就一条命令,但能让你了解详细的工作过程,所以比较推荐这种方式:
最后 就是 ssh 登录服务器,验证自己的公钥是否成功上传了,执行下列命令:
当然也可以指定私钥文件,比如 :
如果登录的时候还是让你输入口令,则很有可能是ssh服务器上的 ~/.ssh/authorized_keys 权限有问题,请检查下。
如果还是遇到登录失败的问题,可以在ssh服务器上查看日志,比如:
相关文章:
渗透测试-SSH秘钥登录
最近渗透遇到许多linux服务器,在多方信息收集无果后,想到了ssh的秘钥登录。但诸多知识点有点混乱,趁此时间再次复现一遍。
ssh中文名称叫安全外壳协议,是一种加密的网络传输协议。我们现在经常说的ssh指的是openssh,是对ssh协议的实现。
我们都知道ssh提供了两种安全级别的认证,一种口令认证,一种秘钥认证。
基于口令的认证时需要输入正确的用户名和密码,且连接加密。
ssh的连接过程为:
这里指的就是无法确定host的真实性,只知道它的公钥指纹。问你是否连接,
yes后就需要远程服务端的用户密码。密码输入正确后才可以登录。
当远程服务端的公钥被接受以后,就会保存在当前用户的/.ssh/known_hosts之中。下次再连接这台主机时,系统就会知道公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
现在企业更流行使用秘钥登录。修改远程服务端的 /etc/ssh/sshd_config 配置文件,
重启sshd服务,就可以禁用密码验证。
ssh秘钥登录,其实就是"公钥登录",首先需要用户自己生成一对公钥和私钥。然后用户将自己的公钥放在远程服务端上。此时远程服务器持有公钥,用户持有私钥。满足"公钥加密,私钥解密"。
过程如下:
该命令用于生成秘钥对。
需要注意的是:
生成后可以在当前用户的.ssh文件夹下看到。
ssh-copy-id 命令将公钥写到远程服务端kali的test用户下的/.ssh/authorized_key文件中。
如果是第一次登录,用户也会在/.ssh/文件夹下创建known_hosts,记录了远程服务端的ip和对应的公钥指纹。
连接时默认去查找当前用户/.ssh/文件下是否存在私钥,如果没有需要指定私钥进行连接。
如果设置了证书的密码,则在远程服务器时需要输入密码。
在 /etc/hosts 可以配置主机名和IP地址
此时就可以直接ssh主机名。
当渗透测试拿到一台linux服务器,查找/.ssh/文件夹下是否存在私钥文件,或*.pub文件,因为私钥和公钥一块生成。结合known_hosts文件,可以去连接未知的机器。
反之,如果拿到的机器只存在known_hosts文件,则无法利用。该文件只能说明曾经接收过公钥。
如果拿到的机器只有authorized_key文件,则证明存在用户连接过该机器。
ssh登录的认证方式
ssh登录的认证方式有:Password、RSA、DSA、ECC、Password-RSA、Password-DSA、Password-ECC和ALL。
1、Password认证
Password认证是一种基于“用户名+口令”的认证方式。通过AAA为每个SSH用户配置相应的密码,在通过SSH登录时,输入正确的用户名和密码就可以实现登录。
2、RSA认证
RSA认证是一种基于客户端私钥的认证方式。RSA是一种公开密钥加密体系,基于非对称加密算法。RSA密钥也是由公钥和私钥两部分组成,在配置时需要将客户端生成的RSA密钥中的公钥部分拷贝输入至服务器中,服务器用此公钥对数据进行加密。
3、DSA认证
DSA认证是一种类似于RSA的认证方式,DSA认证采用数字签名算法进行加密。
4、ECC认证
ECC认证是一种椭圆曲线算法,与RSA相比,在相同安全性能下密钥长度短、计算量小、处理速度快、存储空间小、带宽要求低。
5、Password-RSA认证
SSH服务器对登录的用户同时进行密码认证和RSA认证,只有当两者同时满足情况下,才能认证通过。
6、Password-DSA认证
SSH服务器对登录的用户同时进行密码认证和DSA认证,只有当两者同时满足情况下,才能认证通过。
7、Password-ECC认证
SSH服务器对登录的用户同时进行密码认证和ECC认证,只有当两者同时满足情况下,才能认证通过。
8、ALL认证
SSH服务器对登录的用户进行公钥认证或密码认证,只要满足其中任何一个,就能认证通过。
SSH结构层次
1、表示层
表示层主要涉及Struts的功能,在这一层,首先通过JSP页面实现交互界面,负责传送用户请求和接收响应,然后Struts根据配置文件将接收到的用户请求委派给相应的Action处理。
2、业务逻辑层
业务层主要涉及Spring的功能,在这一层,管理服务组件负责向Struts配置好的对应Action提供业务模型,该组件的对象数据处理组件完成业务逻辑,并提供事务处理等容器组件以提升系统性能和保证数据的完整性。
3、数据持久层
持久层主要涉及Hibernate的功能,Hibernate实现了数据持久化功能,使得程序员可以通过面向对象地编程思维来操作数据库。在这一层中,依赖于Hibernate的对象化映射和数据库交互,处理Spring中的DAO组件请求的数据,并返回处理结果。
SSH详解-3.密钥登陆
SSH详解-1.ssh基础知识
SSH详解-2.ssh基本用法
SSH详解-3.密钥登陆
SSH详解-4.多个ssh公钥
在上一篇中我们了解到了ssh基本用法,ssh通过密码进行登录。密码登录存在很多问题。密码太简单,又不安全。密码太复杂,不容易记,而且每次登录都要输入很麻烦。于是就有了密钥登陆。
什么是密钥(key)?
ssh密钥登录采用的是 非对称加密 。
非对称密钥加密系统,又称公钥密钥加密。它需要使用不同的密钥来分别完成加密和解密操作,一个公开发布,即公开密钥(public key)和,另一个由用户自己秘密保存,即私用密钥(private key)。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。
了解完密钥后,接下来看看密钥登录的过程,SSH 密钥登录分为以下的步骤。
第零步,准备步骤客户端通过 ssh-keygen 生成自己的公钥和私钥,并将公钥放入远程服务器的指定位置。
第一步,用户客户端向服务器发起SSH登录的请求。
第二步,服务器收到用户SSH登录的请求,服务器生成一些随机数据发送给客户端。
第三步,客户端接收到服务器发过来的数据,客户端使用私钥对数据进行签名后再返回给服务器。
第四步,服务器收到客户端加密后的数据,使用对应公钥进行解密。然后判断解密后的数据是否与原始数据一致,如果一致就允许用户登录。
ssh-keygen 是OpenSSH提供的一个命令行工具,用于生成密钥登录所需的公钥和私钥。
在上面的例子中,我使用了-t参数来指定加密算法,一遍会选择rsa或者dsa。
第一个问题,问我要保存在哪?(直接Enter默认会保存在~/.ssh/id_rsa中)因为我之前已经生成过密钥了,我就保存在tenxun里面。
第二个问题,询问是否要为私钥文件设定密码保护(passphrase)。这样的话,即使入侵者拿到私钥,还是需要破解密码。如果为了方便,不想设定密码保护,可以直接按回车键,密码就会为空。
最后,就会生成私钥和公钥,屏幕上还会给出公钥的指纹,以及当前的用户名和主机名作为注释,用来识别密钥的来源。
从上面的公钥中我们可以看到末尾的公钥注释 23696@DESKTOP-GKRBCVI
公钥注释可以用来识别不同的公钥,表示这是哪台主机(DESKTOP-GKRBCVI)的哪个用户(username)的公钥。
注意 ,公钥只有一行。因为它太长了,显示的时候可能自动换行了。
OpenSSH 规定,用户公钥保存在服务器的 ~/.ssh/authorized_keys 文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。
-i 指定要上传公钥(公钥文件可以不指定路径和 .pub 后缀名),user是所要登录的用户名,hostname是主机名,这两个参数与ssh 登录命令是一致。
特别注意 ,不是把公钥上传上去就行了,还需要把 authorized_keys 文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH服务器可能会拒绝读取该文件,导致密钥登录失效,登录的时候还需要输入密码。
提到输入密码,如果再生成公钥和私钥的时候设置了密码,使用密钥登录的时候也需要输入私钥的密码,这样可以防止他人非法窃取了私钥。
私钥设置了密码以后,每次使用都必须输入私钥密码,这个问题可以使用 ssh-agent 命令解决。
百度百科-密钥
Git - 生成 SSH 公钥 (git-scm.com)
ssh(1) - OpenBSD manual pages
【ssh密钥登录】的内容来源于互联网,如引用不当,请联系我们修改。
网友留言: