当前位置:网站首页>ssh中的密码登录和密钥登录

ssh中的密码登录和密钥登录

2022-08-11 05:32:00 欢喜躲在眉梢里

一、ssh中的加密

1、对称加密

这种加密方式是大家都知道的,发送方和接收方都是一样的。

加解密的钥匙都是同一把,怎么样安全的保存这个密钥,这个密钥在需要加密的机器之前都是共享?很难保证这个密钥不被泄漏。

2、非对称加密

生成一对公私钥,私钥自己保管,公钥可以给其他人。

公私钥对是成对存在的,这连个密钥互不相同,两个密钥可以互相加密和解密。

一个用于加密,一个用于解密。具体哪个为私钥,哪个为公钥就看使用者自己管理。

注意:

①使用公钥进行加密,私钥解密,基本用于数据加密(相当于一对钥匙,对公钥加密,私钥需要对公钥解密)(解密时一个人知道

使用私钥加密公钥解密:用于数据认证(验证)解密时多个人知道,数据安全性不高。

ssh都是基于公钥加密。

公私钥都是客户端生成,要连接服务器,就要把公钥给服务器,就能免密登录。存放在家目录下面的.ssh下,没有的话需要自己进行创建。

密钥认证:公钥和私钥是一对文件,文件里面是一段字符串,告诉加密算法加密的时候,使用的参数:salt 盐值

public key 公开

private key 私有的

[[email protected] ssh]# cd ~/.ssh
[[email protected] .ssh]# ls
authorized_keys  config  id_rsa  id_rsa.pub  known_hosts
[[email protected] .ssh]# pwd
/root/.ssh

know_hosts是存放客户机使用ssh第一次连接服务器时产生公钥存放的位置,它会将服务器上sshd守护进程的公钥复制到本地存放到本地,每行存放一台服务器的公钥,用来验证服务器的身份。如果出现多个用户登录冲突的话,可以将该文件删除。然后重新进行连接,就会重新生成这个文件。存放一个ip地址的公钥(当默认yes时会写入)保存在本地,可以有多个(有授权的情况下),没有授权就只有一个,第一次手动输入yes就可以保存,第二次发送的时候会对比是不是一样的,不一样的话就直接挂掉中间人。

二、ssh常见的两种登陆方式:

1、密码登陆

2、密钥登陆(免密码登录)

1、密码登录

1.1 密码登录认证流程(原理)

密码登录认证原理:

client客户机向server发送登录请求,server服务器将自己的公钥发送给client(客户机)。

client使用这个公钥,将公钥进行加密,然后再发送给server。

server用私钥解密登录密码,验证合法性。

server返回验证结果为client。

这个流程中存有的一个问题,怎么保证收到的公钥就是目标server的公钥?

密码登录时需要注意:中间人攻击,所以如果一个攻击者中途拦截了client的登录请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息之后,用自己的私钥就可以进行解密了,这就窃取了client的登录信息了。

为了解决这个问题,client端第一次登录的时候,会进行一个登录公钥确认。

如果服务器重启了,就会删掉know_hosts:rm -rf know_hosts

查看公钥指纹:

ssh-keygen-if  /etc/ssh/ssh_host_rsa_key.pub

server主机的pubkey保存在/etc/ssh目录下,默认使用ssh_host_ecdsa_key.pub

[[email protected] ssh]# cd /etc/ssh
[[email protected] ssh]# ls
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key

2、公钥认证,免密码登录

公钥认证流程中,为什么要进行免密码登录:为了能对被连接的机器进行批量化处理。

2.1 公钥认证,免密码登录原理

登录原理详解:

client端生成秘钥对,将公钥追加在server端的~/.ssh/authorized_keys

客户端发送登陆请求,server收到请求之后,生成随机字符串发送给client

client用自己的私钥对字符串进行加密,发送给server。

server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串事发后一致。

返回结果给client(一致就允许登录,不一致就不允许)。

确认server服务端这个host主机摘要,确认成功之后(yes)就会将server端的pubkey保存在

~/.ssh/known_hosts里面,以后每次连接都会验证这个know_host里的key和收到的pubkey是否保持一致的。

2.2 公钥认证,免密码登录流程

使用公钥认证,免密码登录这种方式:windows连接到Linux,Linux连接到Linux上都是适用的。

ssh的公钥认证流程图:

 首先需要准备两台机器:

A : 192.168.2.152 客户机

B:192.168.2.132 服务机

A机器的root用户 -》连接到B机器的root用户

密钥:公钥和私钥是一对文件,文件里面是一段字符串,告诉加密算法加密的时候,使用的参数。
public key  公开
private key  自己

1、在A客户机机器上生成密钥对

在192.168.2.152上使用root用户生成秘钥对,客户机的公钥会存放在用户的家目录下的.ssh/文件下的authorized_keys(/root/.ssh/authorized_keys)。

ssh-keygen:是生成公钥和私钥对的命令。

#生成公钥,中间一直敲回车
[[email protected] ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): y
y already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):   敲回车
Enter same passphrase again:    敲回车
Your identification has been saved in y.
Your public key has been saved in y.pub.
The key fingerprint is:
SHA256:lkDtYmNyA9pV93YhNzv+M0VWgIgXVbANDZgDOF5jDCM [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|    E +*ooo****..|
|    .o+.B.*..*.+.|
|   o +.= o .+ = o|
|  . o O... . o + |
|     = +S     . .|
|       .       ..|
|               o.|
|                o|
|                 |
+----[SHA256]-----+

进入用户的家目录下(cd /root/.ssh)

查看公钥:cat id_rsa.pub:

[[email protected] .ssh]# ls
authorized_keys  config  id_rsa  (私钥)  id_rsa.pub (公钥)  known_hosts

查看公钥
[[email protected] .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTWqYxhTLaNCHIoF3NxrarhuDr9BQ5V48DkTFMuqQbTtJoQvtRyN7Ly9Fxq18BfNsm5U17RT+xAi1+ojVj2ZSCiIUlzaH3gR1JjpLzG54JjUq6TWSibLsYfvvkVCWYxXF584Ke8Bs7CBQZz3g9fnfi6KHoPvSXlNtrkldAwFgmG7uHqjRVsu6EGPKWqcrrDxdrZnIxvuF52Q/erPHew7aAqaAgWzsIl18AYTgiYmaafqdQ8ZteO+atfdRCw1/QczmoSeYAeNofPk98oW19uSDib/7D5BUVfpb0WjnmtrMpYkSpNQbATY6fOHn1ONvqCYhxi776ivziUxgAhUxd8ctf [email protected]

信用关系:

双向信任

单向信任

2、上传公钥到对方的服务器(B服务机器上)

将公钥上传到对方,要求对方的服务器运行时使用root用户登录。公钥的最后一行有指明需要服务器使用本机机器的root用户来登录:[email protected]

如果想要单向通信通道:就直接在A机器上执行这条命令,那么它连接B机器就不需要密码登录。

双向通道:在两个机器上都执行这条命令,B机器上也执行这条命令,但是ip要改为A机器的(ssh-copy-id -p 22 -i id_rsa.pub [email protected]),登录双方机器的时候都不需要输入密码,方便进行各种操作(执行对方机器上的文件等)。

ssh-copy-id 复制  -i:指定端口文件  -p:port  指定端口号

[[email protected] .ssh]# ssh-copy-id -p 22 -i id_rsa.pub [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
#首先在这里第一次上传公钥的时候是需要输入对方机器的密码,后面执行的时候就不需要输入了
[email protected]'s password:  

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '22' '[email protected]'"
and check to make sure that only the key(s) you wanted were added

3、验证登录是否需要密码

在这里执行登录B服务机的时候就不需要输入密码了。

[[email protected] .ssh]# ssh -p '22' '[email protected]'
Last login: Wed Jul 27 17:00:06 2022 from 192.168.2.118

此时会在对方的机器上生成一个文件authorized_key;里面存放的是对方的公钥,存放用来进行合法身份验证。证明是Linux。

[email protected] .ssh]# ls
authorized_keys  known_hosts

小结:公钥(public key)和私钥(private key)

公钥和私钥是成对存在的,这两个密钥互不相同,两个密钥可以互相加密和解密。

不能根据一个密钥而推算出另外一个密钥。

公钥对外公开,私钥只有私钥的持有者才知道。

私钥应该由密钥持有者进行妥善保管

根据实现的功能不同,可以分为数据加密和数字签名。

三、公钥认证排错

1、确保公钥正确

2、确保~/.ssh/文件权限为600

3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限

ssh 192.168.119.137 -l sc -p 22  其中的  -l :指定用户名 ,-p:指定端口。

需要注意的是:登录是会默认会去寻找家目录下的~/.ssh/id_rsa去进行验证,所以尽量不要在生成key 的时候将它的默认路径更改。

当前客户机上的sc用户将生成的公钥放到服务器机上的家目录下,放在~/.ssh/know_hosts文件中

ssh命令登录:

-l:指定登录的用户名

-p:指定server的端口

-i:指定私钥文件,默认会在~/.ssh/去找私钥

-o:接特定设置选项

不接用户名的话,当前是什么用户,就会登录到对方的什么用户,比如当前是root用户,如果不指定的话,就会登录到对方的root用户。

无需输入yes,自动保存hostkey:

ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223

原网站

版权声明
本文为[欢喜躲在眉梢里]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_52165864/article/details/126065349