因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录。关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理。

scp 传输文件

scp(secure copy)linux系统下基于ssh登录进行安全的远程文件拷贝的命令。

# 传递文件到远程
scp local_file remote_username@remote_ip:remote_file
# 传递文件夹到远程
scp -r local_folder remote_username@remote_ip:remote_folder
# 复制远程文件到本地,只是调换下文件参数位置即可
scp remote_username@remote_ip:remote_file local_file

远程拷贝的命令还有rsyncscp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsyncscp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

scp相似的命令是cp,但是cp只能本机拷贝而不能跨服务器,因此需要与ssh合作构成scp命令。

我们直接使用scp来跨机器拷贝文件,会提示输入密码:

# 提示输入server端服务器的work用户密码
[work@client.com ~]$ scp test.php work@server.com:/home/work
work@server.com's password: 

原因就在于,scp是先使用ssh连接服务端机器后,再使用网络来执行远程拷贝(cp)

可以参考ssh的过程:

# 同样的提示输入server端服务器的work用户密码
[work@client.com ~]$ ssh work@server.com
work@server.com's password: 

ssh 加密信息

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。

SSHTelnet/rlogin等非安全shell的替代品,这些协议采用明文传输,会引入许多的安全性问题:

如图所示,telnet使用23号端口,所有的信息,包括用户名和密码都是明文传输;而ssh使用22号端口,所有的信息都会被加密传输,安全性得到了很大的提高。

ssh使用十分简单,选择以什么用户连接哪台机器,然后输入密码即可:

$ssh user@hostname
user@hostname's password:

对称加密和非对称加密

ssh的主要有点就是安全性,安全性依赖于加密方式,现在主要的加密方式有两种:对称加密和非对称加密。

对称加密


对称加密使用同一个密钥来进行加密和解密,这样在传输时是安全可靠的,但是如何安全的保存密钥呢,在集群中,客户端的数量巨大,一旦任意一个客户端的密钥被窃取,那么整个系统的安全性也不复存在。

非对称加密

由于对称加密的这个弊端,产生了非对称加密,非对称加密中有两个密钥:公钥和私钥。公钥由私钥产生,但却无法推算出私钥;公钥加密后的密文,只能通过对应的私钥来解密。

非对称加密的登录流程:

初始状态:topgun终端要登录Server服务器,发起连接请求ssh work@server.com

  1. 服务端运行有ssh服务,并持续监听22号端口,因此可以生成一对公钥和私钥;此时将公钥返回给客户端
  2. 客户端使用公钥,对登录密码进行加密,(如服务器work用户密码为xxx),生成公钥加密字符串
  3. 客户端将公钥加密字符串发送给服务端
  4. 服务端使用私钥,解密公钥加密字符串,得到原始密码
  5. 校验密码是否合法(此为本机work密码)
  6. 返回登录结果给客户端:成功登录或密码错误

在非对称加密中,由于只有公钥会被传输,而私钥是服务端本地保存,因此即便公钥被监听,也无法拿到原始密码,从而登录服务器。

中间人攻击

在非对称加密中可以有效保护登录密码不被泄漏,但这是在建立连接到真实服务器的情况下。设想一下,如果供给者并不监听密码或公钥,而是直接伪装成服务器呢:

在该示例图中,存在Hacker服务器劫持了你的ssh建连请求(如通过DNS劫持等方式),导致你与Hacker机器的连接一切正常,因此它能拿到你的明文密码,并通过明文密码来攻击真实的服务端。

那么SSH采用了非对称的加密方式,是怎么解决这个问题的呢?

[work@client.com: ~]$ ssh work@server.com
The authenticity of host 'server.com (10.10.10.24)' can't be established.
RSA key fingerprint is ad:2e:92:41:6f:31:b1:c1:35:43:eb:df:f1:18:a1:c1.
Are you sure you want to continue connecting (yes/no)?  yes
Warning: Permanently added 'server.com,10.10.10.24' (RSA) to the list of known hosts.
Password: (enter password) 

在这个认证信息中,可以看到提示:无法确认主机server.com (10.10.10.24)的真实性,不过知道它的公钥指纹,是否继续连接?

输入yes继续连接后,就会确认该服务器为可信任服务器,然后添加到known_hosts文件中,下次不用再次确认,然后跳转到输入密码的验证阶段。这种简单粗暴的方式相当于让我们肉眼比对来判断目标服务器是否是真实服务器,我觉得并不是最理想的方式,希望后续会有更完美的认证方式。

之所以用fingerprint(公钥指纹)代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。

SSH免密登录

