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

简介: ssh中的密码登录和密钥登录

一、ssh中的加密

1、对称加密

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

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

2、非对称加密

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

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

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

注意:

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

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

ssh都是基于公钥加密。

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

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

public key 公开

private key 私有的

[root@nginx-kafka01 ssh]# cd ~/.ssh
[root@nginx-kafka01 .ssh]# ls
authorized_keys  config  id_rsa  id_rsa.pub  known_hosts
[root@nginx-kafka01 .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

[root@mysql-rpm ssh]# cd /etc/ssh
[root@mysql-rpm 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:是生成公钥和私钥对的命令。

#生成公钥,中间一直敲回车
[root@nginx-kafka01 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 root@nginx-kafka01
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:

[root@nginx-kafka01 .ssh]# ls
authorized_keys  config  id_rsa  (私钥)  id_rsa.pub (公钥)  known_hosts
查看公钥
[root@nginx-kafka01 .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTWqYxhTLaNCHIoF3NxrarhuDr9BQ5V48DkTFMuqQbTtJoQvtRyN7Ly9Fxq18BfNsm5U17RT+xAi1+ojVj2ZSCiIUlzaH3gR1JjpLzG54JjUq6TWSibLsYfvvkVCWYxXF584Ke8Bs7CBQZz3g9fnfi6KHoPvSXlNtrkldAwFgmG7uHqjRVsu6EGPKWqcrrDxdrZnIxvuF52Q/erPHew7aAqaAgWzsIl18AYTgiYmaafqdQ8ZteO+atfdRCw1/QczmoSeYAeNofPk98oW19uSDib/7D5BUVfpb0WjnmtrMpYkSpNQbATY6fOHn1ONvqCYhxi776ivziUxgAhUxd8ctf root@localhost.localdomain

信用关系:

双向信任

单向信任

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

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

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

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

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

[root@nginx-kafka01 .ssh]# ssh-copy-id -p 22 -i id_rsa.pub root@192.168.2.132
/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
#首先在这里第一次上传公钥的时候是需要输入对方机器的密码,后面执行的时候就不需要输入了
root@192.168.2.132's password:  
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh -p '22' 'root@192.168.2.132'"
and check to make sure that only the key(s) you wanted were added

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

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

[root@nginx-kafka01 .ssh]# ssh -p '22' 'root@192.168.2.132'
Last login: Wed Jul 27 17:00:06 2022 from 192.168.2.118

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

root@nginx-kafka02 .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


相关文章
|
2月前
|
安全 Linux 网络安全
CentOS 8下SSH连接超时与“无法加载主机密钥”错误的排查与修复
在CentOS 8系统中,宝塔面板提示“出错了,面板运行时发生错误”,导致插件无法正常显示。同时,SSH连接超时,修复面板功能失效。通过VNC连接排查,发现SSH服务安装和配置问题频发,最终通过重装SSH、调整权限并重新生成主机密钥文件解决问题,成功恢复SSH连接。
215 16
|
2月前
|
安全 网络安全 数据安全/隐私保护
Debian 12系统中允许Root远程SSH登录解决方法!
在 Debian 12 系统中开启 SSH 远程 Root 登录需修改 SSH 配置文件 (`sshd_config`),将 `PermitRootLogin` 设置为 `yes` 并确保密码认证启用。完成后重启 SSH 服务并验证连接。若防火墙启用,需放行端口 22。注意,直接开放 Root 登录可能带来安全风险,建议使用普通用户登录后切换至 Root。
154 1
|
5月前
|
监控 Ubuntu 安全
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
在Debian或Ubuntu系统中启用root用户的SSH远程登录需要编辑SSH配置文件、设置root密码并重启SSH服务。虽然这可以在某些情况下提供便利,但必须注意安全性,通过使用强密码、限制IP访问、使用SSH密钥认证等方法来保护服务器的安全。
2192 5
|
9月前
|
JavaScript 应用服务中间件 Linux
【应用服务 App Service】解决无法从Azure门户SSH登录问题
【应用服务 App Service】解决无法从Azure门户SSH登录问题
105 0
|
7月前
|
安全 Shell Linux
ssh密码忘记了怎么办
通过上述措施,不仅能够有效应对SSH密码遗忘的挑战,还能全方位加固SSH连接的安全,确保数据传输的无忧。
435 2
|
9月前
|
机器学习/深度学习 存储 Linux
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
107 4
|
9月前
|
安全 Shell Linux
如何禁止某个用户使用ssh登录
本文介绍了五种禁止用户通过SSH登录的方法:1) 修改`/etc/ssh/sshd_config`文件中的`DenyUsers`和`DenyGroups`来阻止特定用户或用户组登录;2) 将用户的默认shell设置为`/usr/sbin/nologin`或`/bin/false`以禁用其SSH访问;3) 利用PAM(可插入认证模块)通过编辑`/etc/security/sshd.conf`来限制登录权限;4) 通过编辑`/etc/hosts.deny`文件拒绝特定用户的SSH访问;5) 锁定或禁用用户账号以阻止所有类型的登录。每种方法都提供了详细的步骤指导。
1133 2
|
9月前
|
存储 安全 测试技术
【超实用却暗藏杀机】sshpass:一键免密SSH登录的神器,为何生产环境却要敬而远之?探秘背后的安全隐患与替代方案!
【8月更文挑战第16天】sshpass 是一款便捷工具,可实现自动化SSH登录,简化脚本中的远程连接流程。通过后台自动处理密码输入,便于执行远程操作,如 `sshpass -p 'yourpassword' ssh user@remotehost`。也可结合更多SSH选项使用,例如指定私钥文件。然而,因需明文传递密码,存在较大安全隐患,不适于生产环境;推荐使用公钥认证以增强安全性。
595 4
|
9月前
|
安全 Linux Shell
Linux系统之间实现免密码登录(SSH无密码登录
【8月更文挑战第21天】要在Linux系统间实现SSH免密码登录,需先在源机器生成SSH密钥对,然后将公钥复制到目标机器的`.ssh/authorized_keys`文件中。可通过`ssh-keygen`命令生成密钥,并使用`ssh-copy-id`命令传输公钥。最后测试SSH连接,确保能无密码登录。若目标机器缺少相关目录或文件,需手动创建并设置适当权限。完成这些步骤后,即可实现安全便捷的免密码登录。
361 0
|
9月前
|
Ubuntu Linux 网络安全
在Linux中,如何禁用root用户直接SSH登录?
在Linux中,如何禁用root用户直接SSH登录?