ssh登录验证方式介绍
ssh服务登录的常用验证方式
- 用户口令
- 基于密钥
用户口令验证过程:
- 客户端发起ssh请求,服务端会把自己的公钥发送给用户
- 用户会根据服务端发来的公钥对密码进行加密
- 加密后的信息回传给服务端,服务端用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登录方式
- 首先在客户端生成一对密钥(ssh-keygen)
- 并将客户端的公钥ssh-copy-id拷贝到服务端
- 当客户端再次发送一个连接请求,包括ip、用户名
- 服务端得到客户端的请求后,会到家目录下.ssh目录里authorized_keys中查找,如果有相应的ip和用户,就会随机生成一个字符串,例如:aaaa
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 得到服务的发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给客户端
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
实现基于密钥的登录方式
在客户端生成密钥对
-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
在Xshell实现基于key验证
在SecureCRT工具-->创建公钥-->生成identity.pub文件
转换为openssh兼容模式(适合SecureCRT,Xshell不需要转换格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:
ssh-keygen -i -f identity.pub >> ~/.ssh/authorized_keys
生成后可以放在u盘里,以后需要登录了,就可以把公钥传到服务端,更改名字和权限,这样有私钥的客户端使用Xshell1就可以使用密钥连接服务端
名字改好后一定要注意权限问题,权限一定是600
chmod 600
ssh软件修改连接方式
这样只需要把你的公钥文件上传到对应的服务端,保存好私钥,就可以实现灵活的基于key的验证
免交互分发公钥对
sshpass可能需要下载 软件包名就是sshpass,需要提前把客户端的ssh_config文件StrictHostKeyChecking选项设置为no
1. ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
- 实现免交互创建密钥对
- 可以实现ssh-copy-id的免交互分发公钥
2. sshpass -p "[password]" ssh-copy-id -i [public_key_file] [target_host]
给私钥加口令
基于key验证也仍然可能会存在风险,如果有人非法破开了root密码,或者本地登录了这台机器复制了客户端的私钥,那么就可以冒充客户端对服务端发起基于key的登录
那么如果这个客户端和其它很多服务端都有key验证,就非常危险,对方可以通过这个私钥登录其它所有的服务端,我们可以使用 ssh-keygen -p 选项添加新口令
添加口令
再次发起连接
发起连接就需要输入私钥的口令
启用代理
但是这样就又需要重复的输入密码,不能实现免密登录,不利于批量执行任务。但是和传统的口令ssh不同的是,口令是一样的,密码是不同的,我们可以使用代理帮我们管理密码,这样就不需要手工输入了。
将口令让代理托管
代理程序是一个进程,会启用一个bash,是临时性的,只要退出这个bash,代理程序就会退出,这样只要用的时候就开启,不用的时候就不启用
实现私钥加密,同时免密登录目标主机
脚本范例:expect实现批量基于ssh的key部署
也可以使用上面所说的 sshpass 实现免交互的批量基于ssh的key部署
脚本代码
#!/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验证,该怎么做?