我们已经掌握如何使用ssh登录远程服务器了,但是每次登录都要输入密码,比较麻烦。ssh提供一种免密登录的方式:公钥登录。

  1. 在客户端使用ssh-keygen生成一对密钥:公钥+私钥
  2. 将客户端公钥追加到服务端的authorized_key文件中,完成公钥认证操作
  3. 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
  4. 服务端检索authorized_key文件,确认该公钥是否存在
  5. 如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
  6. 将公钥加密字符串传递给客户端
  7. 客户端使用私钥解密公钥加密字符串,得到R
  8. 服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5R和SessionKey进行加密,生成摘要(即MD5加密字符串)
  9. 客户端将生成的MD5加密字符串传给服务端
  10. 服务端同样生成MD5(R,SessionKey)加密字符串
  11. 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
  12. 此时不用输入密码,即完成建连,可以开始远程执行shell命令了

实现免密登录

ssh-genkey是生成密钥的工具,执行完成后生成公钥和密钥,这两个文件会默认保存在~/.ssh/路径下。常用的参数为:

  • -t: 指定生成密钥类型(rsa、dsa)。默认为rsa
  • -f: 指定存放私钥的文件,公钥文件名为私钥文件名加.pub后缀。默认为id_rsa
  • -P: 指定passphrase(私钥的密码),用于确保私钥的安全。默认为空
  • -C: 备注。默认为user@hostname

我们直接执行来生成密钥,所有的参数都可以为空,也就是一直回车确认:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/work/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
74:17:74:38:b2:c7:70:fd:1d:33:eb:e2:71:71:cc:11 work@client.com

此时,生成的文件在~/.ssh/目录下,我们会看到这些文件:

id_rsa    // 私钥文件
id_rsa.pub    // 公钥文件
authorized_keys    // 存放客户端公钥的文件
known_hosts    // 确认过公钥指纹的可信服务器列表的文件
config    // 指定不同域名使用哪个密钥的配置文件

因为一台机器即能是客户端,又能是服务端,因此同时存在authorized_keys(在该机器为服务端时使用)和Known_hosts(在该机器为客户端时使用)。

我们的服务器会有很多的用户,如果所有的用户都用同一份密钥,可能就没办法划分权限或者区分用户,如多个用户提交git就需要按照用户名来生成密钥,用于区分用户。同时你可能也希望针对不同的服务器使用不同的密钥对,因此需要config配置文件来配置针对不同服务器的配置:

$vim ~/.ssh/config
Host a.baidu.com
User work
IdentityFile ~/.ssh/id_rsaHost b.baidu.com
User zhaoshuaiqiang
IdentityFile ~/.ssh/zhaoshuaiqiang

这样在连接不同的服务器时,就会使用不同的密钥文件来登录。

在客户端生成密钥对之后,将公钥追加到服务器的authorized_keys文件中即可。

 ...15 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAn30bjwtkLW82vTlLMQnI/a42J2g7o+HBCpSzBgNG+xfZuSNQOAU8+FNKQvriT4AL7ToiTtrZDLOEGqyQzaxQejuNnWG6aQ9ETh96qXhVLecWidaBieFGuv+FuXz6x551xtFXx64AzG+706dhnv1nOACYlrnfvXhi5kZzWzprET+CxMIeYhJQwwc19pF5zCWeU9QUvd1mOu0n8JVycevmuXRdVx9WpXq2+aaaaaaaa3uYGMBxvSLtT40O1AiEZ+k9EeYCnTEVtnGoVWCyxpwv6rR/GDOtJL/d+/Wb6I0HEKxxe087yZz8GWpQN5TEIAjq3oEjI/aiGw== work@a.baidu.com16 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzRmK+CAVLnryXqQwweu8Yji8bGAvqzf8PSDzYn1nmE6ZeDkBbrWvFlVZ2yOip3IX8RjvuPc28mTCr0LsIOOmpvET0SzOkt0hzLBPiyCN/QvbKU/RbUv8v5y2hEAlbUkMEzv7qOHQEruGEvA5y99gf/nYjK5OFKVpmg838OScUV3i88Xbqk8rtcuRZHWuZLnuB5spBsEE5r1UrnH/Ik7frZr8Vb4X6aZWbAp1yc0SqZ8JXVbmOiakqq0WqkLm+zqhEwr+Ooh2guH23x9zjMqYUy+aaaaaBEBC+LepCvskArBt/SRwJDJkcItz8T7kBC3CP0Y0X4hB+6k6/yM/pup5w== work@b.baidu.com

此时,即可免密登录服务器。

私钥的安全性

假设你已经实现了服务器集群的免密登录,那么如果你的一台客户端被攻击成功了,那么整个集群的安全性便荡然无存了。因此,我们有时还需要对密钥做安全性保障,即设置私钥密码:

// 使用rsa方法加密,生成test密钥对,私钥密码为123456
ssh-keygen -t rsa -f test -P 123456 

此时,各机器仍然是免密登录,但是需要你输入私钥密码:

$ssh work@a.baidu.com
Enter passphrase for key '/home/work/.ssh/test': 

