3)ssh验证方式的工作原理和基于key验证实现案例
  U9ElBp9F5cmM 2023年11月22日 16 0

ssh登录验证方式介绍

ssh服务登录的常用验证方式

  1. 用户口令
  2. 基于密钥

用户口令验证过程:

3)ssh验证方式的工作原理和基于key验证实现案例_ssh


  1. 客户端发起ssh请求,服务端会把自己的公钥发送给用户
  2. 用户会根据服务端发来的公钥对密码进行加密
  3. 加密后的信息回传给服务端,服务端用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

3)ssh验证方式的工作原理和基于key验证实现案例_服务端_02


  1. 首先在客户端生成一对密钥(ssh-keygen)
  2. 并将客户端的公钥ssh-copy-id拷贝到服务端
  3. 当客户端再次发送一个连接请求,包括ip、用户名
  4. 服务端得到客户端的请求后,会到家目录下.ssh目录里authorized_keys中查找,如果有相应的ip和用户,就会随机生成一个字符串,例如:aaaa
  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  6. 得到服务的发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给客户端
  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

实现基于密钥的登录方式

在客户端生成密钥对

-P 指定私钥加密的口令,不加就空着

ssh-keygen -t rsa [-P ''] [-f "~/.ssh/id_rsa"]

把公钥文件传输至远程服务器对应用户的家目录

ssh-copy-id [-i [identity_file]] [user@]host

重设私钥口令:

ssh-keygen -p

验证代理(authentication agent)保密解密后的密钥,口令只需要输入一次,在GNOME中,代理被自动提供给root用户

#启用代理

ssh-agent bash

#钥匙通过命令添加给代理

ssh-add

3)ssh验证方式的工作原理和基于key验证实现案例_客户端_03


在Xshell实现基于key验证

在SecureCRT工具-->创建公钥-->生成identity.pub文件

转换为openssh兼容模式(适合SecureCRT,Xshell不需要转换格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:


ssh-keygen -i -f identity.pub >> ~/.ssh/authorized_keys


3)ssh验证方式的工作原理和基于key验证实现案例_客户端_04


3)ssh验证方式的工作原理和基于key验证实现案例_shell脚本_05



3)ssh验证方式的工作原理和基于key验证实现案例_服务端_06


3)ssh验证方式的工作原理和基于key验证实现案例_客户端_07


3)ssh验证方式的工作原理和基于key验证实现案例_服务端_08


3)ssh验证方式的工作原理和基于key验证实现案例_客户端_09


3)ssh验证方式的工作原理和基于key验证实现案例_服务端_10


生成后可以放在u盘里,以后需要登录了,就可以把公钥传到服务端,更改名字和权限,这样有私钥的客户端使用Xshell1就可以使用密钥连接服务端

名字改好后一定要注意权限问题,权限一定是600

chmod 600

3)ssh验证方式的工作原理和基于key验证实现案例_服务端_11


ssh软件修改连接方式

3)ssh验证方式的工作原理和基于key验证实现案例_客户端_12


3)ssh验证方式的工作原理和基于key验证实现案例_服务端_13


3)ssh验证方式的工作原理和基于key验证实现案例_服务端_14


这样只需要把你的公钥文件上传到对应的服务端,保存好私钥,就可以实现灵活的基于key的验证

免交互分发公钥对

sshpass可能需要下载 软件包名就是sshpass,需要提前把客户端的ssh_config文件StrictHostKeyChecking选项设置为no

1. ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
  1. 实现免交互创建密钥对
  2. 可以实现ssh-copy-id的免交互分发公钥
2. sshpass -p "[password]" ssh-copy-id -i [public_key_file] [target_host]

3)ssh验证方式的工作原理和基于key验证实现案例_客户端_15


给私钥加口令

基于key验证也仍然可能会存在风险,如果有人非法破开了root密码,或者本地登录了这台机器复制了客户端的私钥,那么就可以冒充客户端对服务端发起基于key的登录

那么如果这个客户端和其它很多服务端都有key验证,就非常危险,对方可以通过这个私钥登录其它所有的服务端,我们可以使用 ssh-keygen -p 选项添加新口令

添加口令

3)ssh验证方式的工作原理和基于key验证实现案例_ssh_16


再次发起连接

发起连接就需要输入私钥的口令

3)ssh验证方式的工作原理和基于key验证实现案例_shell脚本_17


启用代理

但是这样就又需要重复的输入密码,不能实现免密登录,不利于批量执行任务。但是和传统的口令ssh不同的是,口令是一样的,密码是不同的,我们可以使用代理帮我们管理密码,这样就不需要手工输入了。

3)ssh验证方式的工作原理和基于key验证实现案例_服务端_18


将口令让代理托管

代理程序是一个进程,会启用一个bash,是临时性的,只要退出这个bash,代理程序就会退出,这样只要用的时候就开启,不用的时候就不启用

3)ssh验证方式的工作原理和基于key验证实现案例_客户端_19


实现私钥加密,同时免密登录目标主机

3)ssh验证方式的工作原理和基于key验证实现案例_ssh_20


脚本范例:expect实现批量基于ssh的key部署

也可以使用上面所说的 sshpass 实现免交互的批量基于ssh的key部署

3)ssh验证方式的工作原理和基于key验证实现案例_服务端_21


3)ssh验证方式的工作原理和基于key验证实现案例_服务端_22


脚本代码

#!/bin/bash
passwd=000000
rpm -q expect &> /dev/null || yum -y install expect 2> /dev/null
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 2> /dev/null
echo "ssh key is created"
for i in `cat hosts.txt`
do
 expect 2> /dev/null <<EOF
 set timeout 20
 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
 expect {
 "yes/no" { send "yes\n";exp_continue }
 "password" { send "$passwd\n" }
 }
 expect eof
EOF
 echo "$i is ready"
done

如何实现三个主机之间相互的key验证

以上都是单向的key验证,如果需要若干主机彼此间实现key验证,该怎么做?

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   14   0   0 nginx客户端服务端
  jnZtF7Co41Wg   2023年12月09日   15   0   0 客户端服务端数据
  jnZtF7Co41Wg   2023年12月10日   16   0   0 nginx客户端服务端NFS
  aYmIB3fiUdn9   2023年12月08日   38   0   0 客户端IPNATlvs