ssh登录的认证方式

ssh登录的认证方式,第1张

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提供两种级别的安全验证。

对于第二种级别,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有用户的私人密匙)。但是整个登录的过程可能需要10秒。

将本地用户生成的公钥推送至远程服务器后,远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用ssh-copy-id命令,改用下面的命令,来解释公钥的保存过程:

输入命令 ssh user@host ,然后根据提示输入远程服务器的登录密码

也可在配置文件/etc/ssh/ssh_config 中设置user和host(ip), 来简化命令, 配置如下:

配置后, 登录请求时只需输入如下命令:

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

公钥登录原理 :就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果解密验证成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

执行上述命令首先会让你输入生成密钥的文件名: myPemKey (自定义),之后一路回车。

配置后,登录远程服务器时只需输入一下命令,便可直接登录成功:

修改后重启ssh服务

则远程连接时指定端口

(1) 通过iptables设置ssh端口的白名单,如下设置只允许192.168.1.0/24网段的客户机可以远程连接本机

(2) 通过/etc/hosts.allow里面进行限制(如下),/etc/hosts.deny文件不要任何内容编辑,保持默认!

例如:

修改远程服务器ssh服务配置文件/etc/ssh/sshd_config

修改远程服务器配置文件/etc/ssh/sshd_config, 如下:

如果本机系统有些账号没有设置密码,而ssh配置文件里又没做限制,那么远程通过这个空密码账号就可以登陆了,这是及其不安全的,所以一定要禁止空密码登陆。

修改远程服务器配置文件/etc/ssh/sshd_config,如下:

参考:

登录流程

密钥登录比密码登录安全,主要是因为他使用了非对称加密,登录过程中需要用到 密钥对 。整个登录流程如下:

远程服务器持有公钥,当有用户进行登录,服务器就会随机生成一串字符串,然后发送给正在进行登录的用户。

用户收到远程服务器发来的字符串,使用与 远程服务器公钥配对的私钥 对字符串进行加密,再发送给远程服务器。

服务器使用公钥对用户发来的加密字符串进行解密,得到的解密字符串如果与第一步中发送给客户端的随机字符串一样,那么判断为登录成功。

整个登录的流程就是这么简单,但是在实际使用 ssh 登录中还会碰到一些小细节,这里演示一遍 ssh 远程登录来展示下这些细节问题。

生成密钥对

使用ssh-keygen就可以直接生成登录需要的密钥对。ssh-keygen是 Linux 下的命令,不添加任何参数就可以生成密钥对。

➜  ~ ssh-keygenGenerating public/private rsa key pair.Enter fileinwhichto save the key (/home/jaychen/.ssh/id_rsa):#1Enter passphrase (emptyforno passphrase):#2Enter same passphrase again:#3

执行ssh-keygen会出现如上的提示,在#1处这里提示用户输入生成的私钥的名称,如果不填,默认私钥保存在/home/jaychen/.ssh/id_rsa文件中。这里要注意两点:

生成的密钥,会放在 执行ssh-keygen命令的用户的家目录 下的.ssh文件夹中。即$HOME/.ssh/目录下。

生成的公钥的文件名,通常是私钥的文件名后面加.pub的后缀。

#2处,提示输入密码,注意这里的密码是用来保证私钥的安全的。如果填写了密码,那么在使用密钥进行登录的时候,会让你输入密码,这样子保证了如果私钥丢失了不至于被恶意使用。 话是这么说,但是平时使用这里我都是直接略过。

#3是重复#2输入的密码,这里就不废话了。

生成密钥之后,就可以在/home/jaychen/.ssh/下看到两个文件了(我这里会放在/home/jaychen下是因为我使用 jaychen 用户来执行ssh-keygen命令)

➜  .ssh ls

total 16K

drwx------ 2 jaychen jaychen 4.0K 12月  7 17:57 .

drwx------ 9 jaychen jaychen 4.0K 12月  7 18:14 ..

-rw------- 1 jaychen jaychen 1.7K 12月  7 17:57 id_rsa.github

-rw-r--r-- 1 jaychen jaychen 390 12月  7 17:57 id_rsa.github.pub

生成的私钥还要注意一点: 私钥的权限应该为rw-------,如果私钥的权限过大,那么私钥任何人都可以读写就会变得不安全。ssh 登录就会失败。

