SSH免密登录
当我们用一台服务器登录另一台服务器可直接使用SSH协议进行登陆
具体格式:
ssh [用户名]@[IP] ssh wdy@192.168.33.12
也可以直接远程传送文件到另一台服务器
具体格式:
scp [文件名] [目标服务器用户名]@[目标服务器IP] : [目标复制位置]
例如:scp test.txt root@192.168.33.12:/home
scp -r [文件夹名] [目标服务器用户名]@[目标服务器IP] : [目标复制位置]
远程拷贝的命令还有rsync,scp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsync比scp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
注意:以上操作方法存在弊端,每次操作都需要输入目标服务器的密码,不适合集群服务器的批量操作。所以一般我们会用SSH的第二种身份验证机制:密钥验证。
原理:
假设有A和B两台机器,现在需要A机器免密访问B机器 如何实现?
第一步:通过非对称加密算法rsa在A机器上生成公钥和私钥
第二步:将A机器上生成的公钥追加到B机器上的授权列表(authorized_keys)中
第三步:当A机器去访问B机器时,A机器携带公钥.B机器通过查看授权列表中是否有此公钥,有则开始进行验证
第四步:B机器随机生成一个字符串,并用A机器的公钥对其加密,返回给A机器
第五步:A机器拿到加密的字符串,用私钥进行解密,将解密后的字符串返回给B机器
第六步:B机器拿到返回的字符串,经对比一致则验证通过,可以通信
注意:公钥是用来加密的,私钥是用来解密的
问题:
1、正常A机器远程登陆B机器需要B机器用户和密码,SSH是如何实现的,是否在公钥里封装了用户和密码?
不是,密码验证和密钥验证都是去验证自己的身份,验证通过即可建立通信。
2、A机器通过私钥解密的字符串,传输给B机器是明文还是密文,是否有安全问题?
是明文,没有安全问题,解密的字符串是与B机器的字符串做比较的,即使别的机器抓取了,也无法比较。
具体操作
首先在源服务器上生成公钥和密钥:
具体格式:
ssh-keygen -t rsa
其中 -t [加密方式] 默认会在 /root/.ssh/ 生成私钥和公钥 id_rsa和id_rsa.pub
如下图:中间按enter键
接下来我们需要将源服务器生成的公钥拷贝到目标服务器中并添加至authorized_keys列表中,这两步可以使用一个简便命令进行执行:
将公钥添加至目标服务器的authorized_keys列表中
具体格式:
ssh-copy-id [目标服务器]
例如:ssh-copy-id 192.168.88.65
如下图:
另一种方法,先将公钥拷贝到目标服务器上,再将公钥追加到授权列表中
命令:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
通过scp将内容写到对方的文件中
命令:scp -p ~/.ssh/id_rsa.pub root@<remote_ip>:/root/.ssh/authorized_keys
验证:
进入 ~/.ssh 会生成以下几个文件
authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
know_hosts : 已知的主机公钥清单
如果希望ssh公钥生效需满足至少下面两个条件:
1) .ssh目录的权限必须是700
2) .ssh/authorized_keys文件权限必须是600