服务器之间通讯
服务器之间的SSH
为避免混淆,这里给两台服务器不同的角色,分别是:client、server
密码登录
client使用账密的方式登录server
# 格式: ssh 用户名@server的ip:保存到的位置
ssh root@xx.xx.xx.xx:路径
认识密钥
密码登陆
每次都需输入和传输明文密码来鉴权,出于安全server也未必会给你账密,而这正是密钥鉴权方案解决的问题。
什么是密钥
在此之前,我们先来了解下什么是密钥:
密钥是由加密方法生成的参数(字符), 其加密方法有对称和非对称方式,前者加/解密都用一个参数,而后者则需两个。
非对称产出的两个参数一般称为私钥、公钥,公钥加密的信息必须使用对应的私钥才可以解密,即一一对应。
非对称密钥认证流程
而服务器间的通讯认证,通常使用非对称的方式 也就是公/私密钥的方式 来授权认证的,来看一下具体的流程和逻辑:
# 前置准备
1、client使用ssh-keygen命令 生成密钥,把公钥给server。
2、server拿到client的公钥后,将其增加到公钥管理库(即 authorized_keys)中。
#正式开始
1、client发送SSH连接请求(带上 username、ip等重要信息)。
2、server接收到请求后 会去authorized_keys 文件中(根据username+ip)找出对应公钥,并[使用此公钥加密去]生成一个的随机字符串回传给client(此加密的字符串只能通过私钥才能正确的解出)。
3、client收到后,将使用私钥去解密,并将解密后的内容发还给服务器
4、server收到请求后,开始拿请求的内容去验证,正确后即确认client是可信任的,允许其登录 即建立起一条安全的信息通道。
简而言之就是 “client 需要提前把 公钥发给server,server配置添加到它密钥管理文件中后,client就可以控制server了”。
这个方式还是比较安全的,即便被不怀好意的人盗窃了公钥,但没用 我反过来还能能控制它!
密钥登陆
client生成密钥
使用ssh-keygen
命令来创建密钥文件(公钥、私钥),位于/root/.ssh
中的id_rsa 和 id_rsa.pub。
server允许密钥登录SSH
打开SSH配置文件 /etc/ssh/sshd_config
,放开其对应字段注释,最后重启SSH service sshd restart
。
# PubkeyAuthentication yes
server添加client公钥
server拿到client给的公钥后,将其添加到自己的密钥管理文件(root/.ssh/authorized_keys
)中即可。
具体操作为:打开公钥文件id_rsa.pub 复制里边的内容 将其插入到authorized_keys末尾处。
client发送SSH连接请求
client发起SSH连接命令请求到server,经过你无感知的内部一番鉴权认证,你能看到的就是直接连接成功了。
ssh root@xx.xx.xx.xx
留意到圈主的client自动生成的文件know_host
了吗?!
那是因为在client在请求的时候 会有个提示:“是否将此次授权信息保存,下次连接将不再做重复鉴权?”。
一般回复yes
即可,然后就会生成此文件,这样做除了方便下次client的连接等请求,其实这也有助于避免每次鉴权过程中存在中间人攻击,更多关于此文件的介绍看这里。
发送文件
client要发送文件给server,方法又很多,目前主流的是经典的scp和三方库rsync。
scp
secure copy, 是 linux 内置的基于 ssh 登陆进行安全的远程文件拷贝命令。
发送文件
# 将本机 /home/a.txt (以root用户的身份)发送至82.157.146.87的/text目录下
scp /home/a.txt root@82.157.146.87:/test
发送一个目录下的所有内容
# 参数-r是递归的意思,主要是考虑到目录中可能存在文件夹等嵌套
scp -r /home/* root@82.157.146.87:/test
发送文件夹
scp -r /home root@82.157.146.87:/test