首次 ssh 登录

登录远程服务器的命令是

ssh 登录用户@服务器ip

这里开始要注意两个用户的概念:

本地执行这条命令的用户,即当前登录用户,我这里演示的用户名称是 jaychen。

要登录到远程服务器的用户。

在开始登录之前,我们要首先要把生成 公钥 上传到服务器。

公钥的内容要保存到 要登录的用户的家目录下的.ssh/authorized_keys 文件中。假设你之后要使用 root 用户登录远程服务器,那么公钥的内容应该是保存在/root/.ssh/authorized_keys中。注意authorized_keys文件是可以保存多个公钥信息的,每个公钥以换行分开。

上传完毕之后,执行

ssh root@远程服务器ip

这个时候,如上面说的,远程服务器会发送一段随机字符串回来,这个时候需要使用私钥对字符串进行加密。而这个私钥会去 执行该命令的用户的家目录下的.ssh目录 读取私钥文件,默认私钥文件为id_rsa文件。即$HOME/.ssh/id_rsa文件。假设在生成密钥的时候对私钥进行了加密,那么这个时候就需要输入密码。

上面的流程用户登录的时候是不会感知的,ssh 在背后完成了所有的校验操作,如果密钥匹配的话,那么用户就可以直接登录到远程服务器,但是如果是 首次登录 的话,会出现类似下面的提示:

➜  .ssh ssh root@192.168.1.1The authenticityofhost'192.168.1.1 (192.168.1.1)' can't be established.ECDSAkeyfingerprintisSHA256:61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg.Are you sure you wanttocontinueconnecting (yes/no)?

这句话的意思是,远程服务器的真实身份无法校验,只知道公钥指纹(公钥的 MD5 值)为61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg,是否真的要建立连接。出现上面的提示是因为避免存在 中间人攻击 。

中间人攻击

中间人攻击的前提是,你第一次登录一台远程服务器,你除了用户名、用户名对应的公钥私钥以及服务器 ip 之外,对远程服务器丝毫不了解的情况下。假设你 ssh 远程登录 192.168.1.1 的远程主机,在连接过程中被第三者拦截,第三者假冒自己为 192.168.1.1 的主机,那么你就会直接连接到其他人的服务器上。这就是中间人攻击。

为了避免中间人攻击,ssh 在首次登录的时候会返回公钥指纹,用户需要自己手动去 比对你要登录的远程服务器的公钥的公钥指纹和 ssh 返回的公钥指纹是否一样 。

经过比较公钥指纹,确认该服务器就是你要登录的服务器,输入yes之后就可以成功登录。整个登录流程结束。

known_hosts 文件

第一次登录之后,在本机的$HOME/.ssh/目录下就会生成一个known_hosts的文件,内容类似下面

➜  .ssh cat known_hosts192.168.1.1ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOPKYWolOYTDevvBR6GV0rFcI0z/DHZizN5l/ajApsgx+UcOOh51liuyBRRCIyF+BR56Le0lP0Pn6nzvLjbqMqg=

这个文件记录了远程主机 ip 和远程主机对应的公钥指纹,那么在下次登录的时候,远程主机发送过来的公钥指纹,直接和known_hosts文件中对应 ip 的公钥指纹比较即可。

config 配置

很多时候,我们开发可能需要连接多台远程服务器,并且需要配置 git 服务器的私钥。那么这么多的服务器不能共用一套私钥,不同的服务器应该使用不同的私钥。但是我们从上面的连接流程可以看到,ssh 默认是去读取$HOME/.ssh/id_rsa文件作为私钥登录的。如果想要不同的服务器使用不同的私钥进行登录,那么需要在.ssh目录下编写config文件来进行配置。

config的配置很简单,只要指明哪个用户登录哪台远程服务器需要使用哪个私钥即可。下面给出一个配置示例。

Host github.com

           User jaychen

            IdentityFile ~/.ssh/id_rsa.github

Host 192.168.1.1

             User ubuntu

IdentityFile ~/.ssh/id_rsa.xxx

上面config文件字段含义如下:

Host 指明了远程主机的 ip,除了使用 ip 地址,也可以直接使用网址。

User 指的是登录远程主机的用户。

IdentityFile 指明使用哪个私钥文件。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/23575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-16
下一篇2023-02-16

发表评论

登录后才能评论

评论列表(0条)

    保存