参考资料

  1. RUNOOB-Linux scp命令:http://www.runoob.com/linux/l...
  2. linux-doc scp跨机远程拷贝:https://linuxtools-rst.readth...
  3. 维基百科 Secure Shell:https://zh.wikipedia.org/wiki...
  4. 简书 图解SSH原理:https://www.jianshu.com/p/334...
  5. CSDN scp在linux中实现两台主机传件--互信无需输入密码: https://blog.csdn.net/posonri...

linux上ssh免密登录原理及实现相关推荐

  1. linux中ssh免密登录,Linux之SSH免密登录

    Linux 双向 SSH 免密登录 原理 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录.双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要 ...

  2. linux关于ssh免密登录、known_hosts文件

    1. 关于ssh SSH 是 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议.SSH 是目前广泛采用的安全登录协议,专为远程登录会话和其他网络服务提供安全性的协议,替代以前不 ...

  3. 20210829-基于CentOS7/Linux配置ssh免密登录

    #关键字:Linux,CentOS7,ssh 登录,免密登录 目录 一.目标: 二.环境说明: 三.配置步骤: 一.目标: 1. 从一台机器使用 'shh 主机名'命令登录另一台机器时不用输入密码. ...

  4. linux 配置免密码登录,Linux - 配置SSH免密登录 - “ssh-keygen”的基本用法

    1 什么是SSH 引用百度百科的说明: SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:它是建立在应用层基础上的安全协议. S ...

  5. 【Linux】SSH免密登录配置

    SSH免密登录配置 前提:两用户已存在 用户A:user_a 用户B:user_b 先要求从user_a到用户user_b进行ssh和scp免密登录. 登录用户user_a 1. 检查/home/us ...

  6. Ubuntu系统SSH免密登录,以及SSH免密登录原理

    我用的是Ubuntu 16.04系统,在搭建集群的时候开启集群每次都要输入好多的密码,太过于麻烦,用SSH免密登陆可以不用输入密码 SSH的基本介绍 简单说,SSH是一种网络协议,用于计算机之间的加密 ...

  7. Linux服务器SSH免密登录

    在登录机器执行 #产生秘钥,一路回车 ssh-keygen -t rsa #将秘钥复制到需要免密登录到的服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.16 ...

  8. linux 设置ssh免密登录

    配置 A-192.168.1.219  免密登录  B-192.168.1.220 在A上执行 ssh-keygen -t rsa -P ''  可以看到~/.ssh生成两个文件id_rsa.pub  ...

  9. Linux设置ssh免密登录

    目录 1.在/root目录下输入命令 2.进入.ssh目录 3.将公钥id_rsa.pub写入到一个认证文件夹中 4.开启远程免密登录配置 5.免密远程登录本机 1.在/root目录下输入命令 [ro ...

最新文章

  1. Yii2 HOW-TO(3):调试工具yii2-debug和Xdebug(失败)
  2. java的注释规范_Java代码注释规范
  3. 【图文详细教程】maven3安装配置+eclipse离线安装maven3插件《《唯一成功的教程~~~2018-01-09》》...
  4. android 观察者更新ui,android通过观察者模式实现更新UI
  5. .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报
  6. Python二级笔记(11)
  7. ORA-01502 state unusable错误成因和解决方法[转]
  8. java 常量池是什么_Java常量池理解与总结
  9. 数组中大于等于左侧所有数,小于等于右侧所有数的数
  10. 一元云购 java源码
  11. 学习成功:中学生成就梦想的15堂必修课
  12. linux系统声音管理,Mplayer 音量控制详解
  13. linux下chm文件制作,自己动手将在线文档制作成CHM文件
  14. 要做就做明链,这才是堂堂正正的优化之路,不要走捷径
  15. 使用SublimeREPL 出现系统找不到指定文件
  16. 哥伦比亚大学 Schulzrinne 教授:撰写科研论文详细教程
  17. qq语音聊天 java_用Java语言实现QQ部分聊天功能
  18. 手机无线网卡最高支持到866Mbps
  19. 微信小程序中使用阿里矢量字体图标
  20. 中国智能手机集成电路(IC)行业市场供需与战略研究报告

热门文章

  1. stm32 火灾自动报警及联动控制源码_火灾自动报警与消防联动控制系统
  2. Android 10 手机端控制车载蓝牙音乐上一首、暂停、下一首、获取音乐信息等流程
  3. ARCHPR基础破解压缩包密码-掩码爆破
  4. MAC安装unrar
  5. Catagory基础使用
  6. 2016年求职找工作千万小心这些求职陷阱
  7. 用Excel制作条形码
  8. inferred type_您最终可以使用var在Java中声明Inferred Type局部变量-这就是为什么它很棒...
  9. flv怎么转换成mp4格式?
  10. 从零搭建Spring Boot脚手架:增加通用的功能2