1. 前言
emmm.... 最近学习大数据, 需要搭建 Hadoop 框架, 当弄好 Linux 系统之后, 第一件事就是 SSH 免密登录的设置. 对于 SSH, 我觉得使用过 Linux 系统的程序员应该并不陌生. 可是吧, 用起来简单, 真让你说出个所以然, 还是件比较困难的事(大佬绕路, 此篇文章不属于你~). 然后, 我就好奇心大发, 打算写一篇博客详细介绍一下 SSH 和免密登录的原理及实现.
补充: 不管是 Hadoop 的伪分布还是全分布, Hadoop 的名称结点 (NameNode) 都需要启动集群中所有机器的 Hadoop 守护进程, 而这个过程可以通过 SSH 登录来实现. 由于 Hadoop 并没有提供 SSH 输入密码登录的形式, 因此, 为了能够顺利登录每台机器, 就需要对其进行 SSH 的免密登录配置.
2. 初见 SSH
Secure Shell(安全外壳协议, 简称 SSH)是一种加密的网络传输协议, 可以在不安全的网络中为网络服务提供安全的传输环境(来自维基百科的定义). 根据其定义, 我们能够理解 SSH 最常见的用途就是远程登录系统, 人们通常利用 SSH 来传输命令行界面和远程执行命令.
早期的互联网通信, 例如 Telnet 和非安全 shell, 都是采用明文进行传输, 一旦被截获, 内容就会暴露无遗. 而 SSH 就是其上位的替代品. 1995 年, 芬兰学者 Tatu Ylonen 设计了 SSH 协议, 将登录信息全部加密, 成为了互联网安全的一个基本解决方案, 迅速在全世界获得推广.
这里需要注意一下, SSH 只是一种协议(或者可以理解为一种规定), 而它具体的实现有很多, 商业, 开源的等等. 其最流行的实现应该是 OpenSSH, 本文所针对的实现也是基于 OpenSSH 的.
3. SSH 的工作原理
作为以安全性著称的协议, SSH 是怎么实现的呢? 我们首先想到的肯定是对数据进行加密, 而 SSH 的加密方式主要有两种, 一个是对称加密(密钥加密), 另一个是非对称加密(公钥加密).
3.1 对称加密
所谓的对称加密就是客户端与服务器共用一套密钥进行数据的加解密, 详情见下图.
图 3-1 对称加密的过程
这种加密方式很难被破解, 但是存在一个问题, 如果密钥泄露, 系统数据的安全性将不复存在, 为了解决这个问题, 非对称加密应运而生.
3.2 非对称加密
非对称加密有两个密钥: 公钥和私钥. 数据使用公钥加密之后, 只能使用私钥进行解密, 而私钥被破解的概率很低很低, 详情见下图.
图 3-2 非对称加密的过程
由于私钥是服务器独有的, 所以即使客户机的登录信息被截取, 也是没有私钥进行解密的, 保证了数据的安全性, 充分利用了非对称加密的特点.
3.3 非对称加密的缺陷
非对称加密就一定安全了么? 答案是否定的. 如果黑客冒充了服务器, 拦截了登录请求, 并且把自己的公钥发送给客户机, 再使用自己的私钥对密码进行解密, 就会获取到客户机的登录信息, 从而造成数据泄露, 这就是中间人攻击, 详情见下图.
图 3-3 非对称加密的缺陷
对于上诉的缺陷, SSH 有两种解决方法, 第一种是基于口令的认证; 另一种是基于公钥的认证, 俗称 SSH 免密登录.
3.4 基于口令的认证
根据图 3-3 所示, 我们可以发现问题的关键点就在于客户机没法分辨出公钥是否是自己想要登录的服务器给的公钥, 所以说客户机只能自己对公钥进行确认, 通常第一次登录的时候会出现下面的提示.
- The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
- RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
- Are you sure you want to continue connecting (yes/no)?
提示的内容是在说, 无法确定 SSH-server.example.com (12.18.429.21)主机的真实性, 但是知道其公钥指纹, 是否继续连接.
之所以使用公钥指纹, 是因为 RSA 算法生成的公钥长达 1024 位, 但是通过对公钥进行 hash 得到的 128 位的指纹就很容易进行比较.
输入 yes 之后, 会出现下面的提示.
- Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
- Password: (enter password)
提示在说, 该主机已经添加到 known hosts 的列表里了, 接着输入密码, 按照图 3-2 的流程走就行了.
4. 基于公钥的认证
4.1 SSH 免密登录的原理
免去密码进行登录, 不仅使得登录信息不会遭到泄露, 而且也简化, 方便了系统之间登录的操作, 提高了工作的效率, 工作原理见下图所示.
图 4-1 免密登录的原理
4.2 SSH 免密登录的实现(openSSH)
第一步: 安装 SSH, 命令如下.
1 yum install -y openssh-clients openssh-server
这里解释一下, 一台机器既可以是客户机也可以是服务器, 并且这两个角色是可以共存的. openssh-clients 的功能类似于 XShell, 可以作为一个客户端连接上 openssh-server.openssh-server 的功能主要是作为一个服务 (守护进程) 运行在后台, 如果这个服务开启了, 我们就可以用一些远程连接工具来连接 CentOS. 由于我是用了 Centos6.4 的 mimimal 版本, 该版本已经安装了 openssh-server, 但是却没有安装 openssh-clients, 所以我只需要安装 openssh-clients 即可, 而具体安装情况请根据自己的系统决定.
第二步: 生成密钥, 命令如下.
1 SSH-keygen -t rsa -P '' -f -/.SSH/id_rsa
SSH-keygen 是用来生产密钥的工具.-t: 指定生成密钥的类型(rsa,dsa,ecdsa 等);-P: 指定 passphrase, 用于确保私钥的安全;-f: 指定存放密钥的文件(公钥和私钥默认放在相同目录下面, 区别是, 公钥的文件名有后缀. pub)
第三步: 创建用于保存公钥的文件 authorized_keys, 并且把本机公钥添加到此文件, 命令如下.
1 cat ~/.SSH/id_rsa.pub>> ~./SSH/authorized_keys
第四步: 对 authorized_keys 文件进行授权操作, 命令如下.
1 chmod 0600 ~/.SSH/authorized_keys
由于每个人使用系统的不同, 文件默认的授权也是不相同的, 如果不确定的话, 可以执行上诉命令, 对文件进行授权.
第五步: 登录, 命令如下.
1 SSH host
5. 总结和感言
emmm,SSH 免密登录的使用还是挺常见的, 也挺简单的. 我觉得吧, 凡事不能知其然而不知其所以然, 这是我写这篇博客的目的. 同时我也希望读者能够通过这篇博客对 SSH 以及免密登录能有更好的了解.
这篇博客由于工作的原因, 前前后后写了个把星期, 真的很不容易, 虽然文中的原理很多是通过学习大佬的文章才会的, 但是这篇博客中的每个字我都可以负责任的说是我自己一个一个敲的, 所有的图都是我自己用 processOn 画的, 如果你有什么问题, 可以在博客下留言, 我有时间会回复的.
最后祝大家工作, 学习越来越顺利.
来源: https://www.cnblogs.com/haojun/p/11131432.html